如何在 scikit-learn 中使用交叉验证获得预测概率

Posted

技术标签:

【中文标题】如何在 scikit-learn 中使用交叉验证获得预测概率【英文标题】:How to get the prediction probabilities using cross validation in scikit-learn 【发布时间】:2019-11-09 01:47:48 【问题描述】:

我正在使用 RandomForestClassifier,如下所示,使用交叉验证进行二进制分类(类标签为 01)。

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import StratifiedKFold, cross_val_score

clf=RandomForestClassifier(random_state = 42, class_weight="balanced")
k_fold = StratifiedKFold(n_splits=10, shuffle=True, random_state=0)
accuracy = cross_val_score(clf, X, y, cv=k_fold, scoring = 'accuracy')
print("Accuracy: " + str(round(100*accuracy.mean(), 2)) + "%")
f1 = cross_val_score(clf, X, y, cv=k_fold, scoring = 'f1_weighted')
print("F Measure: " + str(round(100*f1.mean(), 2)) + "%")

现在我想使用1 类的预测概率和cross validation 结果对我的数据进行排序。为此,我尝试了以下两种方法。

pred = clf.predict_proba(X)[:,1]
print(pred)

probs = clf.predict_proba(X)
best_n = np.argsort(probs, axis=1)[:,-6:]

我收到以下错误

NotFittedError:此 RandomForestClassifier 实例未拟合 然而。在使用此方法之前,使用适当的参数调用“fit”。

对于这两种情况。

我只是想知道我哪里做错了。

如果需要,我很乐意提供更多详细信息。

【问题讨论】:

【参考方案1】:

如果您想对看不见的数据点使用 CV 模型,请使用以下方法。

from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_validate

iris = datasets.load_iris()
X = iris.data
y = iris.target
clf = RandomForestClassifier(n_estimators=10, random_state = 42, class_weight="balanced")

cv_results = cross_validate(clf, X, y, cv=3, return_estimator=True)

clf_fold_0 = cv_results['estimator'][0]

clf_fold_0.predict_proba([iris.data[133]])

# array([[0. , 0.5, 0.5]])

【讨论】:

请告诉我你对这个问题的看法:***.com/questions/57636500/…【参考方案2】:

查看documentation,它指定概率是根据树的平均结果计算的。

在您的情况下,您首先需要调用fit() 方法来生成模型中的发束。在训练数据上拟合模型后,您可以调用 predict_proba() 方法。

这也在错误中指定。

# Fit model
model = RandomForestClassifier(...)
model.fit(X_train, Y_train)

# Probabilty
model.predict_proba(X)[:,1]

【讨论】:

感谢您的回答。我也在使用cross validation。只是想知道如何将cross validation 包含在predict.proba 中。请让我知道你的想法。谢谢你:)【参考方案3】:

我使用以下代码解决了我的问题:

proba = cross_val_predict(clf, X, y, cv=k_fold, method='predict_proba')
print(proba[:,1])
print(np.argsort(proba[:,1]))

【讨论】:

以上是关于如何在 scikit-learn 中使用交叉验证获得预测概率的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Scikit-Learn 中绘制超过 10 倍交叉验证的 PR 曲线

如何在 scikit-learn 中使用 k 折交叉验证来获得每折的精确召回?

如何在 scikit-learn 中执行随机森林模型的交叉验证?

如何在 scikit-learn 中计算正确的交叉验证分数?

如何在交叉验证中获得 Keras scikit-learn 包装器的训练和验证损失?

在 scikit-learn 中跨多个模型进行交叉验证时如何保持相同的折叠?