• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

MATLAB画ROC曲线,及计算AUC值

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

根据决策值和真实标签画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

  

 

代码来自林智仁网站: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);

  


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Delphi水晶横向竖向打印发布时间:2022-07-18
下一篇:
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap