模型评估&AUC
来源:互联网 发布:服装淘宝产品验收标准 编辑:程序博客网 时间:2024/05/24 06:09
在机器学习中评判一个模型好坏的标准有很多,常用的有准确率、召回率、AUC等。本文介绍下AUC及其计算方式。
AUC常用来评估一个二元分类模型,二元分类模型通常有4中预测结局,以是否患高血压为例:
- 真阳性(TP):诊断为有,实际上也有高血压。
- 伪阳性(FP):诊断为有,实际却没有高血压。
- 真阴性(TN):诊断为没有,实际上也没有高血压。
- 伪阴性(FN):诊断为没有,实际却有高血压。
我们可以得到一个TPR = TP / (TP + FN) FPR = FP / (FP + TN)
如果我们去很多不同的阈值就可以得到一系列的(FPR, TPR)点,这些点可以拟合成一条曲线,我们称之为ROC(Receiver Operating Characteristic);该曲线下方与横轴之间的面积大小即为AUC。因此,我们计算AUC的方式如下:
#!/usr/bin/pythonimport sysdef get_auc(arr_score, arr_label, pos_label): score_label_list = [] for index in xrange(len(arr_score)): score_label_list.append((float(arr_score[index]), int(arr_label[index]))) score_label_list_sorted = sorted(score_label_list, key = lambda line:line[0], reverse = True) fp, tp = 0, 0 lastfp, lasttp = 0, 0 A = 0 lastscore = None for score_label in score_label_list_sorted: score, label = score_label[:2] if score != lastscore: A += trapezoid_area(fp, lastfp, tp, lasttp) lastscore = score lastfp, lasttp = fp, tp if label == pos_label: tp += 1 else: fp += 1 A += trapezoid_area(fp, lastfp, tp, lasttp) A /= (fp * tp) return Adef trapezoid_area(x1, x2, y1, y2): delta = abs(x2 - x1) return delta * 0.5 * (y1 + y2)if __name__ == "__main__": if len(sys.argv) != 2: print "Error!\n%s pred_model_file" sys.exit(-1) arr_score, arr_label = [], [] for line in file(sys.argv[1]): line = line.strip().split('\t') if len(line) < 2 : continue arr_score.append(line[0]) arr_label.append(line[1]) print arr_score;print arr_label; print "AUC = %s" % get_auc(arr_score, arr_label, 2)
F:\python_workspace\offline_evaluation>python model_evaluation.py pred_model_file.txt['0.1', '0.4', '0.35', '0.8']['1', '1', '2', '2']AUC = 0.75
采用sklearn里的代码也可以得到AUC值,http://scikit-learn.org/stable/modules/generated/sklearn.metrics.auc.html#sklearn.metrics.auc
>>> import numpy as np>>> from sklearn import metrics>>> y = np.array([1, 1, 2, 2])>>> pred = np.array([0.1, 0.4, 0.35, 0.8])>>> fpr, tpr, thresholds = metrics.roc_curve(y, pred, pos_label=2)>>> metrics.auc(fpr, tpr)0.75
换个例子:
F:\python_workspace\offline_evaluation>python model_evaluation.py tmp.txt['0.1', '0.2', '0.4', '0.5', '0.35', '0.8', '0.9', '0.95']['1', '2', '1', '1', '2', '2', '2', '1']AUC = 0.5
>>> import numpy as np>>> from sklearn import metrics>>> y = np.array([1,2,1,1,2,2,2,1])>>> pred = np.array([0.1,0.2,0.4,0.5,0.35,0.8,0.9,0.95])>>> fpr, tpr, ths = metrics.roc_curve(y, pred, pos_label=2)>>> metrics.auc(fpr,tpr)0.5
从以上2个例子中可以看到与之前自己写的代码得到的AUC值一样!
从网上看到另外一种求解AUC的方法:
按照上面描述的方法,有如下代码:
getAUC2.py
#!/usr/bin/python import sysdef get_auc(arr_score, arr_label, pos_label): pos_cnt, neg_cnt , pos_gt_neg_cnt = 0, 0, 0 score_label_list = [] for index in xrange(len(arr_score)): label = int(arr_label[index]) if label == pos_label : pos_cnt += 1 else : neg_cnt += 1 score_label_list.append((float(arr_score[index]), label)) score_label_list_sorted = sorted(score_label_list, key = lambda line:line[0], reverse = True) rankvalue = neg_cnt for score_label in score_label_list_sorted: score, label = score_label[:2] if label == pos_label : pos_gt_neg_cnt += rankvalue else : rankvalue -= 1 return 1.0 * pos_gt_neg_cnt / (pos_cnt * neg_cnt)if __name__ == "__main__": if len(sys.argv) != 2: print "Error!\n%s pred_model_file" sys.exit(-1) arr_score, arr_label = [], [] for line in file(sys.argv[1]): line = line.strip().split('\t') if len(line) < 2 : continue arr_score.append(line[0]) arr_label.append(line[1]) #print arr_score;print arr_label; print "AUC = %s" % get_auc(arr_score, arr_label, 1)
下面拿实际应用中一个例子说明两种方式的求解:
第一种按小梯形求解面积的方法,代码文件命名为getAUC1.py, 其中最后一行代码修改为 print "AUC = %s" % get_auc(arr_score, arr_label, 1)
模型文件pred_model_file.txt放在 http://download.csdn.net/detail/lming_08/8607345
[lming_08]$ ./getAUC1.py pred_model_file.txt AUC = 0.867382336327[lming_08]$ ./getAUC2.py pred_model_file.txt AUC = 0.867735229461可以看到两种方式求解结果几乎一致。
参考链接:http://taoo.iteye.com/blog/760589
- 模型评估&AUC
- 银行信用卡批准——模型评估ROC&AUC
- 分类模型评估之ROC-AUC曲线和PRC曲线
- 模型评估的方法: ROC,AUC,RMSE等指标
- 性能指标(模型评估)之ROC与AUC
- 机器学习之模型评估与选择 (RPC与AUC)
- 模型评估与选择(中篇)-ROC曲线与AUC曲线
- 分类模型的性能评估——以SAS Logistic回归为例(2): ROC和AUC
- 分类模型的性能评估——以SAS Logistic回归为例(2): ROC和AUC
- 分类模型的性能评估——以SAS Logistic回归为例(2): ROC和AUC
- 分类模型的性能评估——以SAS Logistic回归为例(2): ROC和AUC
- CTR评估标准及ROC与AUC
- 分类之性能评估指标ROC&AUC
- 模型评估
- 模型评估
- 模型评估
- 模型评估
- 模型评价(一) AUC大法
- [Python2.x] 标准库 urllib2 的使用细节
- php邮箱验证
- POJ-2197(DFS)
- JavaBean入门 - 概念和简单例子
- HTML<textarea>标签的空格的问题
- 模型评估&AUC
- Docker Container开机自动启动
- 基于 xml 来配置 AOP -佟刚老师《Spring4视频教程》学习笔记(22)
- rem在ff和chrome下表现不一致
- 一道SQL面试题
- 【Android开发学习46】Android平台分割PNG图片成小png图片
- 理解和使用NT驱动程序的执行上下文
- (一)jquery做ajax表单提交以及字段验证
- java abstract类和interface的区别,精辟!