机器学习之ROC曲线绘制

问题

当我们在使用机器学习分类算法时,例如使用逻辑回归来对鸢尾花进行样本分类,
在这里插入图片描述

是否准确率为95%就代表模型非常成功呢?如何来判定我们使用模型的好坏呢?

ROC曲线

其实,这种好坏的评判标准一直都有,而且随着时代的进步不断更迭。

十几年前在《machine learning》一文中就提出了分类精确的概念来划定模型的好坏;此后,学术界又引入信息检索(IR)领域中的recall和precision进行判定。

然而,在现实中样本在不同类别上的不均衡分布(class distribution imbalance problem)使得accuracy这种传统的度量标准不能合理的反映分类器的performance。举个例子:测试样本中有A类样本90个,B 类样本10个。分类器C1把所有的测试样本都分成了A类,分类器C2把A类的90个样本分对了70个,B类的10个样本分对了5个。则C1的分类精度为 90%,C2的分类精度为75%。但是,显然C2更有用些。另外,在一些分类问题中犯不同的错误代价是不同的(cost sensitive learning)。这样,默认0.5为分类阈值的传统做法也显得不恰当了。

为了解决上述问题,人们从医疗分析领域引入了一种新的分类模型performance评判方法——ROC(Receiver Operating Characteristic)分析,其主要分析工具是一个画在二维平面上的曲线——ROC curve。

ROC曲线起源于第二次世界大战时期雷达兵对雷达的信号判断。当时每一个雷达兵的任务就是去解析雷达的信号,但是当时的雷达技术还没有那么先进,存在很多噪声(比如一只大鸟飞过),所以每当有信号出现在雷达屏幕上,雷达兵就需要对其进行破译。有的雷达兵比较谨慎,凡是有信号过来,他都会倾向于解析成是敌军轰炸机,有的雷达兵又比较神经大条,会倾向于解析成是飞鸟。这个时候,雷达兵的上司就很头大了,他急需一套评估指标来帮助他汇总每一个雷达兵的预测信息,以及来评估这台雷达的可靠性。
在这里插入图片描述

ROC平面的横坐标是false positive rate(FPR),纵坐标是true positive rate(TPR)。
FPR = FP/N
N是真实负样本的个数,FP是N个负样本中被分类器预测为正样本的个数。
TPR = TP/P
P是真实正样本的个数,TP是P个正样本中被分类器预测为正样本的个数。

对某个分类器而言,我们可以根据其在测试样本上的表现得到一个TPR和FPR点对。这样,此分类器就可以映射成ROC平面上的一个点。通过调整这个分类器分类时候使用的阈值,我们就可以得到一个经过(0, 0),(1, 1)的曲线,这就是此分类器的ROC曲线。一般情况下,这个曲线都应该处于(0, 0)和(1, 1)连线的上方。因为(0, 0)和(1, 1)连线形成的ROC曲线实际上代表的是一个随机分类器。

在这里插入图片描述

虽然,用ROC curve来表示分类器的performance很直观好用。可是,人们总是希望通过量化能有一个数值来标志分类器的好坏。于是Area Under roc Curve(AUC)就出现了。顾名思义,AUC的值就是处于ROC curve下方的那部分面积的大小。通常,AUC的值介于0.5到1.0之间,较大的AUC代表了较好的performance。

AUC值对模型性能的判断标准:
AUC = 1,是完美分类器,采用这个预测模型时,存在至少一个阈值能得出完美预测。绝大多数预测的场合,不存在完美分类器。
0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
AUC = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。
AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。

在这里面会涉及到一些其他的概念,譬如:召回,正确率,特异度等,为了便于理解,详见下表。
在这里插入图片描述

ROC曲线的绘制

对于给定的测试数据集及分类器,每一个实例都会得到一个分类结果,类似于一千个人心中有一千个汉姆雷特。通过统计汇总,可以得到一组FPR和TPR结果。分类器认为某个样本具有多大的概率属于正样本(或负样本),于是如果设置不同的threshold,那么分类结果就会有所变动,因此可以得到一系列FPR和TPR的值。

import numpy as np
from sklearn import metrics
import matplotlib.pyplot as plt

y = np.array([1, 1, 2, 2])
scores = np.array([0.1, 0.4, 0.35, 0.8])

fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)

# auc的输入为很简单,就是fpr, tpr值
auc = metrics.auc(fpr, tpr)

#画图
plt.figure()
lw = 2
plt.plot(fpr, tpr, color='darkorange',
         lw=lw, label
  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
为了绘制鸢尾花机器学习ROC曲线,需要进行以下步骤: 1. 加载数据集并进行数据预处理,将标签进行编码。 ```python from sklearn import datasets from sklearn.preprocessing import label_binarize from sklearn.model_selection import train_test_split from sklearn.metrics import roc_curve, auc import matplotlib.pyplot as plt # 加载数据集 iris = datasets.load_iris() X = iris.data y = iris.target # 将标签进行编码 y = label_binarize(y, classes=[0, 1, 2]) n_classes = y.shape[1] ``` 2. 将数据集分为训练集和测试集,并进行模型训练和预测。 ```python # 将数据集分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0) # 训练模型并进行预测 # 这里以SVM分类器为例 from sklearn.svm import SVC classifier = SVC(kernel='linear', probability=True, random_state=0) y_score = classifier.fit(X_train, y_train).decision_function(X_test) ``` 3. 计算ROC曲线的假正率(FPR)和真正率(TPR),并计算AUC值。 ```python # 计算ROC曲线的假正率(FPR)和真正率(TPR) fpr = dict() tpr = dict() roc_auc = dict() for i in range(n_classes): fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i]) roc_auc[i] = auc(fpr[i], tpr[i]) # 计算微平均ROC曲线和AUC值 fpr["micro"], tpr["micro"], _ = roc_curve(y_test.ravel(), y_score.ravel()) roc_auc["micro"] = auc(fpr["micro"], tpr["micro"]) ``` 4. 绘制ROC曲线。 ```python # 绘制ROC曲线 plt.figure() lw = 2 plt.plot(fpr[2], tpr[2], color='darkorange', lw=lw, label='ROC curve (area = %0.2f)' % roc_auc[2]) plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--') plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.05]) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('Receiver operating characteristic example') plt.legend(loc="lower right") plt.show() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值