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

训练与预测阶段采用一致Scaling和Encoding方法的解决方案咨询

解决方案:复用训练阶段的特征处理逻辑

核心问题是你当前的代码只在训练阶段完成了特征转换,但没有保存训练好的缩放器/编码器实例,导致预测时无法复用相同的转换规则。下面是具体的解决步骤:

1. 训练阶段:保存拟合后的处理器实例

修改训练代码,把用于数值特征的RobustScaler和每个类别特征的LabelEncoder都保存下来,确保转换规则和训练时完全一致:

# 处理数值特征:保存拟合好的scaler
scaler = RobustScaler()
x_df[numeric_type] = scaler.fit_transform(x_df[numeric_type])

# 处理类别特征:用字典存储每个特征的LabelEncoder实例
label_encoders = {}
for col in categorical_type:
    le = LabelEncoder()
    x_df[col] = le.fit_transform(x_df[col])
    label_encoders[col] = le  # 保存当前特征的编码器

2. 预测阶段:复用处理器做转换

针对用户输入的原始数据(比如新的预测数据集new_x_df),直接用训练时保存的处理器执行转换,绝对不要重新调用fit方法:

# 转换数值特征:使用训练好的scaler做transform
new_x_df[numeric_type] = scaler.transform(new_x_df[numeric_type])

# 转换类别特征:用对应特征的编码器做transform
for col in categorical_type:
    le = label_encoders[col]
    # 处理训练时未见过的类别(可选,根据业务需求调整)
    new_x_df[col] = new_x_df[col].apply(
        lambda x: le.transform([x])[0] if x in le.classes_ else -1
    )
    # 若能保证输入类别都在训练集中,可简化为:
    # new_x_df[col] = le.transform(new_x_df[col])

3. 长期保存处理器(可选)

如果训练完模型后需要离线预测,可以用joblib序列化保存处理器,避免每次预测都重新训练:

import joblib

# 保存到本地文件
joblib.dump(scaler, 'robust_scaler.pkl')
joblib.dump(label_encoders, 'label_encoders.pkl')

# 预测时加载
scaler = joblib.load('robust_scaler.pkl')
label_encoders = joblib.load('label_encoders.pkl')

关键注意点

  • 预测阶段必须使用transform方法,不能用fit_transform,否则会基于新数据重新拟合转换规则,导致和训练阶段逻辑不一致
  • 对于类别特征,要提前考虑训练时未出现的新类别,避免报错(示例中用-1作为默认值,你可以根据实际场景调整处理方式)

内容的提问来源于stack exchange,提问作者Khurram khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:54:43