機器學習「特徵編碼」的經驗分享:魚仍是熊掌?

做者:xiaoyupython

微信公衆號:Python數據科學bash

知乎:python數據分析師微信


1. 爲何要進行特徵編碼?

咱們拿到的數據一般比較髒亂,可能會帶有各類非數字特殊符號,好比中文。下面這個表中顯示了咱們最原始的數據集。而實際上機器學習模型須要的數據是數字型的,由於只有數字類型才能進行計算。所以,對於各類特殊的特徵值,咱們都須要對其進行相應的編碼,也是量化的過程。機器學習

2. 特徵編碼類型

本篇,咱們主要說一下分類型特徵的編碼方式。對於分類型數據的編碼,咱們一般會使用兩種方式來實現,分別是:one-hot encoding 和 label-encoding。下面咱們先介紹一下這兩種編碼。函數

One-hot encoding學習

one-hot encoding也就是咱們經常聽到的獨熱編碼(啞變量)。那麼到底什麼是獨熱編碼呢?咱們來看一個例子,是二手房房價分析中所使用的數據:編碼

能夠看到,圖中的ElevatorRenovation都是定類型數據。除去缺失值,Elevator分類有電梯和無電梯兩種。Renovation分爲有精裝,簡裝,毛坯和其它四種。下面,咱們要對Elevator這個變量進行編碼,在pandas中有現成的獨熱編碼方法get_dummy,代碼以下:spa

pd.get_dummies(lianjia_df['Elevator'])
複製代碼

原來的Elevator變量被拆分爲兩個單獨的變量,這兩個變量就是原來的分類特徵值:有電梯和無電梯。而且新變量的特徵值用數字0和1來替代,表明是否或者有無的概念。好比無電梯變量的1表明是(沒有電梯),相反,0就表明否(有電梯)。所以歸納一下,獨熱編碼就是將原始特徵變量轉換成以原始特徵值分類的多維度的變量,並用是否(0,1)這種方式的新特徵值替代和量化3d

Label encodingcode

label-encoding就是用標籤進行編碼的意思,即咱們給特徵變量自定義數字標籤,量化特徵。來看一個例子:

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就是將原始特徵值編碼爲自定義的數字標籤完成量化編碼過程。

3. 兩種編碼方式的優缺點

One-hot encoding

  • 優勢:解決了分類器很差處理分類數據的問題,在必定程度上也起到了擴充特徵的做用。它的值只有0和1,不一樣的類型存儲在垂直的空間。

  • 缺點:當類別的數量不少時,特徵空間會變得很是大,容易形成維度災難。

Label encoding

  • 優勢:解決了分類編碼的問題,能夠自由定義量化數字。但其實也是缺點,由於數值自己沒有任何含義,只是排序。如大中小編碼爲123,也能夠編碼爲321,即數值沒有意義。

  • 缺點:可解釋性比較差。好比有[dog,cat,dog,mouse,cat],咱們把其轉換爲[1,2,1,3,2],這裏就產生了一個奇怪的現象:dog和mouse的平均值是cat。所以,Label encoding編碼其實並無很寬的應用場景。

4. 兩種編碼該如何區分和使用?

明白這兩種編碼方式並不難,難的是如何區分和使用。好多朋友面對數據,會產生困惑,不知該使用哪一種編碼方式最爲合適。對於這個問題,有如下幾點須要考量:

  • 特徵的數據類型

  • 所要使用的模型

事先聲明:編碼方式沒有固定的方式,具體問題還需具體分析。對模型結果有利的編碼纔是最正確的。因此,實際中若是分不清哪一種更好的時候,可能須要將兩種都嘗試進行對比。

下面分享一下本身淺顯的經驗(通常狀況下的使用):

特徵數據類型

  • 對於定類類型的數據,建議使用one-hot encoding。定類類型就是純分類,不排序,沒有邏輯關係。好比性別分男和女,男女不存在任何邏輯關係,咱們不能說男就比女好,或者相反。再者,中國各省市分類也能夠用獨熱編碼,一樣各省不存在邏輯關係,這時候使用one-hot encoding會合適些。但注意,通常會捨去一個變量,好比男的對立面確定是女,那麼女就是重複信息,因此保留其中一個變量便可。

  • 對於定序類型的數據,建議使用label encoding。定序類型也是分類,但有排序邏輯關係,等級上高於定類。好比,學歷分小學,初中,高中,本科,研究生,各個類別之間存在必定的邏輯,顯然研究生學歷是最高的,小學最低。這時候使用Label encoding會顯得更合適,由於自定義的數字順序能夠不破壞原有邏輯,並與這個邏輯相對應。

所使用的模型

  • 對數值大小敏感的模型必須使用one-hotencoding。典型的例子就是LR和SVM。兩者的損失函數對數值大小是敏感的,而且變量間的數值大小是有比較意義的。而Label encoding的數字編碼沒有數值大小的含義,只是一種排序,所以對於這些模型都使用one-hot encoding。

  • 對數值大小不敏感的模型(如樹模型)不建議使用one-hotencoding。通常這類模型爲樹模型。若是分類類別特別多,那麼one-hot encoding會分裂出不少特徵變量。這時候,若是咱們限制了樹模型的深度而不能向下分裂的話,一些特徵變量可能就由於模型沒法繼續分裂而被捨棄損失掉了。所以,此種狀況下能夠考慮使用Label encoding。

以上兩點考量須要綜合考慮,而非單獨判斷。也就是說須要結合數據類型和模型的狀況來具體選擇編碼方式。

5. 總結

以上是博主對於兩種編碼方式的一些理解,若是有什麼不對或者須要補充的地方,請你們指正。而對於連續型的變量,若是須要編碼首先須要進行離散化(分箱),而後再使用上述編碼方式編碼。數據離散化的內容咱們後續進行介紹。

關注微信公衆號:Python數據科學,發現更多精彩內容。

相關文章
相關標籤/搜索