数据分析最重要的 3 种特征编码,你真的能分清楚?
對于數據處理的新手來說,你可能聽說過:標簽編碼、特征編碼、獨熱編碼?等類似的概念
但是在用的時候卻不知道什么時候用哪個,徹底混為一談
歸根結底,還是對概念混淆了,或者你當時看的帖子就是錯的,被誤導了。
其實這樣的錯誤帖子很多,csdn、博客園,一抓一大把,被誤導也很正常
誤導了沒關系,忘掉錯誤的,從頭開始就行
ok,let's go
首先
需要明確一點,在大多數模型算法中,對于數值型數據,可以直接拿來訓練模型。
但是對于類別型特征,算法不能把字符數據像數值數據一樣構成數組矩陣,所以模型會直接報錯。
這種情況的處理也很容易,使用下面幾種方法進行簡單的特征轉換即可。
這么說你可能不是很理解,舉個例子:
現在有一個用戶數據集,其中用戶字段包括:身高、學歷、性別、婚姻狀態、等級、收入等,預通過這些用戶字段 去預測該用戶是否會發生逾期行為
用戶字段里面除了身高和收入,其他都是類別型特征,如下:
一般情況下,我們是這樣轉換的:
是否逾期:是 轉換為 1、否 轉換為 0
性別特征:男 轉換為 1、女 轉換為 0
....
所以,在 sklearn 中,提供了下面幾種方法用來實現這樣的轉換:
?第一種:LabelEncoder
LabelEncoder 能夠將分類特征轉換為分類數值,使用起來也很簡單
直接看代碼:
from?sklearn.preprocessing?import?LabelEncoder #?讀入數據 df_data?=?pd.read_csv("數據.csv",?encoding='gbk') df_data_2?=?df_data.copy()#?特征轉換 le?=?LabelEncoder() df_data_2['是否逾期_fit']?=?le.fit_transform(df_data['是否逾期']) df_data_2['性別_fit']?=?le.fit_transform(df_data['性別'])文中的代碼用到了 fit_transform 函數,不清楚用法的點這篇,講的很透徹了:做數據處理,你連 fit、transform、fit_transform 都分不清?
轉換后的效果如下:
可以看到,此種方法只能一次轉換一個特征,這個比較 適合于標簽列 進行特征轉換
像上面的需要轉換的特征比較多的情況,可以用第二種方法
?第二種:OrdinalEncoder
OrdinalEncoder 可以實現同樣的功能,而且可以批量
直接看代碼:
from?sklearn.preprocessing?import?LabelEncoder,?OrdinalEncoderdf_data_3?=?df_data.copy() #?特征轉換 df_data_3['是否逾期']?=?le.fit_transform(df_data['是否逾期']) df_data_3[['學歷',?'性別',?'婚姻狀態',?'等級']]?=?OrdinalEncoder().fit_transform(df_data[['學歷',?'性別',?'婚姻狀態',?'等級']])轉換后的效果如下:
怎么樣,是不是覺得上面這種方法轉換起來是不是更快一些?
快是快,但是,上面這種方法存在本質上的錯誤!
首先,我們轉換的目的是為了讓算法在訓練模型的時候,能夠將類別型特征量化,然后轉換成特征矩陣進行計算等操作
但是,實際上,你將性別轉換為 0 和 1,對于算法來說,1 和 0 是可以進行計算的
將學歷轉換為 1、2、3、4、5,算法會認為 3 對應的學歷是 1 的 3倍。
事實上,我們知道,性別男和女是不可達的,本身就互斥的概念不能通過數值算出來,學歷你總不能說 5個小學學歷=1個碩士學歷 吧?
類似的特征還有:顏色、等級、郵編 等,都不可以直接用上面的方式進行轉換
正確的方式是這樣的:
對了性別特征:用兩列表示,男性列+女性列
對于婚姻狀態特征:也是兩列,已婚列+未婚列
....
對應的處理效果是這樣的:
在 sklearn 中,可以用第三種方法實現這樣的特征轉換
?第三種:OneHotEncoder
OneHotEncoder:獨熱編碼,可以通過創建啞變量的方式進行特征轉換。
代碼如下:
from?sklearn.preprocessing?import?OneHotEncoderdf_data_4?=?df_data.copy() #?特征轉換-獨熱編碼 df_data_onehot?=?OneHotEncoder().fit_transform(df_data[['學歷',?'性別',?'婚姻狀態']]) df_data_onehot.toarray()轉換后的效果如下:
最終是一個二維數組的形式,之后需要進一步的將二維數組轉換為 DataFrame,然后和原始的 DataFrame 進行合并,并且刪除原特征。
這一步有一個 更簡單、高效 的方法:使用 Pandas 的 get_dummies 函數
#?獨熱編碼 df_data_dummies?=?pd.get_dummies(df_data[['性別',?'婚姻狀態',?'學歷']].head(5)) df_data_dummies轉換后的效果是一樣的:
?小技巧
上面三種方法針對的特征轉換都是特征 1V1,或者 1V多 的場景。
如果是需要將 多個類別值 轉換成 1個 特征 呢?
比如在 泰坦尼克號生還者預測 里面,乘客姓名中的稱呼就可以作為乘客的 title 進行轉換。
例如:
Miss、Mlle、Ms、Mme 為一個等級
Col、Major、Capt 為一個等級
Master、Don、Dona、Countess、Jonkheer 為一個等級
根據不同稱呼將乘客映射為不同的等級,這種處理方式能極大的提高模型預測的正確率。
對應的代碼可以這樣寫:
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,} #?對?title?信息進行轉換 df_data['TitleType']?=?df_data['Title'].map(title_mapping)本文總結
今天的文章比較簡單,稍微總結一下:
特征轉換一共有三種方式,分別是:LabelEncoder、OrdinalEncoder 和 OneHotEncoder
其中,第一種方式適合標簽列,將 是/否、好客戶/壞客戶 等類別標簽進行數值轉換
第二種方式適合特征列,將可以量化的特征,如:年齡、重量、長度、溫度等特征進行批量數值轉換
第三種方式適合特征列,將無法量化、不能用數值代表內在含義的特征進行獨熱編碼。
另外還介紹了如何將 多V1 的數值進行轉換操作。
最后,本文中用到的數據集也比較簡單,需要的同學可以直接下載練練手
鏈接:https://pan.baidu.com/s/14wi199hcbnrp5tvO91F5DQ??
提取碼:1025
推薦閱讀
誤執行了rm -fr /*之后,除了跑路還能怎么辦?!
程序員必備58個網站匯總
大幅提高生產力:你需要了解的十大Jupyter Lab插件
總結
以上是生活随笔為你收集整理的数据分析最重要的 3 种特征编码,你真的能分清楚?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里员工发帖吐槽人不如驴:你不能一边抽我
- 下一篇: 下载kaggle数据集的小妙招