机器学习中的AUC-ROC曲线
作者头像
  • senzhan778
  • 2020-07-06 16:26:23 4

AUC-ROC曲线

在建立机器学习模型之后,接下来的步骤就是对其进行评估,以确定其性能的好坏,从而决定是否继续使用该模型。这时,AUC-ROC曲线便派上了用场。

AUC-ROC曲线其实并不复杂,它只是用来计算“接收者操作特性曲线”(ROC)下的面积(AUC)。这个名称听起来可能有些吓人,但实际上,它可以帮助我们更好地理解和评估机器学习分类器的性能。

目录

  • 敏感性和特异性是什么?
  • 预测概率
  • AUC-ROC曲线是什么?
  • AUC-ROC曲线是如何工作的?
  • Python中的AUC-ROC
  • 用于多类分类的AUC-ROC

什么是敏感性和特异性?

敏感性和特异性是衡量分类器性能的重要指标。敏感性是指分类器正确识别出所有正类样本的能力,而特异性是指分类器正确识别出所有负类样本的能力。

敏感性(真正例率/召回率) 敏感性指的是分类器正确识别出所有正类样本的比例。例如,如果一个模型能够正确检测出实际患病的人群,那么它的敏感性就很高。

假反例率 假反例率(FNR)是指分类器将实际正类样本错误分类为负类的比例。较高的TPR和较低的FNR是理想的,因为这表明分类器能够更准确地识别正类样本。

特异性(真反例率) 特异性指的是分类器正确识别出所有负类样本的比例。以敏感性为例,特异性则是指分类器正确识别出健康人群的比例。

假正例率 假正例率(FPR)是指分类器将实际负类样本错误分类为正类的比例。较高的特异性(真反例率)和较低的假正例率是理想的,因为这表明分类器能够更准确地识别负类样本。

预测概率

机器学习分类模型可以直接预测数据点的实际类别,也可以预测其属于不同类别的概率。预测概率提供了更多的灵活性,因为它允许我们设定自己的阈值来解释分类器的结果。这使得我们可以更谨慎地处理分类结果。

通过设置不同的分类阈值,我们可以有意地改变模型的敏感性和特异性。不同的阈值可能会带来不同的效果,具体取决于我们是希望减少假反例还是假正例的数量。

AUC-ROC曲线是什么?

AUC-ROC曲线是一种用于评估二值分类模型性能的工具。它通过在不同阈值下绘制真正例率(TPR)与假正例率(FPR)之间的关系来生成。曲线下面积(AUC)反映了分类器区分正类和负类的能力。

  • AUC的含义
    • AUC值越大,说明模型区分正类和负类的能力越强。
    • 当AUC=1时,分类器可以完美地区分所有的正类和负类。
    • 当AUC为0时,分类器将所有的正类预测为负类,所有的负类预测为正类。
    • 当0.5
    • 当AUC=0.5时,分类器无法区分正类和负类。

AUC-ROC曲线是如何工作的?

在ROC曲线中,X轴代表假正例率(FPR),Y轴代表真正例率(TPR)。选择阈值的过程实际上是在假正例和假反例之间进行平衡。不同的阈值会导致不同的ROC曲线形状,从而影响特异性和敏感性。

  • 不同阈值的影响
    • A点是敏感性最高而特异性最低的点,意味着所有正类样本都被正确分类,所有负类样本都被错误分类。
    • B点和A点具有相同的敏感性,但特异性更高,这意味着错误的负类样本数量减少了。
    • C点和D点在相同特异性下,C点的敏感性更高,这意味着分类器在相同数量的错误分类负类样本下能够正确分类更多正类样本。

最终,我们需要根据实际需求在B点和C点之间选择一个合适的阈值,以达到最佳的分类效果。

Python中的AUC-ROC

在Python中,我们可以利用sklearn库中的roc_curve()函数快速计算ROC曲线。此外,roc_auc_score()函数可以用来计算AUC得分。

```python from sklearn.datasets import makeclassification from sklearn.linearmodel import LogisticRegression from sklearn.neighbors import KNeighborsClassifier from sklearn.modelselection import traintestsplit from sklearn.metrics import roccurve, rocaucscore import matplotlib.pyplot as plt

创建数据集

X, y = makeclassification(nsamples=1000, nfeatures=20, nclasses=2, random_state=42)

划分训练集和测试集

Xtrain, Xtest, ytrain, ytest = traintestsplit(X, y, testsize=0.2, randomstate=42)

训练模型

lr = LogisticRegression() knn = KNeighborsClassifier()

lr.fit(Xtrain, ytrain) knn.fit(Xtrain, ytrain)

计算ROC曲线

fprlr, tprlr, thresholdslr = roccurve(ytest, lr.predictproba(Xtest)[:, 1]) fprknn, tprknn, thresholdsknn = roccurve(ytest, knn.predictproba(Xtest)[:, 1])

计算AUC得分

auclr = rocaucscore(ytest, lr.predictproba(Xtest)[:, 1]) aucknn = rocaucscore(ytest, knn.predictproba(Xtest)[:, 1])

print(f"AUC for Logistic Regression: {auclr}") print(f"AUC for KNN: {aucknn}")

绘制ROC曲线

plt.figure(figsize=(10, 6)) plt.plot(fprlr, tprlr, label=f"Logistic Regression (AUC = {auclr:.2f})") plt.plot(fprknn, tprknn, label=f"KNN (AUC = {aucknn:.2f})") plt.plot([0, 1], [0, 1], 'k--') plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('ROC Curve') plt.legend(loc='lower right') plt.show() ```

从上面的代码可以看出,Logistic回归模型的ROC曲线AUC值明显高于KNN模型,说明Logistic回归在分类数据集中的正类方面表现更好。

用于多类分类的AUC-ROC

虽然AUC-ROC曲线主要应用于二值分类问题,但可以通过一对多技术扩展到多类分类问题。例如,如果有三个类别(0、1、2),可以分别将每个类别视为正类,其余类别视为负类,然后计算相应的ROC曲线。

结尾

通过本文,我们希望你已经了解到AUC-ROC曲线在评估分类器性能方面的强大作用。无论是在工业界还是学术研究中,掌握这一工具都是非常重要的。希望你能熟练应用这一技术,以提升你的机器学习项目的效果。

    本文来源:图灵汇
责任编辑: : senzhan778
声明:本文系图灵汇原创稿件,版权属图灵汇所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明"稿件来源:图灵汇",违者将依法追究责任。
    分享
曲线机器学习AUCROC
    下一篇