我目前正在探索scikit学习管道。 我还想用管道预处理数据。 但是,我的列车和测试数据具有不同级别的分类变量。 例: 考虑:
import pandas as pd
train = pd.Series(list('abbaa'))
test = pd.Series(list('abcd'))
我使用pandas
编写了一个TransformerMixinClassclass CreateDummies(TransformerMixin):
def transform(self, X, **transformparams):
return pd.get_dummies(X).copy()
def fit(self, X, y=None, **fitparams):
return self
fit_transform产生列车数据2列和测试数据4列。所以这并不奇怪,但不适合管道
同样,我尝试导入标签编码器(和OneHotEncoder进行后续步骤):
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
le = LabelEncoder()
le.fit_transform(train)
le.transform(test)
毫不奇怪地产生错误。
所以这里的问题是我需要测试集中包含的一些信息。 有没有一种好方法将其包含在管道中?
答案 0 :(得分:10)
您可以按照this answer:
中的说明使用分类categories = np.union1d(train, test)
train = train.astype('category', categories=categories)
test = test.astype('category', categories=categories)
pd.get_dummies(train)
Out:
a b c d
0 1 0 0 0
1 0 1 0 0
2 0 1 0 0
3 1 0 0 0
4 1 0 0 0
pd.get_dummies(test)
Out:
a b c d
0 1 0 0 0
1 0 1 0 0
2 0 0 1 0
3 0 0 0 1