博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MATLAB画ROC曲线,及计算AUC值
阅读量:5149 次
发布时间:2019-06-13

本文共 4022 字,大约阅读时间需要 13 分钟。

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

步骤:

  1. 根据决策值和真实标签画ROC曲线,同时计算AUC的值:
  2. 计算算法的决策函数值deci
  3. 根据决策函数值deci对真实标签y进行降序排序,得到新的排序$roc_y$
  4. 根据$roc_y$分别对正负类样本进行累积分布$stack_x$,$stack_y$
  5. 根据$stack_x$,$stack_y$计算RUC的值
  6. \[AUC = \sum_{i=2}^{n}(stack_x(i)-stack_x(i-1))*stack_y(i) \]
  7. 分别以$stack_x$,$stack_y$作为横坐标和纵坐标,画出RUC图

 

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

  

 

代码来自林智仁网站:

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	endendfunction [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    endendfunction [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);	endendfunction 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);

  

转载于:https://www.cnblogs.com/huadongw/p/5495004.html

你可能感兴趣的文章
Vue安装准备工作
查看>>
oracle 创建暂时表
查看>>
201421410014蒋佳奇
查看>>
Xcode5和ObjC新特性
查看>>
LibSVM for Python 使用
查看>>
Centos 7.0 安装Mono 3.4 和 Jexus 5.6
查看>>
CSS属性值currentColor
查看>>
java可重入锁reentrantlock
查看>>
浅谈卷积神经网络及matlab实现
查看>>
解决ajax请求cors跨域问题
查看>>
《收获,不止Oracle》pdf
查看>>
Real-Time Rendering 笔记
查看>>
如何理解HTML结构的语义化
查看>>
Activity之间的跳转:
查看>>
实验四2
查看>>
多路复用
查看>>
Python数据可视化之Pygal(雷达图)
查看>>
Java学习笔记--字符串和文件IO
查看>>
转 Silverlight开发历程—(画刷与着色之线性渐变画刷)
查看>>
SQL语法(3)
查看>>