劃分數據集之前one-hot,還是劃分之後one-hot

在處理類別型特徵時,有時需要進行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.]])

 

參考

https://stackoverflow.com/questions/55525195/do-i-have-to-do-one-hot-encoding-separately-for-train-and-test-dataset

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章