您的位置:首页 > 其它

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曲线,其中输入文件按第一列降序排列:

#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等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: