数据分析最重要的 3 种特征编码,你真的能分清楚?
對(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里员工发帖吐槽人不如驴:你不能一边抽我
- 下一篇: 下载kaggle数据集的小妙招