名词解释
-
ROC曲线:Receiver Operating Characteristic Curve
-
AUC:Area Under Curve
ROC曲线
分类模型尝试将各个实例(instance)划归到某个特定的类,而分类模型的结果一般是实数值,如逻辑回归,其结果是从0到1的实数值。这里就涉及到如何确定阈值(thresholdvalue),使得模型结果大于这个值,划为一类,小于这个值,划归为另一类。
考虑一个二分问题,即将实例分成正类(positive)或负类(negative)。对一个二分问题来说,会出现四种情况。如果一个实例是正类并且也被预测成正类,即为真正类(Truepositive),如果实例是负类被预测成正类,称之为假正类(Falsepositive)。相应地,如果实例是负类被预测成负类,称之为真负类(True positive),正类被预测成负类则为假负类(falsenegative)。
相关计算公式
从表引入两个新名词。其一是真正类率(true positive rate ,TPR), 计算公式为TPR=TP / (TP +FN),刻画的是分类器所识别出的正实例占所有正实例的比例。另外一个是假正类率(false positive rate,FPR),计算公式为FPR= FP / (FP + TN),计算的是分类器错认为正类的负实例占所有负实例的比例。还有一个真负类率(True Negative Rate,TNR),也称为specificity,计算公式为TNR=TN / (FP + TN) = 1 − FPR。
在一个二分类模型中,对于所得到的连续结果,假设已确定一个阀值,比如说 0.6,大于这个值的实例划归为正类,小于这个值则划到负类中。如果减小阀值,减到0.5,固然能识别出更多的正类,也就是提高了识别出的正例占所有正例的比类,即TPR,但同时也将更多的负实例当作了正实例,即提高了FPR。为了形象化这一变化,在此引入ROC。
AUC值的计算
AUC(Area UnderCurve)被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围在0.5和1之间。使用AUC值作为评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而作为一个数值,对应AUC更大的分类器效果更好。
在了解了ROC曲线的构造过程后,编写代码实现并不是一件困难的事情。相比自己编写代码,有时候阅读其他人的代码收获更多,当然过程也更痛苦些。在此推荐scikit-learn中关于计算AUC的代码。
分类模型评估
指标 | 描述 | Scikit-learn函数 |
Precision | 精准度 | from sklearn.metrics import precision_score |
Recall | 召回度 | from sklearn.metrics import recall_score |
F1 | F1值 | from sklearn.metrics import f1_score |
Confusion Matrix | 混淆矩阵 | from sklearn.metrics import confusion_matrix |
ROC | ROC曲线 | from sklearn.metrics import roc |
AUC | ROC曲线下的面积 | from sklearn.metrics import auc |
计算方式
python实现
- 调用sklearn
from sklearn.metrics import roc_auc_score
roc_auc_score(lise_one, list_two) # list既可以是list,也可以是pandas.Series #
- 函数实现(复杂度较高)
def cal_auc(list_one, list_two):
'''计算AUC值'''
positive = []
negative = []
for index in range(len(list_one)):
if list_one[index] == 1:
positive.append(index)
else:
negative.append(index)
SUM = 0
for i in positive:
for j in negative:
if list_two[i] > list_two[j]:
SUM += 1
elif list_two[i] == list_two[j]:
SUM += 0.5
else:
pass
return SUM / (len(positive)*len(negative))
参考资料
ROC曲线(Receiver Operating Characteristic Curve)