特徵工程之one-hot解讀
在很多機器學習任務中,特徵並不總是連續值,而有可能是分類值。
例如,考慮一下的三個特徵:
["male", "female"]
["from Europe", "from US", "from Asia"]
["uses Firefox", "uses Chrome", "Safari", "uses Internet Explorer"]
如果將上述特徵用數字表示,效率會高很多。例如:
["male", "from US", "uses Internet Explorer"] 表示為[0, 1, 3]
["female", "from Asia", "uses Chrome"]表示為[1, 2, 1]
但是,即使轉化為數字表示後,上述資料也不能直接用在我們的分類器中。因為,分類器往往預設資料資料是連續的,並且是有序的。但是,按照我們上述的表示,數字並不是有序的,而是隨機分配的。
為了解決上述問題,其中一種可能的解決方法是採用One-Hot Encoding.
獨熱編碼即 One-Hot 編碼,又稱一位有效編碼,其方法是使用N位狀態暫存器來對N個狀態進行編碼,每個狀態都有它獨立的暫存器位,並且在任意時候,其中只有一位有效。
例如對六個狀態進行編碼:
自然順序碼為 000,001,010,011,100,101
獨熱編碼則是 000001,000010,000100,001000,010000,100000
可以這樣理解,對於每一個特徵,如果它有m個可能值,那麼經過獨熱編碼後,就變成了m個二元特徵。並且,這些特徵互斥,每次只有一個啟用。因此,資料會變成稀疏的。
這樣做的好處主要有:
1. 解決了分類器不好處理屬性資料的問題
2. 在一定程度上也起到了擴充特徵的作用
處理離散型特徵和連續型特徵並存的情況,如何做歸一化。
連續型特徵歸一化的常用方法:
1:線性放縮到[-1,1]
x = (2x - max - min)/(max - min).
2:標準化,放縮到均值為0,方差為1:
x = (x - u)/s.
u:均值;s:標準差
離線型特徵歸一化的常用方法:
對於離散的特徵基本就是按照one-hot編碼,該離散特徵有多少取值,就用多少維來表示該特徵。
o為什麼使用one-hot編碼來處理離散型特徵
看下文解說。。.
1、為什麼做二值化處理?
使用one-hot編碼,將離散特徵的取值擴充套件到了歐式空間,離散特徵的某個取值就對應歐式空間的某個點。
2、為什麼將特徵向量嵌入到歐氏空間中?
將離散特徵通過one-hot編碼對映到歐式空間,是因為,在迴歸,分類,聚類等機器學習演算法中,特徵之間距離的計算或相似度的計算是非常重要的,而我們常用的距離或相似度的計算都是在歐式空間的相似度計算,計算餘弦相似性,基於的就是歐式空間。
3、為什麼在歐幾里得空間中嵌入特徵向量需要對分類特徵進行二值化?
將離散型特徵使用one-hot編碼,確實會讓特徵之間的距離計算更加合理。比如,有一個離散型特徵,代表工作型別,該離散型特徵,共有三個取值,不使用one-hot編碼,其表示分別是x_1 = (1), x_2 = (2), x_3 = (3)。兩個工作之間的距離是,(x_1, x_2) = 1, d(x_2, x_3) = 1, d(x_1, x_3) = 2。那麼x_1和x_3工作之間就越不相似嗎?顯然這樣的表示,計算出來的特徵的距離是不合理。那如果使用one-hot編碼,則得到x_1 = (1, 0, 0), x_2 = (0, 1, 0), x_3 = (0, 0, 1),那麼兩個工作之間的距離就都是sqrt(2).即每兩個工作之間的距離是一樣的,顯得更合理。
4、有沒有可以避免二值化的情況?
將離散型特徵進行one-hot編碼的作用,是為了讓距離計算更合理,但如果特徵是離散的,並且不用one-hot編碼就可以很合理的計算出距離,那麼就沒必要進行one-hot編碼.
有些情況不需要進行特徵的歸一化
且聽。。。
基於樹的方法是不需要進行特徵的歸一化,例如隨機森林,bagging 和 boosting等。基於引數的模型或基於距離的模型,都是要進行特徵的歸一化。
oone-hot編碼為什麼可以解決類別型資料的離散值問題
吾曰。。。
例:高、中、低不可分,→ 用0 0 0 三位編碼之後變得可分了,並且成為互相獨立的事件 。
oTree Model不太需要one-hot編碼
對於決策樹來說,one-hot的本質是增加樹的深度 。tree-model是在動態的過程中生成類似 One-Hot + Feature Crossing 的機制.
決策樹沒有特徵大小的概念的,只有特徵處於他分佈的哪一部分的概念 .
one-hot降維後的缺點
one-hot可以解決線性可分問題但是比不上label econding 。降維前可以交叉的降維後可能變得不能交叉.
o樹模型的訓練過程
從根節點到葉子節點整條路中有多少個節點相當於交叉了多少次,所以樹的模型是自行交叉 。
eg:是否是長的 { 否(是→ 柚子,否 → 蘋果) ,是 → 香蕉 } 園 cross 黃 → 形狀 (圓,長) 顏色 (黃,紅) one-hot度為4的樣本.
使用樹模型的葉子節點作為特徵集交叉結果可以減少不必要的特徵交叉的操作或者減少維度和degree候選集 .
樹模型:Ont-Hot + 高degree笛卡爾積 + lasso 要消耗更少的計算量和計算資源 。這就是為什麼樹模型之後可以stack線性模型 .
n*m的輸入樣本 → 決策樹訓練之後可以知道在哪一個葉子節點上 → 輸出葉子節點的index → 變成一個n*1的矩陣 → one-hot編碼 → 可以得到一個n*o的矩陣(o是葉子節點的個數) → 訓練一個線性模型
典型的使用: GBDT + RF
優點 : 節省做特徵交叉的時間和空間
如果只使用one-hot訓練模型,特徵之間是獨立的 。
參考:
https://www.quora.com/What-are-good-ways-to-handle-discrete-and-continuous-inputs-together
http://blog.csdn.net/dulingtingzi/article/details/51374487