pandas如何将分类模型预测结果写回原始DataFrame
分类模型预测结果写回原始train/test DataFrame实现方法
核心原则
只要保证预测时输入模型的样本顺序和你要写回的DataFrame行顺序、索引完全对齐,不需要做复杂的表关联,直接赋值新列是最简单、出错概率最低的实现方式。
- 如果你是用
train_test_split直接从原始DataFrame拆分出训练集、测试集,拆分后没有做删行、乱序、重置索引的操作,直接赋值不会出现错位问题 - 如果预处理阶段做过样本过滤、重排,必须先绑定原表索引再映射,不能直接按顺序拼接
常规场景代码实现
假设你已经完成模型选型,最优分类模型实例名为best_clf,训练集、测试集DataFrame分别为train、test,模型训练用的特征列存在feature_cols列表里:
# 写回训练集预测结果 # 1. 硬分类预测标签 train["pred_label"] = best_clf.predict(train[feature_cols]) # 2. 预测概率(二分类示例,输出正类概率;多分类可按需取对应类别概率列) train["pred_prob_pos"] = best_clf.predict_proba(train[feature_cols])[:, 1] # 写回测试集预测结果 test["pred_label"] = best_clf.predict(test[feature_cols]) test["pred_prob_pos"] = best_clf.predict_proba(test[feature_cols])[:, 1]
如果是刚做数据拆分的阶段,拆分时建议固定随机种子保证结果可复现,参考逻辑:
from sklearn.model_selection import train_test_split # 原始全量数据为df,按8:2拆分训练测试集 train, test = train_test_split(df, test_size=0.2, random_state=42)
索引错位场景适配
如果预测前你对数据集做过空值过滤、异常样本剔除,导致参与预测的样本是原表的子集,不要直接赋值,按原索引映射回表:
# 示例:过滤测试集中特征为空的样本做预测,保留原表索引 test_for_pred = test.dropna(subset=feature_cols).reset_index() # 原索引会存在"index"列 # 执行预测 pred_labels = best_clf.predict(test_for_pred[feature_cols]) # 把预测结果和原表索引绑定为Series pred_series = pd.Series(pred_labels, index=test_for_pred["index"], name="pred_label") # 映射回原始test表,被过滤的无有效特征的样本预测值自动留空 test["pred_label"] = pred_series
如果是交叉验证生成的训练集OOF(折外)预测结果,同样按每折拆分时的样本索引对应赋值,不要按预测结果的输出顺序直接拼接。
结果校验必做步骤
写回后必须做校验,避免索引错位导致后续分析、结果输出全错
- 计数校验:训练集预测列的非空值数量,应该等于参与训练集预测的样本总数;测试集同理
- 抽样校验:随机抽3-5行样本,手动把该行特征输入模型做预测,和写回的预测值比对,确认一致
- 若数据集有唯一样本ID(如sample_id、user_id),可把预测结果和ID绑定后做一次匹配合并,确认匹配率100%
内容的提问来源于stack exchange,提问作者Alan Paul
相关产品推荐
相关产品推荐

