日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

​数据分析最重要的 3 种特征编码,你真的能分清楚?

發(fā)布時(shí)間:2024/9/15 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ​数据分析最重要的 3 种特征编码,你真的能分清楚? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

對(duì)于數(shù)據(jù)處理的新手來說,你可能聽說過:標(biāo)簽編碼、特征編碼、獨(dú)熱編碼?等類似的概念

但是在用的時(shí)候卻不知道什么時(shí)候用哪個(gè),徹底混為一談

歸根結(jié)底,還是對(duì)概念混淆了,或者你當(dāng)時(shí)看的帖子就是錯(cuò)的,被誤導(dǎo)了。

其實(shí)這樣的錯(cuò)誤帖子很多,csdn、博客園,一抓一大把,被誤導(dǎo)也很正常

誤導(dǎo)了沒關(guān)系,忘掉錯(cuò)誤的,從頭開始就行

ok,let's go

首先

需要明確一點(diǎn),在大多數(shù)模型算法中,對(duì)于數(shù)值型數(shù)據(jù),可以直接拿來訓(xùn)練模型。

但是對(duì)于類別型特征,算法不能把字符數(shù)據(jù)像數(shù)值數(shù)據(jù)一樣構(gòu)成數(shù)組矩陣,所以模型會(huì)直接報(bào)錯(cuò)。

這種情況的處理也很容易,使用下面幾種方法進(jìn)行簡(jiǎn)單的特征轉(zhuǎn)換即可。

這么說你可能不是很理解,舉個(gè)例子:

現(xiàn)在有一個(gè)用戶數(shù)據(jù)集,其中用戶字段包括:身高、學(xué)歷、性別、婚姻狀態(tài)、等級(jí)、收入等,預(yù)通過這些用戶字段 去預(yù)測(cè)該用戶是否會(huì)發(fā)生逾期行為

用戶字段里面除了身高和收入,其他都是類別型特征,如下:

一般情況下,我們是這樣轉(zhuǎn)換的:

  • 是否逾期: 轉(zhuǎn)換為 1、 轉(zhuǎn)換為 0

  • 性別特征: 轉(zhuǎn)換為 1、 轉(zhuǎn)換為 0

  • ....

所以,在 sklearn 中,提供了下面幾種方法用來實(shí)現(xiàn)這樣的轉(zhuǎn)換:

?第一種:LabelEncoder

LabelEncoder 能夠?qū)⒎诸愄卣鬓D(zhuǎn)換為分類數(shù)值,使用起來也很簡(jiǎn)單

直接看代碼:

from?sklearn.preprocessing?import?LabelEncoder #?讀入數(shù)據(jù) df_data?=?pd.read_csv("數(shù)據(jù).csv",?encoding='gbk') df_data_2?=?df_data.copy()#?特征轉(zhuǎn)換 le?=?LabelEncoder() df_data_2['是否逾期_fit']?=?le.fit_transform(df_data['是否逾期']) df_data_2['性別_fit']?=?le.fit_transform(df_data['性別'])

文中的代碼用到了 fit_transform 函數(shù),不清楚用法的點(diǎn)這篇,講的很透徹了:做數(shù)據(jù)處理,你連 fit、transform、fit_transform 都分不清?

轉(zhuǎn)換后的效果如下:

可以看到,此種方法只能一次轉(zhuǎn)換一個(gè)特征,這個(gè)比較 適合于標(biāo)簽列 進(jìn)行特征轉(zhuǎn)換

像上面的需要轉(zhuǎn)換的特征比較多的情況,可以用第二種方法


?第二種:OrdinalEncoder

OrdinalEncoder 可以實(shí)現(xiàn)同樣的功能,而且可以批量

直接看代碼:

from?sklearn.preprocessing?import?LabelEncoder,?OrdinalEncoderdf_data_3?=?df_data.copy() #?特征轉(zhuǎn)換 df_data_3['是否逾期']?=?le.fit_transform(df_data['是否逾期']) df_data_3[['學(xué)歷',?'性別',?'婚姻狀態(tài)',?'等級(jí)']]?=?OrdinalEncoder().fit_transform(df_data[['學(xué)歷',?'性別',?'婚姻狀態(tài)',?'等級(jí)']])

轉(zhuǎn)換后的效果如下:

怎么樣,是不是覺得上面這種方法轉(zhuǎn)換起來是不是更快一些?

快是快,但是,上面這種方法存在本質(zhì)上的錯(cuò)誤!

首先,我們轉(zhuǎn)換的目的是為了讓算法在訓(xùn)練模型的時(shí)候,能夠?qū)㈩悇e型特征量化,然后轉(zhuǎn)換成特征矩陣進(jìn)行計(jì)算等操作

但是,實(shí)際上,你將性別轉(zhuǎn)換為 0 和 1,對(duì)于算法來說,1 和 0 是可以進(jìn)行計(jì)算的

將學(xué)歷轉(zhuǎn)換為 1、2、3、4、5,算法會(huì)認(rèn)為 3 對(duì)應(yīng)的學(xué)歷是 1 的 3倍。

事實(shí)上,我們知道,性別男和女是不可達(dá)的,本身就互斥的概念不能通過數(shù)值算出來,學(xué)歷你總不能說 5個(gè)小學(xué)學(xué)歷=1個(gè)碩士學(xué)歷 吧?


類似的特征還有:顏色、等級(jí)、郵編 等,都不可以直接用上面的方式進(jìn)行轉(zhuǎn)換

正確的方式是這樣的:

  • 對(duì)了性別特征:用兩列表示,男性列+女性列

  • 對(duì)于婚姻狀態(tài)特征:也是兩列,已婚列+未婚列

  • ....

對(duì)應(yīng)的處理效果是這樣的:

在 sklearn 中,可以用第三種方法實(shí)現(xiàn)這樣的特征轉(zhuǎn)換


?第三種:OneHotEncoder

OneHotEncoder:獨(dú)熱編碼,可以通過創(chuàng)建啞變量的方式進(jìn)行特征轉(zhuǎn)換。

代碼如下:

from?sklearn.preprocessing?import?OneHotEncoderdf_data_4?=?df_data.copy() #?特征轉(zhuǎn)換-獨(dú)熱編碼 df_data_onehot?=?OneHotEncoder().fit_transform(df_data[['學(xué)歷',?'性別',?'婚姻狀態(tài)']]) df_data_onehot.toarray()

轉(zhuǎn)換后的效果如下:

最終是一個(gè)二維數(shù)組的形式,之后需要進(jìn)一步的將二維數(shù)組轉(zhuǎn)換為 DataFrame,然后和原始的 DataFrame 進(jìn)行合并,并且刪除原特征。

這一步有一個(gè) 更簡(jiǎn)單、高效 的方法:使用 Pandas 的 get_dummies 函數(shù)

#?獨(dú)熱編碼 df_data_dummies?=?pd.get_dummies(df_data[['性別',?'婚姻狀態(tài)',?'學(xué)歷']].head(5)) df_data_dummies

轉(zhuǎn)換后的效果是一樣的:


?小技巧

上面三種方法針對(duì)的特征轉(zhuǎn)換都是特征 1V1,或者 1V多 的場(chǎng)景。

如果是需要將 多個(gè)類別值 轉(zhuǎn)換成 1個(gè) 特征 呢?

比如在 泰坦尼克號(hào)生還者預(yù)測(cè) 里面,乘客姓名中的稱呼就可以作為乘客的 title 進(jìn)行轉(zhuǎn)換。

例如:

  • Miss、Mlle、Ms、Mme 為一個(gè)等級(jí)

  • Col、Major、Capt 為一個(gè)等級(jí)

  • Master、Don、Dona、Countess、Jonkheer 為一個(gè)等級(jí)

根據(jù)不同稱呼將乘客映射為不同的等級(jí),這種處理方式能極大的提高模型預(yù)測(cè)的正確率。

對(duì)應(yīng)的代碼可以這樣寫:

title_mapping?=?{'Mr':?1,?'Miss':?2,?'Mlle':?2,?'Ms':?2,?'Mrs':?2,?'Mme':?2,'Rev':?3,?'Dr':?3,?'Col':?4,?'Major':?4,?'Capt':?4,'Master':?5,?'Don':?5,?'Dona':?5,?'Lady':?5,?'Countess':?5,?'Jonkheer':?5,?'Sir':?5,} #?對(duì)?title?信息進(jìn)行轉(zhuǎn)換 df_data['TitleType']?=?df_data['Title'].map(title_mapping)

本文總結(jié)

今天的文章比較簡(jiǎn)單,稍微總結(jié)一下:

特征轉(zhuǎn)換一共有三種方式,分別是:LabelEncoder、OrdinalEncoder 和 OneHotEncoder

其中,第一種方式適合標(biāo)簽列,將 是/否好客戶/壞客戶 等類別標(biāo)簽進(jìn)行數(shù)值轉(zhuǎn)換

第二種方式適合特征列,將可以量化的特征,如:年齡、重量、長(zhǎng)度、溫度等特征進(jìn)行批量數(shù)值轉(zhuǎn)換

第三種方式適合特征列,將無法量化、不能用數(shù)值代表內(nèi)在含義的特征進(jìn)行獨(dú)熱編碼。

另外還介紹了如何將 多V1 的數(shù)值進(jìn)行轉(zhuǎn)換操作。

最后,本文中用到的數(shù)據(jù)集也比較簡(jiǎn)單,需要的同學(xué)可以直接下載練練手

鏈接:https://pan.baidu.com/s/14wi199hcbnrp5tvO91F5DQ??

提取碼:1025

推薦閱讀

誤執(zhí)行了rm -fr /*之后,除了跑路還能怎么辦?!

程序員必備58個(gè)網(wǎng)站匯總

大幅提高生產(chǎn)力:你需要了解的十大Jupyter Lab插件

總結(jié)

以上是生活随笔為你收集整理的​数据分析最重要的 3 种特征编码,你真的能分清楚?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。