ROC曲线
2014-01-02 08:59
260 查看
在评价预测效果时,除了准确率、召回率之外,还有ROC曲线,我们先来看一下ROC的画法:
为了比较分类模型的效果,人们相应地引入了ROC(receiver operatingcharacteristic)曲线。ROC曲线是一种比较两个分类模型的有用的可视工具。ROC曲线源于信号检测理论,是第二次世界大战期间为雷达图像分析开发的。ROC曲线显示了给定模型的真正率或灵敏度(正确识别的正元组的比例)与假正率(不正确的识别为正元组的负元组的比例)之间的比较评定。也就是说,给定一个二类问题,我们可以对检验集的不同“部分”,显示模型可以正确识别“yes”实例的比例与模型将“no”实例错误地识别为“yes”的比例之间的比较评定。真正率的增加以假正率的增加为代价。ROC曲线下面的面积是对模型准确率的一种度量,被定义为AUROC(area
under roc curve)。
为了绘制给定分类模型M的ROC曲线,模型必须能够返回每个检验元组的预测类的概率或秩评定。也就是说,需要对检验元组按递减序确定秩,其中分类器认为最可能属于正类或“yes”类的元组出现在列表顶部。ROC曲线的垂直轴表示真正率,水平轴表示假正率。M的ROC曲线按以下方法绘制。从左下角开始(这里,真正率和假正率都为0),检查列表顶部元组的实际类标号。如果它是真正元组(即正确分类的元组),则在ROC曲线上,向上移动并绘制一个点。如果元组实际属于“no”类,则有一个假正元组。在ROC曲线上,向右移动并绘制一个点。对每个检验元组重复该过程,每次对真正元组在曲线上向上移动,对假正元组向右移动。
下面是ROC.cpp程序,用于画出ROC曲线,其中输入文件按第一列降序排列:
另外,对于有监督学习的方法,常常有有一些软件包提供ROC曲线的画法,例如:spss、weka等。
为了比较分类模型的效果,人们相应地引入了ROC(receiver operatingcharacteristic)曲线。ROC曲线是一种比较两个分类模型的有用的可视工具。ROC曲线源于信号检测理论,是第二次世界大战期间为雷达图像分析开发的。ROC曲线显示了给定模型的真正率或灵敏度(正确识别的正元组的比例)与假正率(不正确的识别为正元组的负元组的比例)之间的比较评定。也就是说,给定一个二类问题,我们可以对检验集的不同“部分”,显示模型可以正确识别“yes”实例的比例与模型将“no”实例错误地识别为“yes”的比例之间的比较评定。真正率的增加以假正率的增加为代价。ROC曲线下面的面积是对模型准确率的一种度量,被定义为AUROC(area
under roc curve)。
为了绘制给定分类模型M的ROC曲线,模型必须能够返回每个检验元组的预测类的概率或秩评定。也就是说,需要对检验元组按递减序确定秩,其中分类器认为最可能属于正类或“yes”类的元组出现在列表顶部。ROC曲线的垂直轴表示真正率,水平轴表示假正率。M的ROC曲线按以下方法绘制。从左下角开始(这里,真正率和假正率都为0),检查列表顶部元组的实际类标号。如果它是真正元组(即正确分类的元组),则在ROC曲线上,向上移动并绘制一个点。如果元组实际属于“no”类,则有一个假正元组。在ROC曲线上,向右移动并绘制一个点。对每个检验元组重复该过程,每次对真正元组在曲线上向上移动,对假正元组向右移动。
下面是ROC.cpp程序,用于画出ROC曲线,其中输入文件按第一列降序排列:
#include <iostream> #include <math.h> #include <fstream> #include <string> using namespace std; double trapezoid(double x1,double x2,double y1,double y2){ double a=fabs(x1-x2); double b=fabs(y1+y2); return a*b/2; } int main(int argc,const char*argv[]){ double fp=0,fp_pre=0,tp=0,tp_pre=0; double score_pre=-10000; double auc=0; ifstream fin; string file="./"+string(argv[1]); fin.open(file.c_str()); string line; int N=0; int P=0; while(getline(fin,line,'\n')){ char * linechars=new char[line.size()+1]; strcpy(linechars,line.c_str()); char * token=strtok(linechars,","); unsigned int score=atoi(token); token =strtok(NULL,","); unsigned int target=atoi(token); if(target>=1){ P++; }else{ N++; } delete linechars; } fin.close(); fin.open(file.c_str()); while(getline(fin,line,'\n')){ char * linechars=new char[line.size()+1]; strcpy(linechars,line.c_str()); char * token=strtok(linechars,","); double score=atof(token); token =strtok(NULL,","); unsigned int target=atoi(token); if(score != score_pre){ cout<<fp/N<<"\t"<<tp/P<<endl; auc+=trapezoid(fp,fp_pre,tp,tp_pre); score_pre=score; fp_pre=fp; tp_pre=tp; } if(target==1){ tp=tp+1; }else{ fp=fp+1; } delete linechars; } fin.close(); auc=(auc/N)/P; auc = auc + trapezoid(1,fp_pre/N,1,tp_pre/P); cout<<1<<"\t"<<1<<endl; cout<<auc<<endl; return 0; }
另外,对于有监督学习的方法,常常有有一些软件包提供ROC曲线的画法,例如:spss、weka等。
相关文章推荐
- Mapr与Hbase工作
- UITextField 光标的位置设置获取
- UITextField 光标的位置设置获取
- translate函数使用
- Mapr与Flume工作(一)——升级Flume
- translate函数使用
- 像程序员一样思考读书笔记 2
- 字符串匹配算法——KMP && BF
- 算法小记:归并排序
- [转] How to Show Usual Winform as View in XAF
- opencv小波变换代码
- 水木达人的移动游戏总结
- Mapr与Flume工作
- Salience Model
- ActiveMQ 控制台使用方法
- Stacking Autoencoders vs DBN
- ORA-19625 rman备份错误不能备份,正确使用rman crosscheck
- JavaScript超链接设置打开窗口
- ISO8583报文协议(转载,原创:刘永胜)
- 过自己骄傲的生活,或者,有勇气重头再来