1.原理及介绍
很多学习器是为测试样本产生一个实值或概率预测,然后将这个预测值与 一个分类阈值(threshold) 进行比较,若大于阈值则分为正类,否则为反类。例 如,神经网络在一般情形下是对每个测试样本预测出一个 [0.0 ,1. 0] 之间的实值, 然后将这个值与 0.5 进行比较,大于 0.5 则判为正例,否则为反例。这个实值或 概率预测结果的好坏,直接决定了学习器的泛化能力。实际上根据这个实值或 概率预测结果,我们可将测试样本进行排序,“最可能"是正例的排在最前面, “最不可能"是正例的排在最后面。这样,分类过程就相当于在这个排序中以 某个"截断点” (cut point) 将样本分为两部分,前一部分判作正例,后一部分则 判作反例。ROC 曲线则是从这个角度出发来研究学习器泛化性能的有力工具。 ROC 曲线的纵轴是"真正例率” (True Positive Rate ,简称 TPR) ,横轴是"假正例率" (False Positive Rate ,简称 FPR) 。 一个学习器的 ROC 曲线被另一个学习器的曲线完全"包住", 则可断言后者的性能优于前者;若两个学习ROC 曲线发生交叉,则难以一般性地断言两者孰优孰坏此时如果一定要进行比较,则较为合理的判据是比较 ROC 线下 的面积,即 (Area Under ROC Curve) 。
2.python代码实现
'''
现实任务中通常是利用有限个测试样例来绘制 ROC ,此时仅能获得有
限个(真正例率,假正例 )坐标对,无法产生图 的光滑 ROC 曲线, 只能
绘制出所示的近似 ROC 曲线.绘图过程如下:
给定 m+ 个正例和个反例,根据学习器预测结果对样例进排序,然后把分类阔值设最大,
即把所样例均预测为反例,此时真正例率和假正例率均为 坐标
标记一个点然后,将分类阈值依次设为每个样例的预测值,即依次将每个样例
划分为正例.设前一个标记点坐标为(x,y) ,若为真正例,则对应标记点的
坐标为 (X ,y+(1/m+)) ;当前若为假正例,则对应标记点的坐标为 (X+1/m- ,y) ,
然后用线段连接相邻点即ROC曲线
'''
import matplotlib
.pyplot
as plt
list=[0.8,0.9,0.2,0.1,0.4,0.6,0.7,0.3,0.8,0.25]
tf_list
=[1,1,0,0,0,0,1,0,1,0]
m_true
=0
m_flase
=0
for i
in range(len(tf_list
)):
if tf_list
[i
] == 1:
m_true
=m_true
+1
else:
m_flase
=m_flase
+1
print(m_flase
,m_true
)
x
=[]
y
=[]
xi
=0
yi
=0
for i
in range(len(list)):
if tf_list
[i
]==0:
xi
=xi
+1/m_flase
yi
=yi
x
.append
(xi
)
y
.append
(yi
)
else:
xi
=xi
yi
=yi
+1/m_true
x
.append
(xi
)
y
.append
(yi
)
print(x
,y
)
plt
.plot
(x
, y
)
plt
.xlabel
('FPR')
plt
.ylabel
('TPR')
plt
.title
('ROC_picture')
plt
.show
()
AUC
=0
for i
in range(len(x
)-1):
AUC
=AUC
+(x
[i
+1]-x
[i
])*(y
[i
]+y
[i
+1])
auc
=0.5*AUC
print(auc
)
由于分类样本较少因此曲线不是很规范,具体的分类器打分,以及真正的分类器类别,需要根据实际情况去判断。
参考:周志华 机器学习