hi各位大佬好,我是探花小明哥,之前的博文中提及的one-hot可能與常見的one-hot不太一樣,針對葉子節點中的one-hot,這個肯定是多個0,1的組合,最終的結果就是直接LabelEncoder的拼接,我失算了,我以為有啥高深的玩意,發現并沒有,
For Recommendation in Deep learning QQ Group 102948747
For Visual in deep learning QQ Group 629530787
I'm here waiting for you
不接受這個網頁的私聊/私信!!!
我之前提到過lightgbm中的確只需0~k編碼即可,無需one-hot,計算結果前者更好,而且節省時空,這是lightgbm獨有的快速處理方式,
LightGBM can use categorical features as input directly. It doesn’t need to convert to one-hot coding, and is much faster than one-hot coding (about 8x speed-up).
而對于LR則不可,必然需要(對于類別特征),而經過隨機森林及樹模型的處理得到的是新特征,即類別特征——落在每個葉子的索引,如代碼,和paper中的類似吧
>>> X_train_lr.shape
(20000, 20)
>>> X_train_lr
array([[ 1.16872922, -0.12326182, -1.5484857 , ..., 0.67940014,
0.52846206, 0.83227156],
[-1.00731753, -0.13562786, 0.6830177 , ..., -1.38317951,
-0.34762768, -0.05636781],
[ 0.1071118 , 0.12562994, -2.57552698, ..., 0.52352653,
0.22234559, 0.02766531],
...,
[ 0.65539074, -0.0093059 , -0.29745059, ..., 0.221068 ,
0.10400257, 0.7163802 ],
[ 1.74374594, 0.04608131, 0.97697367, ..., -1.74149946,
-1.90247471, -0.29741195],
[-0.52465285, -0.16638788, 0.61640846, ..., 0.41042506,
-1.32117369, 0.59130764]])
>>> rf_enc.transform(rf.apply(X_train_lr)).toarray()
array([[0., 0., 1., ..., 0., 0., 0.],
[0., 0., 1., ..., 0., 0., 0.],
[0., 0., 1., ..., 0., 0., 0.],
...,
[0., 0., 1., ..., 0., 0., 0.],
[0., 0., 1., ..., 0., 0., 0.],
[0., 0., 1., ..., 0., 0., 0.]])
>>> rf_enc.transform(rf.apply(X_train_lr)).toarray()[0]
array([0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.,
0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.,
0., 1., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 1., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0.,
1., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0.])
>>> rf_enc.transform(rf.apply(X_train_lr)).shape
(20000, 80)
分析:LabelEncoder只是對任何形式的特征做0~k編碼,而OneHotEncoder則是真正的0~1編碼,比如下面代碼得到的k只是0~k的編碼,但不知道它到底是哪個特征的編碼,這一點LR是不知道的,它可能會誤認為是一個特征的編碼,【注:一般默認每列為一個特征】OneHotEncoder可對特征進行編碼0~k,也就是說包含了LabelEncoder,而且知道最終的特征的編碼個數,這也是表示0-1的編碼的根本所在,如下注釋:
enc = OneHotEncoder(categories='auto')
arr=np.array([[0, 0, 4],
[1, 1, 0],
[0, 2, 1],
[1, 0, 2]])
enc.fit(arr,)
b=np.array([[0, 1, 4]])
ans = enc.transform(b).toarray()
print(ans)
for i in range(arr.shape[1]):
lbe=LabelEncoder()
arr[:,i]=lbe.fit_transform(arr[:,i])
k=lbe.transform(b[:,i])
print(k)
print("coding order",lbe.classes_)
print("feature number",len(lbe.classes_))
[[1. 0. 0. 1. 0. 0. 0. 0. 1.]]
[0]
coding order [0 1]
feature number 2
[1]
coding order [0 1 2]
feature number 3
[3]
coding order [0 1 2 4]
feature number 4
前者的結果與后者是統一的,只不過不知道特征個數時無法得到最終的編碼形式,知道后,第一特征0-1編碼則為[1,0],就是第0個位置為1,特征個數為2,那么是2維;第二個則為[0,1,0],即第1個位置為1,特征個數是3維;第三個則為[0,0,0,1],第3個位置為1,特征個數是4維度,
而下面的兩個編碼則需要注意,第一個是對特征內的編碼,也就是說對單個特征的編碼,當然也可多個特征,但第一次見這個的人可能會蒙圈,因為它不對整型的特征編碼,只對原始的類別特征編碼,如下,第二則是keras中one-hot,它是對單個特征的編碼,目前不知道多特征是否有類似的函式,
>>> df = pd.DataFrame({'A': ['a', 'b', 'a'], 'B': ['b', 'a', 'c'],
'C': [1, 2, 3]})
>>> df
A B C
0 a b 1
1 b a 2
2 a c 3
>>> pd.get_dummies(df)
C A_a A_b B_a B_b B_c
0 1 1 0 0 1 0
1 2 0 1 1 0 0
2 3 1 0 0 0 1
#直接輸入會默認為單個特征,然后進行0~k及one-hot編碼,因為它不知道每個特征的編碼個數
>>> pd.get_dummies([0, 1, 4])
0 1 4
0 1 0 0
1 0 1 0
2 0 0 1
>>> to_categorical([0, 1, 4])
array([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 0., 0., 1.]], dtype=float32)
>>> to_categorical([[0, 1, 4]])
array([[[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 0., 0., 1.]]], dtype=float32)
#無間隔的認為已經0~k編碼過了
這也算是一個總結吧,拜拜,
愿我們終有重逢之時,而你還記得我們曾經討論的話題,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/249788.html
標籤:其他
