sklearn中predict与predict_proba的区别及缺类陷阱
本文详解sklearn中predict与predict_proba的区别:前者返回预测标签,后者返回各类别概率数组。重点指出当训练集缺失某些类别时,predict_proba列数会减少,导致predict结果与最大概率索引不一致。建议使用train_test_split的stratify参数保持数据分布一致,避免此类隐蔽Bug。
predict与predict_proba的基本区别
predict_proba方法输出一个n行k列的二维数组,其中k代表分类标签的数量(通常已排序)。数组中第i行第j列的值表示模型预测第i个样本属于第j个标签的概率。需要注意的是,每一行的概率值之和必须等于1。
predict方法则直接返回预测结果,即每个样本所属的具体标签类别,而非概率分布。
具体实现效果可参考下方的代码示例。
# conding :utf-8
from sklearn.linear_model import LogisticRegression
import numpy as np
x_train = np.array([[1,2,3],
[1,3,4],
[2,1,2],
[4,5,6],
[3,5,3],
[1,7,2]])
y_train = np.array([3, 3, 3, 2, 2, 2])
x_test = np.array([[2,2,2],
[3,2,6],
[1,7,4]])
clf = LogisticRegression()
clf.fit(x_train, y_train)
# 返回预测标签
print(clf.predict(x_test))
# 返回预测属于某标签的概率
print(clf.predict_proba(x_test))
# [2 3 2]
#
# [[0.56651809 0.43348191]
# [0.15598162 0.84401838]
# [0.86852502 0.13147498]]
# 分析结果:
# 标签是 2,3 共两个,所以predict_proba返回的为2列,且是排序的(第一列为标签2,第二列为标签3),
# 返回矩阵的行数是测试样本个数 因此为3行
# 预测[2,2,2]的标签是2的概率为0.56651809,3的概率为0.43348191
#
# 预测[3,2,6]的标签是2的概率为0.15598162,3的概率为0.84401838
#
# 预测[1,7,4]的标签是2的概率为0.86852502,3的概率为0.13147498
训练集缺类导致的识别不一致陷阱
补充说明:sklearn中predict与predict_proba识别结果不一致的常见原因。
在训练决策树模型进行测试时,曾发现一个隐蔽Bug:使用predict得到的标签结果,竟然与predict_proba返回的最大概率值的索引不匹配。由于脚本逻辑需要获取模型的置信度(即类别概率),因此必须确保predict_proba能正确反映所有类别的概率分布。
经过排查发现,predict_proba输出的列数少于预期的总类别数。测试证实,这是由于训练集中部分类别的样本数量为0所致。这一现象较为隐蔽,特此记录以提醒其他开发者避开此坑。
Tip:在使用sklearn的train_test_split进行数据分割时,可以设置stratify参数,强制训练集和测试集的数据分布保持一致,从而避免因训练集缺类而导致的predict_proba列数异常问题。
以上关于sklearn中predict与predict_proba区别及缺类问题的分析即为全部内容,希望能对读者有所帮助,欢迎支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













