我试图学习如何使用管道和ColumnTransformer在回归之前有效地预处理数据。 以下是我的尝试:
def preprocess_data(X):
cat_var = X.select_dtypes(['bool','object']).columns
num_var = X.select_dtypes(['int64','float64']).columns
steps = [('c', Pipeline(steps=[('s',SimpleImputer(strategy='most_frequent')),
('oe',OneHotEncoder(handle_unknown='ignore'))]), cat_var),
('n', SimpleImputer(strategy='median'), num_var)]
transformer = ColumnTransformer(transformers=steps, remainder='passthrough')
X = transformer.fit_transform(X=X)
return X
问题是,当我转换列车和测试数据集时,它会为测试数据集选择不同数量(更少)的列。这意味着我训练的模型无法处理测试数据
我已经很好地修改了代码,没有数据泄漏或相关问题
这可能是什么原因?我的逻辑有错误吗
我正在使用以下dataset
谢谢
解决方案: 返回转换器以及预处理的数据
return X, transformer
然后使用transformer对象在预测之前转换测试数据
您不能将此函数用于训练和测试集,因为这样您将两次拟合_变换。您需要使用训练数据拟合转换器,但只需转换测试数据。我建议为此使用sklearn管道,它会自动执行此过程,例如:
)
若测试中的一个分类列在列中并没有类别,那个么您将得到更少的列。下面可以看到使用onehot转换的每个变量的分类级别数:
您需要使用相同定义的类别对测试集变量进行分类,请参见the examples here
相关问题 更多 >
编程相关推荐