以下示例脚本输出预测值和预测概率:
from sklearn import datasets, linear_model
from sklearn.model_selection import cross_val_predict
diabetes = datasets.load_diabetes()
X = diabetes.data
y = diabetes.target
lg = linear_model.LogisticRegression(random_state=0, solver='lbfgs')
y_prob = cross_val_predict(lg, X, y, cv=4, method='predict_proba')
y_pred = cross_val_predict(lg, X, y, cv=4)
y_prob[0:5]
y_pred[0:5]
我尝试了以下操作,但没有成功:
test = cross_val_predict(lg, X, y, cv=4, method=['predict','predict_proba'])
问题:是否有一种方法可以一步一步获取预测值和概率,而无需两次进行交叉验证?另外,我必须确保值和概率对应于相同的输入数据。
答案 0 :(得分:1)
y_pred
的值可以从y_prob
导出:
# The probabilities as in the original code sample
y_prob = cross_val_predict(lg, X, y, cv=4, method='predict_proba')
import numpy as np
# Get a list of classes that matches the columns of `y_prob`
y_sorted = np.unique(y)
# Use the highest probability for predicting the label
indices = np.argmax(y_prob, axis=1)
# Get the label for each sample
y_pred = y_sorted[indices]
现在,在所有情况下,y_pred
中的cross_val_predict
都可能与y_pred
不匹配。当存在多个具有相同最高概率的类时(例如您的示例代码),就会发生这种情况。例如,对于第一个样本,所有类别的预测概率为零。无论如何,在我看来,逻辑回归(实际上是分类)并不适合糖尿病数据集。
有关y_sorted
的基本原理,请参见cross_val_predict
文档:
方法:字符串,可选,默认值:“预测”
调用传递的估计量的传递的方法名称。对于method ='predict_proba',列对应于已排序的类。