Cross_val_predict:一步即可获得预测值和预测概率

时间:2019-01-22 15:39:03

标签: scikit-learn prediction cross-validation

以下示例脚本输出预测值和预测概率:

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'])

问题:是否有一种方法可以一步一步获取预测值和概率,而无需两次进行交叉验证?另外,我必须确保值和概率对应于相同的输入数据。

1 个答案:

答案 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',列对应于已排序的类。