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
相关产品推荐
相关产品推荐

