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

Ordinal Encoding恒输出0导致预测结果一致的问题求助

解决分类列编码后全为0的问题

核心原因

部署时使用的编码器没有复用训练阶段拟合的类别映射规则,而是对用户输入的单条数据重新拟合——单条数据只有一个类别,自然编码结果全为0。

具体解决方案

1. 训练阶段保存编码器

训练时对每个分类列单独拟合编码器,并将所有编码器保存(比如用pickle),不要只保存模型。示例代码:

import pickle
from sklearn.preprocessing import OrdinalEncoder

# 假设cat_cols是所有分类列的列表
encoders = {}
for col in cat_cols:
    encoder = OrdinalEncoder()
    X_train[col] = encoder.fit_transform(X_train[[col]])
    encoders[col] = encoder  # 保存每个列的编码器

# 保存编码器到文件
with open('encoders.pkl', 'wb') as f:
    pickle.dump(encoders, f)

2. 部署阶段加载编码器并转换输入数据

在Streamlit应用中,加载训练好的编码器,用transform而不是fit_transform处理用户输入的分类列:

import pickle
import streamlit as st

# 加载编码器
with open('encoders.pkl', 'rb') as f:
    encoders = pickle.load(f)

# 获取用户输入数据(假设user_input是DataFrame格式)
for col in encoders.keys():
    # 确保输入数据的类别在训练时的编码器类别范围内,避免报错
    if user_input[col].values[0] not in encoders[col].categories_[0]:
        st.error(f"列{col}的输入值不在模型支持的范围内,请重新输入")
        st.stop()
    # 用训练好的编码器转换
    user_input[col] = encoders[col].transform(user_input[[col]])

3. 额外注意事项

  • 训练时要记录每个分类列的所有可能类别,部署时对用户输入做合法性校验,防止输入训练数据中没有出现过的类别导致编码失败。
  • 如果用LabelEncoder,逻辑完全一致:训练时保存每个列的LabelEncoder,部署时用transform转换,不要重新fit。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 18:13:24