Pipeline预测时输入X与拟合阶段形状不符,求解决方案
解决你的PreProcessing类中BinaryEncoder相关问题
嘿,我来帮你梳理下代码里的问题,一步步给你修正:
1. 先搞定age_band的语法错误
你写的age_band赋值方式不符合Python语法,得改成合法的写法。如果是要把年龄按10岁分档到0-9,其实用整除就能简化,不用写一堆if-else:
# 直接用整除,自动把10以内归为0,10-19归为1...80-89归为8,90及以上归为9 df['age_band'] = df['age'] // 10 # 怕有超过90的情况,可以手动限制最大值为9 df['age_band'] = df['age_band'].clip(upper=9)
2. 必须补全fit方法(符合sklearn规范)
你继承了BaseEstimator和TransformerMixin,就必须实现fit方法,而且要遵循sklearn的API规则——fit方法要返回self,这样才能支持链式调用,更重要的是:绝对不能在transform里fit编码器! 这会导致数据泄露(用测试集数据拟合编码器是大忌)。
3. 废弃的as_matrix()要替换
pandas的as_matrix()早就被弃用了,换成to_numpy()才是正确的写法。
修正后的完整代码
import category_encoders as ce from sklearn.base import BaseEstimator, TransformerMixin class PreProcessing(BaseEstimator, TransformerMixin): def __init__(self): pass def fit(self, df, y=None): # 把编码器的拟合放到fit方法里,只在训练数据上执行一次 # 这里替换成你实际要编码的列名列表 self.selected_cols = ['your_category_col1', 'your_category_col2'] self.encoder = ce.BinaryEncoder(cols=self.selected_cols) self.encoder.fit(df) return self def transform(self, df): # 先复制数据,避免修改原始输入 processed_df = df.copy() # 处理age分档 processed_df['age_band'] = processed_df['age'] // 10 processed_df['age_band'] = processed_df['age_band'].clip(upper=9) # 其他特征工程操作... # 用已经fit好的编码器转换数据 processed_df = self.encoder.transform(processed_df) # 返回numpy数组 return processed_df.to_numpy()
额外提醒
- 处理数据时一定要用
df.copy(),不然会不小心修改原始数据集,这是sklearn转换器的最佳实践 - 如果你的
selected_cols是要根据输入数据动态确定的,可以把逻辑放到fit方法里,比如自动筛选类别型列 - 要是遇到category_encoders的版本问题,直接升级就行:
pip install --upgrade category_encoders
内容的提问来源于stack exchange,提问作者rednight
相关产品推荐
相关产品推荐

