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

如何复用Pandas get_dummies的列映射处理预测数据?

当然有办法!而且有两种常用的思路,一种是手动记录get_dummies生成的列映射,另一种是用scikit-learn的流水线工具来标准化整个流程,后者更推荐用于机器学习项目,能避免很多手动处理的坑。

方法1:手动记录并复用get_dummies的列映射

这种方法适合快速验证场景,核心是保存训练数据编码后的列结构,然后让新数据的编码结果对齐这个结构。

步骤1:训练时保存编码列信息

在对训练数据执行get_dummies后,把生成的列名保存下来(可以存在变量里,也可以序列化到文件方便后续复用):

import pandas as pd
from sklearn.linear_model import Perceptron
import pickle

# 假设你的训练数据是train_df,包含3个分类列和目标列
categorical_cols = ["cat_col1", "cat_col2", "cat_col3"]

# 对训练数据做独热编码
train_encoded = pd.get_dummies(train_df, columns=categorical_cols)
# 保存编码后的特征列名(注意排除目标列)
feature_columns = train_encoded.drop("target", axis=1).columns.tolist()

# 训练Perceptron模型
model = Perceptron()
model.fit(train_encoded.drop("target", axis=1), train_encoded["target"])

# 把列名保存到文件,方便后续加载
with open("encoded_feature_cols.pkl", "wb") as f:
    pickle.dump(feature_columns, f)

步骤2:对新数据做对齐编码

拿到未编码的新观测数据后,先执行get_dummies,再用reindex方法对齐到训练时的列结构——缺失的列补0,多余的列直接丢弃:

# 加载保存的特征列名
with open("encoded_feature_cols.pkl", "rb") as f:
    feature_columns = pickle.load(f)

# 新数据new_data,结构和训练数据的特征部分一致(不含目标列)
new_encoded = pd.get_dummies(new_data, columns=categorical_cols)
# 对齐列,缺失的补0
new_encoded_aligned = new_encoded.reindex(columns=feature_columns, fill_value=0)

# 用训练好的模型预测
prediction = model.predict(new_encoded_aligned)
方法2:用scikit-learn流水线整合编码与模型

这种方法更专业,把独热编码和模型训练/预测打包成一个流水线,不需要手动记录列映射,流水线会自动记住训练时的编码规则,适合生产环境或复杂项目。

步骤1:构建并训练流水线

用ColumnTransformer指定对分类列做独热编码,再和Perceptron模型组成流水线:

import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
from sklearn.linear_model import Perceptron
from sklearn.pipeline import Pipeline
import pickle

categorical_cols = ["cat_col1", "cat_col2", "cat_col3"]

# 定义预处理:对分类列做独热编码,其他列保持原样(如果有的话)
preprocessor = ColumnTransformer(
    transformers=[
        ("onehot", OneHotEncoder(sparse_output=False, drop="first"), categorical_cols)
    ],
    remainder="passthrough"  # 保留非分类特征列(如果存在)
)

# 构建完整流水线:预处理 + 模型
pipeline = Pipeline(steps=[
    ("preprocessor", preprocessor),
    ("classifier", Perceptron())
])

# 训练流水线(会自动完成编码和模型训练)
pipeline.fit(train_df.drop("target", axis=1), train_df["target"])

# 保存整个流水线到文件
with open("perceptron_pipeline.pkl", "wb") as f:
    pickle.dump(pipeline, f)

步骤2:用流水线直接预测新数据

加载流水线后,直接传入未编码的新数据即可,流水线会自动按照训练时的规则完成独热编码并预测:

# 加载流水线
with open("perceptron_pipeline.pkl", "rb") as f:
    pipeline = pickle.load(f)

# 直接预测,无需手动编码
prediction = pipeline.predict(new_data)

为什么推荐方法2?

  • 避免手动对齐列时的错误(比如列名拼写、顺序不一致)
  • 编码规则和模型绑定,不会出现“训练用了一套编码,预测用了另一套”的问题
  • 支持更复杂的预处理逻辑扩展(比如同时处理数值列的标准化)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:49:44