生活中最常见用到阳性和阴性的地方是检测疾病的时候,这时候检测的是患者有没有得病,有的话就是阳性,没有的话就是阴性。
但这里的阴性和阳性代表什么是认为规定的,在机器学习中有正样本和负样本,更具体一点在机器学习的异常检测中有正常值和异常值,在这个领域异常值一般用阳性来表示,而正常值一般用阴性来表示。
既然要对样本进行学习然后用模型预测测试集样本是正样本还是负样本,那么就必然有以下几种情况:
∙ \bullet ∙真阳性:标签为真,预测也为真
∙ \bullet ∙真阴性:条件为假,预测也为假
∙ \bullet ∙假阳性:条件为假,但预测为真
∙ \bullet ∙假阴性:条件为真,但预测为假
把上述定义综合到一起就构成了所谓的混淆矩阵:
通过每个方形中的值可以推导出准确率(accuracy),精确率(precision)和召回率(recall),从而更好地了解模型性能。
首先我们用T(True)来表示真(预测对了),F(False)来表示假(预测错了),P(Positive)来表示阳性(预测为真),N(Negative)来表示阴性(预测为假)。其中假阳性(FP)被称为第一类错误,假阴性(FN)被称为第二类错误。
∙ \bullet ∙精确率描述的是真预测中有多少被实际证明是真的。
精确率= T P T P + F P \frac{TP}{TP+FP} TP+FPTP
∙ \bullet ∙准确率度量描述的是整个数据集中有多少预测是正确的。
准确率= T P + T N 总 数 \frac{TP+TN}{总数} 总数TP+TN
∙ \bullet ∙召回率度量描述的是实际为真的点中有多少预测为真。
召回率= T P T P + F N \frac{TP}{TP+FN} TP+FNTP
在此基础上,可以推出更多的值。
∙ \bullet ∙F1分数是精确率和召回率的调和平均值。这个度量指标可以告诉我们模型的准确程度,因为它既考虑了模型对多少实际为真的数据点做出真预测,也考虑了模型对真预测总数中的多少做出了正确预测。
F1分数= 2 ∗ 精 确 率 ∗ 召 回 率 精 确 率 + 召 回 率 \frac{2*精确率*召回率}{精确率+召回率} 精确率+召回率2∗精确率∗召回率
∙ \bullet ∙真阳性率(TPR) = 召回率 = 灵敏度。与召回率一样,TPR告诉我们有多少实际为真的数据点被模型预测为真。
∙ \bullet ∙ 假阳性率(FPR) 告诉我们有多少实际为假的数据点被模型预测为阳性。此公式与召回率类似,但它不是真阳性与所有真数据点的比率,而是假阳性与假数据点的比率。
F P R = 1 − 特 效 度 = F P F P + T N FPR=1-特效度=\frac{FP}{FP+TN} FPR=1−特效度=FP+TNFP
∙ \bullet ∙特效度 与召回率非常相似,它告诉我们有多少实际为假的数据点被模型预测为假。
特 效 度 = 1 − F P R = T N T N + F P 特效度=1-FPR=\frac{TN}{TN+FP} 特效度=1−FPR=TN+FPTN
ROC的全称是Receiver Operating Characteristic Curve,中文名字叫“受试者工作特征曲线”,顾名思义,其主要的分析方法就是画这条特征曲线。在机器学习领域用来评判分类、检测结果的好坏
ROC曲线的绘制步骤如下:
(1)假设已经得出一系列样本被划分为正类的概率Score值,按照大小排序。
(2)从高到低,依次将“Score”值作为阈值threshold,当测试样本属于正样本的概率大于或等于这个threshold时,我们认为它为正样本,否则为负样本。举例来说,对于某个样本,其“Score”值为0.6,那么“Score”值大于等于0.6的样本都被认为是正样本,而其他样本则都认为是负样本。
(3)每次选取一个不同的threshold,得到一组FPR和TPR,以FPR值为横坐标和TPR值为纵坐标,即ROC曲线上的一点。
(4)根据3中的每个坐标点,画图。
ROC曲线绘制实例
(1)分析数据
y_true = [0, 0, 1, 1];scores = [0.1, 0.4, 0.35, 0.8];
(2)列表
(3)将截断点依次取为score值,计算TPR和FPR
当截断点为0.1时:
说明只要score>=0.1,它的预测类别就是正例。 因为4个样本的score都大于等于0.1,所以,所有样本的预测类别都为P。
scores = [0.1, 0.4, 0.35, 0.8];y_true = [0, 0, 1, 1];y_pred = [1, 1, 1, 1];
正例与反例信息如下:
由此可得:
TPR = TP/(TP+FN) = 1; FPR = FP/(TN+FP) = 1;
当截断点为0.35时:
scores = [0.1, 0.4, 0.35, 0.8];y_true = [0, 0, 1, 1];y_pred = [0, 1, 1, 1];
正例与反例信息如下:
由此可得:
TPR = TP/(TP+FN) = 1; FPR = FP/(TN+FP) = 0.5;
当截断点为0.4时:
scores = [0.1, 0.4, 0.35, 0.8];y_true = [0, 0, 1, 1];y_pred = [0, 1, 0, 1];
正例与反例信息如下:
由此可得:
TPR = TP/(TP+FN) = 0.5; FPR = FP/(TN+FP) = 0.5;
当截断点为0.8时:
scores = [0.1, 0.4, 0.35, 0.8];y_true = [0, 0, 1, 1];y_pred = [0, 0, 0, 1];
正例与反例信息如下:
由此可得:
TPR = TP/(TP+FN) = 0.5; FPR = FP/(TN+FP) = 0;
(4)根据TPR、FPR值,以FPR为横轴,TPR为纵轴画图。
def roc_curve(y_true, y_score, *, pos_label=None, sample_weight=None,
drop_intermediate=True):
y_true:真实二分类的标签
y_score:样本被分类为正类的概率
pos_label:正类标签值。如果使用[-1,1]或者[0,1]来标记负类和正类的话则不需要设置pos_label,否则需要设置pos_label来告诉代码我们设定的正类是什么。比如用[1,2]来标记负类和正类,则需要设置pos_label=2
fpr: 假阳率。
tpr :真阳率。
thresholds:阈值。
计算部分:
>>> import numpy as np
>>> from sklearn import metrics
>>> 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)
>>> fpr
array([0. , 0. , 0.5, 0.5, 1. ])
>>> tpr
array([0. , 0.5, 0.5, 1. , 1. ])
>>> thresholds
array([1.8 , 0.8 , 0.4 , 0.35, 0.1 ])
在这个例子中标签1代表负类标记,2代表正类标记。
对于每一个阈值(threshold),都会计算出该阈值对应的假阳率(fpr)和真阳率(tpr)。阈值是从大往小设置的。具体计算如下:
(1)threshold=1.8时,scores小于1.8的样本都会被判定为负类,大于等于1.8的被判定为正类,此时TN=2,FN=2,TP=0,FP=0,根据第3节中的计算方法,fpr=0,tptr=0;
(2)threshold=0.8时,scores小于0.8的样本都会被判定为负类,大于等于0.8的被判定为正类,此时TN=2,FN=1,TP=1,FP=0,根据第3节中的计算方法,fpr=0,tptr=0.5;
(3)threshold=0.4时,scores小于0.4的样本都会被判定为负类,大于等于0.4的被判定为正类,此时TN=1,FN=1,TP=1,FP=1,根据第3节中的计算方法,fpr=0.5,tptr=0.5;
(4)threshold=0.35时,scores小于0.35的样本都会被判定为负类,大于等于0.35的被判定为正类,此时TN=1,FN=0,TP=2,FP=1,根据第3节中的计算方法,fpr=0.5,tptr=1;
(5)threshold=0.1时,scores小于0.1的样本都会被判定为负类,大于等于0.1的被判定为正类,此时TN=0,FN=0,TP=2,FP=2,根据第3节中的计算方法,fpr=1,tptr=1;
绘制部分:
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)
plt.plot(fpr, tpr, color='darkorange')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.show()
AUC表示ROC曲线下的面积,主要用于衡量模型的泛化性能,即分类效果的好坏。AUC是衡量二分类模型优劣的一种评价指标,表示正例排在负例前面的概率。一般在分类模型中,预测结果都是以概率的形式表现,如果要计算准确率,通常都会手动设置一个阈值来将对应的概率转化成类别,这个阈值也就很大程度上影响了模型准确率的计算。
之所以采用AUC来评价,主要还是考虑到ROC曲线本身并不能直观的说明一个分类器性能的好坏,而AUC值作为一个数量值,具有可比较性,可以进行定量的比较。
AUC值的计算方法:
∙ \bullet ∙将坐标点按照横坐标FPR排序 。
∙ \bullet ∙计算第 i i i个坐标点和第 i + 1 i+1 i+1个坐标点的间距 d x dx dx 。
∙ \bullet ∙ 获取第 i i i或者 i + 1 i+1 i+1个坐标点的纵坐标y。
∙ \bullet ∙ 计算面积微元 d s = y d x ds=ydx ds=ydx。
∙ \bullet ∙ 对面积微元进行累加,得到AUC。
AUC值对模型性能的判断标准:
(1) AUC = 1,是完美分类器,采用这个预测模型时,存在至少一个阈值能得出完美预测。绝大多数预测的场合,不存在完美分类器。
(2) 0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
(3)AUC = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。
(4)AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。
参考