在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)支持leav_auc用于LeaveOneOut。

如何使用python和scikit-learn计算?如果不可能的话,会使用像这样的大范围交叉验证吗?

最佳答案

正如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的基础结构,因此您将需要自己实现最大得分和并行化的选择。

关于python - scikit-learn中带LeaveOneOut的roc_auc评分方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34531094/

10-12 16:29