在處理類別型特徵時,有時需要進行one-hot
在進行模型訓練時,需要把數據劃分train和test,類別型數據是在劃分之前one-hot,還是劃分之後?
在劃分之前做one-hot
整體one-hot,train和test 不會出現某個值無法編碼的問題。
train和test的維度都是一致的,可以做訓練和測試。
但,如果給你一份新的數據集,在類別型數據裏出現了新的值,該怎麼表示?
劃分之後做one-hot
這樣會遇到兩個問題
- 某個值,train中出現,test未出現,怎麼處理?
- 某個值,train中未出現,test中出現,怎麼處理?
在此之前,我也是對數據整體做one-hot的處理的,但這是不正確。正確的做法:
import pandas as pd
from sklearn.preprocessing import OneHotEncoder
### Correct
train = pd.DataFrame(['A', 'B', 'A', 'C'])
test = pd.DataFrame(['B', 'A', 'D'])
enc = OneHotEncoder(handle_unknown = 'ignore')
enc.fit(train)
enc.transform(train).toarray()
#array([[1., 0., 0.],
# [0., 1., 0.],
# [1., 0., 0.],
# [0., 0., 1.]])
enc.transform(test).toarray()
#array([[0., 1., 0.],
# [1., 0., 0.],
# [0., 0., 0.]])
### Incorrect
full = pd.concat((train, test))
enc = OneHotEncoder(handle_unknown = 'ignore')
enc.fit(full)
enc.transform(train).toarray()
#array([[1., 0., 0., 0.],
# [0., 1., 0., 0.],
# [1., 0., 0., 0.],
# [0., 0., 1., 0.]])
enc.transform(test).toarray()
#array([[0., 1., 0., 0.],
# [1., 0., 0., 0.],
# [0., 0., 0., 1.]])
參考