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

