受试者工作特征曲线[ receiver operating characteristic ](ROC)曲线是另一种用于二进制分类器的常用工具。它与精度/召回曲线很相似,但是,ROC曲线画的并不是精度vs召回,而是真正率[true positive rate,TPR](这也是召回率的别名)与假正率[false positive rate,FPR]的关系图。FPR指的是被错误归类为正类的负实例的比率 (被预测为正的负样本结果数 /负样本实际数)。它等于1减去真负率[true negative rate,TNR],也就是被正确归类为负类的负类样本所占比率。TNR也被称为特异度[specificity]。因此,ROC曲线绘制敏感度(即召回) vs 特异度。

要绘制ROC曲线,首先需要使用 roc_curve()函数计算不同阈值的TPR和FPR:

from sklearn.metrics import roc_curve
fpr, tpr, thresholds = roc_curve(y_train_5, y_scores)

然后可以使用Matplotlib绘制FPR与TPR关系图。此代码生成图3-6中的图:

def plot_roc_curve(fpr, tpr, label=None):
    plt.plot(fpr, tpr, linewidth=2, label=label)
    plt.plot([0, 1], [0, 1], 'k--')
    plt.axis([0, 1, 0, 1])
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
plot_roc_curve(fpr, tpr)
plt.show()

图3 - 6 ROC曲线

这里还有一个权衡::召回(TPR)越高,分类器产生的假正率(FPR)越多。虚线表示纯随机分类器的ROC曲线;一个好的分类器尽可能远离这条线(靠向左上角)。

比较分类器的一种方法是测量曲线下的面积[area under the curve](AUC)。一个完美的分类器将有一个ROC AUC等于1,而一个纯的随机分类器将有一个ROC AUC等于0.5。Scikit-Learn提供了一个计算ROC AUC的函数:

>>> from sklearn.metrics import roc_auc_score
>>> roc_auc_score(y_train_5, y_scores)
0.97061072797174941

由于ROC曲线与精度/召回(或称:PR)曲线非常相似,所以您可能想知道如何决定使用哪一个。一般来说,当正类比较少的时候,或者当你更关心假正[false positives,FP]而不是假负[false negatives,FN]的时候,你应该更倾向于PR曲线。例如,查看前面的ROC曲线(和ROC AUC评分),您可能认为这个分类器非常好。但这主要是因为与负样本(非5)相比,正样本要少的多(5)。相比之下,PR曲线清楚地表明分类器有改进的空间(曲线可以更接近右上角)。

让我们训练一个RandomForestClassifier,并将其ROC曲线和ROC AUC评分与SGDClassifier进行比较。首先,您需要获取训练集中每个样本的分数,但是由于它的工作方式(见第7章),RandomForestClassifier类并没有 decision_function()方法。相反,它有一个predict_proba()方法。Scikit-Learn分类器通常有这两个方法中的一个。predict_proba()方法返回一个数组,其中每一行是一个样本,而每一列则是一个类别,每一条数据包含给定实例属于该给定类别的概率(比如,70%的几率表示的是5)。

from sklearn.ensemble import RandomForestClassifier
forest_clf = RandomForestClassifier(random_state=42)
y_probas_forest = cross_val_predict(forest_clf, X_train, y_train_5, cv=3,
        method="predict_proba")

但是要绘制ROC曲线,你需要的是得分,而不是概率。一个简单的解决方法是使用正类的概率作为分数:

y_scores_forest = y_probas_forest[:, 1] # score = proba of positive class
fpr_forest, tpr_forest, thresholds_forest = roc_curve(y_train_5,y_scores_forest)

现在可以绘制ROC曲线了。绘制第一个ROC曲线也是有用的,看看它们是如何比较的(图3-7):

plt.plot(fpr, tpr, "b:", label="SGD")
plot_roc_curve(fpr_forest, tpr_forest, "Random Forest")
plt.legend(loc="bottom right")
plt.show()

图3 - 7 ROC曲线比较

如图3-7所示,随机森林分类器的ROC曲线看起来要比SGDClassifier好得多:它更接近左上角。因此,其ROC AUC评分也显著提高:

>>> roc_auc_score(y_train_5, y_scores_forest)
0.99312433660038291

试着测量精度和召回的分数:你应该能找到98.5%的精度和82.8%的召回。不是太坏!

希望您现在知道如何训练二进制分类器,为您的任务选择合适的度量标准,使用交叉验证评估您的分类器,选择适合您需要的精度/回忆权衡,并使用ROC曲线和ROC AUC评分来比较各种模型。现在让我们试着检测出更多的东西,而不仅仅是5的图片。

results matching ""

    No results matching ""