在scikit学习中使用LeaveOneOut的roc_auc评分方法



在scikit learn中,GridSearchCV()支持将"roc_auc"作为评分函数。它可以很好地进行n次交叉验证,但如果我使用LeaveOneOut,它就不起作用并生成错误消息。

ValueError: Only one class present in Y. ROC AUC score is not defined in that case.

尽管使用AUC仅用一个样本绘图似乎是不可能的,但其他语言(如R)支持LeaveOneOut的roc_AUC。

如何使用python和scikit学习计算?如果这是不可能的,使用大折叠交叉验证的结果会像这样吗?

正如David Maust所指出的,漏一交叉验证的问题是GridSearchCV计算每个折叠的分数,然后报告平均值。

为了使用LeaveOneOut获得有意义的ROC AUC,您需要计算每个倍数的概率估计值(每个倍数仅由一个观察值组成),然后计算所有这些概率估计值的ROC AUC。

这可以按如下方式进行:

def LeaveOneOut_predict_proba(clf, X, y, i):
    clf.fit(X.drop(i), y.drop(i))
    return clf.predict_proba(X.loc[[i]])[0, 1]
# set clf, param_grid, X, y
for params in ParameterGrid(param_grid):
    print(params)
    clf.set_params(**params)
    y_proba = [LeaveOneOut_predict_proba(clf, X, y, i) for i in X.index]
    print(roc_auc_score(y, y_proba))

样本输出:

{'n_neighbors': 5, 'p': 1, 'weights': 'uniform'}
0.6057986111111112
{'n_neighbors': 5, 'p': 1, 'weights': 'distance'}
0.620625
{'n_neighbors': 5, 'p': 2, 'weights': 'uniform'}
0.5862499999999999

由于这不使用GridSearchCV的基础设施,因此您需要自己实现最大分数的选取和并行化(如果需要的话)。

相关内容

  • 没有找到相关文章

最新更新