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

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

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”。

对于这两种情况。

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

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

【问题讨论】:

    标签: python scikit-learn random-forest cross-validation


    【解决方案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]])
    
    

    【讨论】:

    【解决方案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]))
    

    【讨论】:

      猜你喜欢
      • 2017-04-13
      • 2016-04-25
      • 2021-10-25
      • 2017-09-02
      • 2015-09-02
      • 2016-05-09
      • 1970-01-01
      • 2017-09-11
      • 2019-02-08
      相关资源
      最近更新 更多