使用Scikit-Learn计算平均AUC的差异

我有以下代码:

from sklearn import svm, datasetsfrom sklearn.metrics import roc_curve, aucfrom sklearn.model_selection import StratifiedKFold, cross_val_scoreimport numpy as npfrom scipy import interpseed = 7np.random.seed(seed)iris = datasets.load_iris()X = iris.datay = iris.targetX, y = X[y != 2], y[y != 2]n_samples, n_features = X.shape# Add noisy featuresrandom_state = np.random.RandomState(0)X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]cv = StratifiedKFold(n_splits=10)classifier = svm.SVC(kernel='linear', probability=True, random_state=seed)mean_tpr = 0.0mean_fpr = np.linspace(0, 1, 100)i= 0for train, test in cv.split(X, y):    probas_ = classifier.fit(X[train], y[train]).predict_proba(X[test])    # Compute ROC curve and area the curve    fpr, tpr, thresholds = roc_curve(y[test], probas_[:, 1])    mean_tpr += interp(mean_fpr, fpr, tpr)    mean_tpr[0] = 0.0    roc_auc = auc(fpr, tpr)    i += 1mean_tpr /= cv.get_n_splits(X, y)mean_tpr[-1] = 1.0mean_auc_1 = auc(mean_fpr, mean_tpr)print "#--- Method 1 to calculate mean AUC ---"print mean_auc_1print "#--- Method 2 to calculate mean AUC ---"results = cross_val_score(classifier, X, y, cv=cv)mean_auc_2 =  "{:.3f}".format(results.mean())print mean_auc_2

它产生了以下结果:

#--- Method 1 to calculate mean AUC ---0.801818181818#--- Method 2 to calculate mean AUC ---0.700

计算平均AUC的第一种方法是通过循环,如这个Scikit教程所建议的。第二种方法使用Scikit内置的cross_val_score()方法来计算平均AUC。

我的问题是,为什么会有差异?我应该相信哪个平均AUC值?如何修改第二种方法,使其结果与第一种方法相同?

我使用的是以下版本的Scikit-Learn:

In [442]: sklearn.__version__Out[442]: '0.18'

回答:

你的第二个例子中没有AUC计算。你应该添加一个自定义评分函数。请查看cross_val_score的API。

你只是在计算平均准确率。这通常是用于分类器的标准评分函数。你可以在文档中查看svm的标准评分函数

像这样

cross_val_score(classifier, X, y, cv=cv, scoring='roc_auc')

应该可以工作

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注