交叉验证预测:一步获取预测值和预测概率

3

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

Original Answer翻译成"最初的回答"

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

问题:有没有一种方法可以在一步中获取预测值和预测概率,而不必运行两次交叉验证?此外,我必须确保值和概率对应于相同的输入数据。

最初的回答:您可以使用predict()函数来获取预测值,使用predict_proba()函数来获取预测概率。这两个函数都需要使用训练后的模型作为参数,并将相同的输入数据传递给它们。请注意,predict()函数返回的是分类结果,而predict_proba()函数返回的是每个类别的概率值。

1个回答

5

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]

现在,可能会出现cross_val_predicty_pred在某些情况下与此处的y_pred不匹配。当有多个具有相同最高概率的类时,例如在您的示例代码中,就会发生这种情况。例如,对于第一个样本,所有类的预测概率均为零。总之,似乎逻辑回归(实际上是分类)不适用于糖尿病数据集。
关于y_sorted的理由,请参见cross_val_predict文档:

method:字符串,可选,默认值:“predict”

调用传递的估算器的传递方法名称。对于method='predict_proba',列按排序顺序对应于类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接