1、ROC曲线,又可以称之为接受者操作特征曲线(Receiver Operating Characteristic Curve),
ROC曲线下的面积,称为AUC(Area Under Cureve),可以衡量评估二分类模型的分类好坏。
2、AUC是1乘以的方格中的一部分,起大小在0-1之间,AUC越大说明模型效果越好,
1、ROC曲线由预测概率和阈值来共同决定
分类模型的输出结果中包含一个0到1的概率值,该概率代表着对应的样本被预测为某类别的可能性,通过阈值来进行划分,概率大于阈值的为正,概率小于阈值的负。
样本 | 预测概率 | 阈值(thresholds=0.9) | 阈值(thresholds=0.5) |
1 | 0.95 | 正 | 正 |
2 | 0.86 | 负 | 正 |
3 | 0.64 | 负 | 正 |
4 | 0.43 | 负 | 负 |
2、TPR和FPR
ROC曲线的横坐标为FPR,纵坐标为TPR,FPR是错误的预测为正的概率,TPR为正确的预测为正的概率(注意TPR+FTR不是固定等于1的)
FPR=负的预测为正的数量/原本为负的数量(FPR = FP/(TN+FP))
TPR=正的预测为正的数量/原本为正的数量(召回率:TPR = TP/(TP+FN))
备注:TN+FP为负样本总量;TP+FN为正样本总量。
FPR越小越好,TPR越大越好
1、将全部样本按概率递减排序
2、阈值从1至0变更,计算各阈值下对应的(FPR,TPR)数值对
3、将数值对绘制直角坐标系中
具体如下:
step1:将全部样本安装概率递减排序(概率是模型预测之后的概率)
样本ID | 原始类型 | 预测概率 |
1 | 正 | 0.95 |
2 | 正 | 0.86 |
3 | 负 | 0.70 |
4 | 正 | 0.65 |
5 | 正 | 0.55 |
6 | 负 | 0.53 |
7 | 负 | 0.52 |
8 | 负 | 0.43 |
9 | 正 | 0.42 |
10 | 负 | 0.35 |
step2:阈值从1至0变更,计算各阈值下的对应的(FPR,TPR)数值对
1)阈值=1时
FPR=负的预测为正的数量/原本为负的数量 = 0 / 5 = 0 (样本3、6、7、8、10)
TPR=正的预测为正的数量/原本为正的数量 = 0 / 5 = 0 (样本1、2、4、5、9)
此时得到一个点(0,0),即为ROC曲线的第一个点。
样本ID | 原始类型 | 预测概率 | 当阈值=1 | 阈值=0.95 | 阈值=0.86 | 阈值=0.7 |
1 | 正 | 0.95 | 负 | 正 | 正 | 正 |
2 | 正 | 0.86 | 负 | 负 | 正 | 正 |
3 | 负 | 0.70 | 负 | 负 | 负 | 正 |
4 | 正 | 0.65 | 负 | 负 | 负 | 负 |
5 | 正 | 0.55 | 负 | 负 | 负 | 负 |
6 | 负 | 0.53 | 负 | 负 | 负 | 负 |
7 | 负 | 0.52 | 负 | 负 | 负 | 负 |
8 | 负 | 0.43 | 负 | 负 | 负 | 负 |
9 | 正 | 0.42 | 负 | 负 | 负 | 负 |
10 | 负 | 0.35 | 负 | 负 | 负 | 负 |
2)阈值=0.95时
FPR=负的预测为正的数量/原本为负的数量=0/5 = 0 (样本3、6、7、8、10)
TPR=正的预测为正的数量/原本为正的数量=1(样本1)/5 = 0.2 (样本1、2、4、5、9)
此时得到一个点(0,0.2),即为ROC曲线的第二个点。
后面依次类推,变化阈值,得到(FPR,TPR)
我们最后得到一些点(0,0)(0, 0.2)(0,0.4)(0.2,0.4)(0.2,0.6)(0.2,0.8)(0.4,0.8)(0.6,0.8)(0.8,0.8)(0.8,1.0)(1.0,1.0),根据这些点,我们画如下的ROC曲线了 ~
1、可能有些同学疑惑,上面这个阈值(thresholds)怎么来的。下面我们简单看下,
这里metrics 输入样本y和scores,scores你可以看成是预测概率了。然后返回的是 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)#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 ])
2、我们可以直接用
sklearn.metrics.plot_roc_curve 进行绘制 ROC曲线
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn import datasets, metrics, model_selection, svm
X, y = datasets.make_classification(random_state=0)
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, random_state=0)
clf = svm.SVC(random_state=0)
clf.fit(X_train, y_train)
metrics.plot_roc_curve(clf, X_test, y_test)
plt.show()
说明下,一般我们的模型都会返回预测概率值的。
以上就是ROC的介绍和使用,欢迎大家评论指正。谢谢!