ROC曲线

在评价预测效果时,除了准确率、召回率之外,还有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等。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值