管道中的虚拟创建与列车和测试集中的不同级别

Qui*_*2k1 9 python pandas scikit-learn

我正在探索scikit学习管道.我还想用管道预处理数据.但是,我的列车和测试数据具有不同级别的分类变量.示例:考虑:

import pandas as pd
train = pd.Series(list('abbaa'))
test = pd.Series(list('abcd'))
Run Code Online (Sandbox Code Playgroud)

我用pandas写了一个TransformerMixinClass

class CreateDummies(TransformerMixin):

def transform(self, X, **transformparams):
    return pd.get_dummies(X).copy()

def fit(self, X, y=None, **fitparams):
    return self
Run Code Online (Sandbox Code Playgroud)

fit_transform产生列车数据2列和测试数据4列.所以这并不奇怪,但不适合管道

同样,我试图导入标签编码器(和OneHotEncoder用于潜在的后续步骤):

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
le = LabelEncoder()
le.fit_transform(train)
le.transform(test)
Run Code Online (Sandbox Code Playgroud)

这并不奇怪,这会产生错误.

所以这里的问题是我需要测试集中包含的一些信息.有没有一种好方法将其包含在管道中?

ayh*_*han 10

您可以按照此答案中的说明使用分类:

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
Run Code Online (Sandbox Code Playgroud)

  • 嘿,谢谢你的好答案:对于多维数据框,应该使用```train.apply(lambda x:x.astype('category', category=categories), axis=0)```。首先,我担心 union1d 函数,因为所有类别的级别都被捕获。但这不是问题。你有没有办法在这里避免申请? (2认同)