1.什么是One_Hot?
對於這個問題,之前谷歌了一下,還涉及寄存器了(one-hot編碼是N位狀態寄存器為N個狀態進行編碼的方式)。。真的無語。這里不說那些很底層的,我們只需要了解one-hot編碼是將類別變量轉換為機器學習算法中容易處理的一種形式!
概念太抽象了,對太抽了,那么從實際例子來說明。
如下我們有兩個特征:
我們看到有兩個特證名為:animal與food,解釋一下兩列值意思,第一列代表的是動物的名字,第二列是食物的個數,比如第一行cat 2 描述為貓吃了兩個食物,這里是測試數據,主要是想通過,這些數據給予直觀的認識及實際操作。
而對上述數據做one-hot編碼后得結果為:
animal列數據類型是字符串,而第二列是數值型,如果我們能將這些特征值用0/1表示,是不是在機器學習中,對這些非連續值非常有幫助。
綜上,我們推論出,如果你在處理的數據中,通過特征工程這一步操作,能夠將特征的類型判別出來,哪些是連續的,哪些是非連續的,那么我們就可以對它進行特殊處理,比如此處的one-hot編碼!
對於定義我們有了基礎的了解之后,下面我們來深入了解一下為什么one-hot編碼可以用來處理非連續(離散)特征?
2.One_Hot編碼處理離散特征
在使用one-hot編碼中,我們可以將離散特征的取值擴展到歐式空間,在機器學習中,我們的研究范圍就是在歐式空間中,首先這一步,保證了能夠適用於機器學習中;而;另外了對於one-hot處理的離散的特征的某個取值也就對應了歐式空間的某個點!
那么對於上面這句話,你會有很多疑問,比如:為何one-hot編碼能將離散特征映射到歐式空間?
原因是,在統計機器學習算法中的回歸,分類這些問題中,特征之間距離的計算或相似度計算非常重要,比如大家常用的k-means,而我們常用的這些計算都在歐式空間中進行相似度計算。換句話說,就是我上面說的研究范圍在歐式空間,保證了one-hot編碼的成立!
3.One_Hot編碼實現
還是以上述animal為例:
【數據展示】
import pandas as pd data = { 'animal':['cat','dog','cat','lion'], 'food':[2,3,5,3], } data_learn = pd.DataFrame(data) data_learn
【完整特征編碼】
dummies = pd.get_dummies(data_learn,columns=data_learn.columns) dummies
【特定特征編碼】
dummies = pd.get_dummies(data_learn['animal']) dummies = dummies.add_prefix("{}_".format('animal')) data_learn.drop('animal',axis=1,inplace=True) data_learn = data_learn.join(dummies) data_learn
對於這里的特定特征編碼,我這里只選取了一個特定特征,你也可以選擇多個,通過列表存儲,遍歷操作,即可實現!