首页 » python机器学习 » python机器学习全文在线阅读

《python机器学习》6.5.3 绘制ROC曲线

关灯直达底部

受试者工作特征曲线(receiver operator characteristic,ROC)是基于模型假正率和真正率等性能指标进行分类模型选择的有用工具,假正率和真正率可以通过移动分类器的分类阈值来计算。ROC的对角线可以理解为随机猜测,如果分类器性能曲线在对角线以下,那么其性能就比随机猜测还差。对于完美的分类器来说,其真正率为1,假正率为0,这时的ROC曲线即为横轴0与纵轴1组成的折线。基于ROC曲线,我们就可以计算所谓的ROC线下区域(area under the curve,AUC),用来刻画分类模型的性能。

与ROC曲线类似,我们也可以计算不同概率阈值下一个分类器的准确率-召回率曲线。绘制此准确率-召回率曲线的方法也在scikit-learn中得以实现,其文档请参阅链接:http://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_recall_curve.html。

在下面的代码中,我们只使用了威斯康星乳腺癌数据集中的两个特征来判定肿瘤是良性还是恶性,并绘制了相应的ROC曲线。虽然再次使用了前面定义的逻辑斯谛回归流水线,但是为了使ROC曲线视觉上更加生动,我们对分类器的设置比过去更具有挑战性。出于相同的考虑,我们还将StratifiedKFold验证器中的分块数量减少为3。代码如下:

前面的示例代码使用了scikit-learns中我们已经熟悉的StratifiedKFold类,并且在pipe_lr流水线的每次迭代中都使用了sklearn.metrics模块中的roc_curve函数,以计算Logistic-Regresssion分类器的ROC性能。此外,我们通过SciPy中的interp函数利用三个块数据对ROC曲线的內插均值进行了计算,并使用auc函数计算了低于ROC曲线区域的面积。最终的ROC曲线表明不同的块之间存在一定的方差,且平均ROC AUC(0.75)位于最理想情况(1.0)与随机猜测(0.5)之间。

如果我们仅对ROC AUC的得分感兴趣,也可以直接从sklearn.metircs子模块中导入roc_auc_score函数。分类器在只有两个特征的训练集上完成拟合后,使用如下代码计算分类器在单独测试集上的ROC AUC得分:

通过ROC AUC得到的分类器性能可以让我们进一步洞悉分类器在类别不均衡样本集合上的性能。然而,既然准确率评分可以解释为ROC曲线上某个单点处的值,A.P.Bradley认为ROC AUC与准确率矩阵之间是相互一致的[1]。

[1] A.P.Bradley.The Use of the Area Under the ROC Curve in the Evaluation of Machine Learning Algorithms.Pattern recognition,30(7): 1145-1159,1997.