You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:57:10