做者:xiaoyupython
微信公衆號:Python數據科學微信
知乎:python數據分析師機器學習
咱們拿到的數據一般比較髒亂,可能會帶有各類非數字特殊符號,好比中文。下面這個表中顯示了咱們最原始的數據集。而實際上機器學習模型須要的數據是數字型的,由於只有數字類型才能進行計算。所以,對於各類特殊的特徵值,咱們都須要對其進行相應的編碼,也是量化的過程。函數
本篇,咱們主要說一下分類型特徵的編碼方式。對於分類型數據的編碼,咱們一般會使用兩種方式來實現,分別是:one-hot encoding 和 label-encoding。下面咱們先介紹一下這兩種編碼。學習
One-hot encoding
one-hot encoding
也就是咱們經常聽到的獨熱編碼(啞變量)。那麼到底什麼是獨熱編碼呢?咱們來看一個例子,是二手房房價分析中所使用的數據:編碼
能夠看到,圖中的Elevator
和Renovation
都是定類型數據。除去缺失值,Elevator
分類有電梯和無電梯兩種。Renovation
分爲有精裝,簡裝,毛坯和其它四種。下面,咱們要對Elevator這個變量進行編碼,在pandas
中有現成的獨熱編碼方法get_dummy
,代碼以下:spa
pd.get_dummies(lianjia_df['Elevator'])
原來的Elevator
變量被拆分爲兩個單獨的變量,這兩個變量就是原來的分類特徵值:有電梯和無電梯。而且新變量的特徵值用數字0和1來替代,表明是否或者有無的概念。好比無電梯變量的1表明是(沒有電梯),相反,0就表明否(有電梯)。所以歸納一下,獨熱編碼就是將原始特徵變量轉換成以原始特徵值分類的多維度的變量,並用是否(0,1)這種方式的新特徵值替代和量化。code
Label encoding
label-encoding就是用標籤進行編碼的意思,即咱們給特徵變量自定義數字標籤,量化特徵。來看一個例子:blog
Class=['大一','大二','大三','大四'] df = pd.DataFrame({'Class':Class}) df
Class
特徵是定序數據類型,也是分類類型,但比定類更高級,由於有排序。Label encoding
就是對特徵值進行自定義式的標籤編碼。好比將大一變爲1,大二變爲2,大三爲3,大四爲4。那麼通過編碼後,特徵值將變爲如下的樣子:排序
classMap = {'大一':1,'大二':2,'大三':3,'大四':4} df['Class'] = df['Class'].map(classMap) df
上面就將Class特徵進行相應的編碼。其實,Label encoding
並無任何限制,你也能夠將Class定義爲10,20,30,40
,只不過1,2,3,4
看起來比較方便。所以總結歸納,Label encoding就是將原始特徵值編碼爲自定義的數字標籤完成量化編碼過程。
One-hot encoding
Label encoding
123
,也能夠編碼爲321
,即數值沒有意義。[dog,cat,dog,mouse,cat]
,咱們把其轉換爲[1,2,1,3,2]
,這裏就產生了一個奇怪的現象:dog和mouse的平均值是cat。所以,Label encoding編碼其實並無很寬的應用場景。明白這兩種編碼方式並不難,難的是如何區分和使用。好多朋友面對數據,會產生困惑,不知該使用哪一種編碼方式最爲合適。對於這個問題,有如下幾點須要考量:
事先聲明:編碼方式沒有固定的方式,具體問題還需具體分析。對模型結果有利的編碼纔是最正確的。因此,實際中若是分不清哪一種更好的時候,可能須要將兩種都嘗試進行對比。
下面分享一下本身淺顯的經驗(通常狀況下的使用):
以上兩點考量須要綜合考慮,而非單獨判斷。也就是說須要結合數據類型和模型的狀況來具體選擇編碼方式。
以上是博主對於兩種編碼方式的一些理解,若是有什麼不對或者須要補充的地方,請你們指正。而對於連續型的變量,若是須要編碼首先須要進行離散化(分箱),而後再使用上述編碼方式編碼。數據離散化的內容咱們後續進行介紹。
關注微信公衆號:Python數據科學,發現更多精彩內容。