在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-learn计算?如果不可能,会使用大折叠交叉验证结果吗?
答案 0 :(得分:1)
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的基础结构,因此您将需要自己实现最大得分和并行化的选择。