如何复用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
相关产品推荐
相关产品推荐

