在处理类别型特征时,有时需要进行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_