MATLAB画ROC曲线,及计算AUC值

根据决策值和真实标签画ROC曲线,同时计算AUC的值

function auc = roc_curve(deci,label_y) %%deci=wx+b, label_y, true label
	[val,ind] = sort(deci,‘descend‘);
	roc_y = label_y(ind);
	stack_x = cumsum(roc_y == -1)/sum(roc_y == -1);
	stack_y = cumsum(roc_y == 1)/sum(roc_y == 1);
	auc = sum((stack_x(2:length(roc_y),1)-stack_x(1:length(roc_y)-1,1)).*stack_y(2:length(roc_y),1))

        %Comment the above lines if using perfcurve of statistics toolbox
        %[stack_x,stack_y,thre,auc]=perfcurve(label_y,deci,1);
	plot(stack_x,stack_y);
	xlabel(‘False Positive Rate‘);
	ylabel(‘True Positive Rate‘);
	title([‘ROC curve of (AUC = ‘ num2str(auc) ‘ )‘]);
end

  

代码来自林智仁网站:https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/#roc_curve_for_binary_svm

function auc = plotroc(y,x,params)
%plotroc draws the recevier operating characteristic(ROC) curve.
%
%auc = plotroc(training_label, training_instance [, libsvm_options -v cv_fold])
%  Use cross-validation on training data to get decision values and plot ROC curve.
%
%auc = plotroc(testing_label, testing_instance, model)
%  Use the given model to predict testing data and obtain decision values
%  for ROC
%
% Example:
%
% 	load(‘heart_scale.mat‘);
% 	plotroc(heart_scale_label, heart_scale_inst,‘-v 5‘);
%
%	[y,x] = libsvmread(‘heart_scale‘);
%   	model = svmtrain(y,x);
% 	plotroc(y,x,model);
	rand(‘state‘,0); % reset random seed
	if nargin < 2
		help plotroc
		return
	elseif isempty(y) | isempty(x)
		error(‘Input data is empty‘);
	elseif sum(y == 1) + sum(y == -1) ~= length(y)
		error(‘ROC is only applicable to binary classes with labels 1, -1‘); % check the trainig_file is binary
	elseif exist(‘params‘) && ~ischar(params)
		model = params;
		[predict_label,mse,deci] = svmpredict(y,x,model) ;% the procedure for predicting
		auc = roc_curve(deci*model.Label(1),y);
	else
		if ~exist(‘params‘)
			params = [];
		end
		[param,fold] = proc_argv(params); % specify each parameter
		if fold <= 1
			error(‘The number of folds must be greater than 1‘);
		else
			[deci,label_y] = get_cv_deci(y,x,param,fold); % get the value of decision and label after cross-calidation
			auc = roc_curve(deci,label_y); % plot ROC curve
		end
	end
end

function [resu,fold] = proc_argv(params)
	resu=params;
	fold=5;
	if ~isempty(params) && ~isempty(regexp(params,‘-v‘))
        [fold_val,fold_start,fold_end] = regexp(params,‘-v\s+\d+‘,‘match‘,‘start‘,‘end‘);
        if ~isempty(fold_val)
            [temp1,fold] = strread([fold_val{:}],‘%s %u‘);
            resu([fold_start:fold_end]) = [];
        else
            error(‘Number of CV folds must be specified by "-v cv_fold"‘);
        end
    end
end

function [deci,label_y] = get_cv_deci(prob_y,prob_x,param,nr_fold)
	l=length(prob_y);
	deci = ones(l,1);
	label_y = ones(l,1);
	rand_ind = randperm(l);
	for i=1:nr_fold % Cross training : folding
		test_ind=rand_ind([floor((i-1)*l/nr_fold)+1:floor(i*l/nr_fold)]‘);
		train_ind = [1:l]‘;
		train_ind(test_ind) = [];
		model = svmtrain(prob_y(train_ind),prob_x(train_ind,:),param);
		[predict_label,mse,subdeci] = svmpredict(prob_y(test_ind),prob_x(test_ind,:),model);
		deci(test_ind) = subdeci.*model.Label(1);
		label_y(test_ind) = prob_y(test_ind);
	end
end

function auc = roc_curve(deci,label_y) %%deci=wx+b, label_y, true label
	[val,ind] = sort(deci,‘descend‘);
	roc_y = label_y(ind);
	stack_x = cumsum(roc_y == -1)/sum(roc_y == -1);
	stack_y = cumsum(roc_y == 1)/sum(roc_y == 1);
	auc = sum((stack_x(2:length(roc_y),1)-stack_x(1:length(roc_y)-1,1)).*stack_y(2:length(roc_y),1))

        %Comment the above lines if using perfcurve of statistics toolbox
        %[stack_x,stack_y,thre,auc]=perfcurve(label_y,deci,1);
	plot(stack_x,stack_y);
	xlabel(‘False Positive Rate‘);
	ylabel(‘True Positive Rate‘);
	title([‘ROC curve of (AUC = ‘ num2str(auc) ‘ )‘]);
end

  调用:

[y,x] = libsvmread(‘heart_scale.txt‘);
model = svmtrain(y,x);
plotroc(y,x,model);

时间: 2024-10-10 10:48:48

MATLAB画ROC曲线,及计算AUC值的相关文章

scikit-learn机器学习(二)逻辑回归进行二分类(垃圾邮件分类),二分类性能指标,画ROC曲线,计算acc,recall,presicion,f1

数据来自UCI机器学习仓库中的垃圾信息数据集 数据可从http://archive.ics.uci.edu/ml/datasets/sms+spam+collection下载 转成csv载入数据 import matplotlib matplotlib.rcParams['font.sans-serif']=[u'simHei'] matplotlib.rcParams['axes.unicode_minus']=False import pandas as pd import numpy as

python sklearn画ROC曲线

preface:最近<生物信息学>多次谈到AUC,ROC这两个指标,正在做的project,要求画ROC曲线,sklearn里面有相应的函数,故学习学习. AUC: ROC: 具体使用参考sklearn: http://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_curve.html http://scikit-learn.org/stable/auto_examples/model_selection/plot_

ROC 曲线,以及AUC计算方式

ROC曲线: roc曲线:接收者操作特征(receiveroperating characteristic),roc曲线上每个点反映着对同一信号刺激的感受性. ROC曲线的横轴: 负正类率(false postive rate FPR)特异度,划分实例中所有负例占所有负例的比例:(1-Specificity) 预测为正样本但是实际为负样本的数目占所有负样本的数目的比例 ROC 纵轴: 真正类率(true postive rate TPR)灵敏度,Sensitivity(正类覆盖率) 预测为正样本

机器学习之分类器性能指标之ROC曲线、AUC值

分类器性能指标之ROC曲线.AUC值 一 roc曲线 1.roc曲线:接收者操作特征(receiveroperating characteristic),roc曲线上每个点反映着对同一信号刺激的感受性. 横轴:负正类率(false postive rate FPR)特异度,划分实例中所有负例占所有负例的比例:(1-Specificity) 纵轴:真正类率(true postive rate TPR)灵敏度,Sensitivity(正类覆盖率) 2针对一个二分类问题,将实例分成正类(postive

分类器性能指标之ROC曲线、AUC值

一 roc曲线 1.roc曲线:接收者操作特征(receiveroperating characteristic),roc曲线上每个点反映着对同一信号刺激的感受性. 横轴:负正类率(false postive rate FPR)特异度,划分实例中所有负例占所有负例的比例:(1-Specificity) 纵轴:真正类率(true postive rate TPR)灵敏度,Sensitivity(正类覆盖率) 2针对一个二分类问题,将实例分成正类(postive)或者负类(negative).但是实

混淆矩阵、准确率、精确率/查准率、召回率/查全率、F1值、ROC曲线的AUC值

准确率.精确率(查准率).召回率(查全率).F1值.ROC曲线的AUC值,都可以作为评价一个机器学习模型好坏的指标(evaluation metrics),而这些评价指标直接或间接都与混淆矩阵有关,前四者可以从混淆矩阵中直接计算得到,AUC值则要通过ROC曲线进行计算,而ROC曲线的横纵坐标又和混淆矩阵联系密切,所以在了解这些评价指标之前,先知道什么是混淆矩阵很有必要,也方便记忆. 1.混淆矩阵 对于一个二分类问题,我们可以得到如表 1所示的的混淆矩阵(confusion matrix): 表

ROC曲线是通过样本点分类概率画出的 例如某一个sample预测为1概率为0.6 预测为0概率0.4这样画出来,此外如果曲线不是特别平滑的话,那么很可能存在过拟合的情况

ROC和AUC介绍以及如何计算AUC from:http://alexkong.net/2013/06/introduction-to-auc-and-roc/ ROC(Receiver Operating Characteristic)曲线和AUC常被用来评价一个二值分类器(binary classifier)的优劣,对两者的简单介绍见这里.这篇博文简单介绍ROC和AUC的特点,以及更为深入地,讨论如何作出ROC曲线图以及计算AUC. ROC曲线 需要提前说明的是,我们这里只讨论二值分类器.对

多分类下的ROC曲线和AUC

本文主要介绍一下多分类下的ROC曲线绘制和AUC计算,并以鸢尾花数据为例,简单用python进行一下说明.如果对ROC和AUC二分类下的概念不是很了解,可以先参考下这篇文章:http://blog.csdn.net/ye1215172385/article/details/79448575 由于ROC曲线是针对二分类的情况,对于多分类问题,ROC曲线的获取主要有两种方法: 假设测试样本个数为m,类别个数为n(假设类别标签分别为:0,2,...,n-1).在训练完成后,计算出每个测试样本的在各类别

AUC指标之ROC曲线只有一个点的问题

在一般认知中,用模型对测试集进行分类预测,结果应该是X或者X'(也可以说是或者否).根据混淆矩阵算出TP.FP.TN.FN,进一步算出TPR.FPR.一个测试集只会有一对TPR/FPR值,那么ROC曲线就只会有一个点,何谈曲线之说?难道是用多个测试集得到多对TPR/FPR值,来绘制ROC曲线吗?实则不然. ROC曲线,一般适用于分类器输出一个“概率值”,即这个样本属于某个类的概率是多少.在计算的时候会依次用所有样本的概率值作为阈值, 用阀值和所有样本的预测值进行比较,大于这个阈值的样本预测为正类