You need to enable JavaScript to run this app. 将log_reg.predict_proba结果与X_test合并后出现NaN的问题排查
优惠活动
大模型
产品
解决方案
定价
更多

将log_reg.predict_proba结果与X_test合并后出现NaN的问题排查

列对应关系验证

你对predict_proba输出列的理解完全正确。
scikit-learn分类器的predict_proba输出有固定规则:输出矩阵的列顺序,严格与分类器classes_属性的取值顺序一一对应。
你的模型log_reg.classes_返回array([0,1]),因此对应关系为:

  • 数组左列对应类别0,即目标变量代表的late类别概率
  • 数组右列对应类别1,即目标变量代表的ahead类别概率
    你对两列的命名逻辑不存在错误。
合并出现大量NaN的成因

问题完全来自pandas使用逻辑的疏漏,核心有两点:

  • reset_index()方法默认不修改原数据框,只会返回重置索引后的新对象。你之前写的proba.reset_index(drop=True)、test_with_proba.reset_index(drop=True)没有将返回值赋值给对应变量,等于没有执行实际的索引重置操作。最终状态下:
    • 生成的概率数据框proba,索引为从0开始的连续整数序列
    • X_test是从原数据集拆分得到的,保留了原数据集的行索引(即示例输出里看到的367、219、72这类非连续的原始行号)
  • pandas给数据框新增列时,是按索引标签匹配赋值,不是按行的物理位置匹配。赋值时只有当X_test的某行索引值与proba的索引值完全相等,才会填入对应的概率值;其余索引不匹配的位置,因找不到对应取值会填充为NaN。你看到的有值的行,刚好是X_test里索引值与proba连续索引重合的少数行,其余位置全部为空。
    另外test_with_proba=X_test属于浅引用操作,后续对test_with_proba的修改会直接改动原始的X_test数据,本身也是不规范写法。
修正方案

替换你之前的合并逻辑即可解决问题:

# 重置索引并赋值给对应变量,同时做深拷贝避免引用污染
proba = proba.reset_index(drop=True)
test_with_proba = X_test.reset_index(drop=True).copy()

# 索引完全对齐后再赋值,不会出现NaN
test_with_proba['probability_late'] = proba['probability_late']
test_with_proba['probability_ahead'] = proba['probability_ahead']

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.08 08:36:03