根据决策值和真实标签画ROC曲线,同时计算AUC的值
步骤:
- 根据决策值和真实标签画ROC曲线,同时计算AUC的值:
- 计算算法的决策函数值deci
- 根据决策函数值deci对真实标签y进行降序排序,得到新的排序$roc_y$
- 根据$roc_y$分别对正负类样本进行累积分布$stack_x$,$stack_y$
- 根据$stack_x$,$stack_y$计算RUC的值
- \[AUC = \sum_{i=2}^{n}(stack_x(i)-stack_x(i-1))*stack_y(i) \]
- 分别以$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);