如何解决使用Matlab进行交叉验证和ROC曲线:如何绘制平均ROC曲线?
我正在使用k = 10的k倍交叉验证。因此,我有10条ROC曲线。 我想在曲线之间求平均值。我不能只对Y轴上的值进行平均(使用perfcurve),因为返回的向量大小不相同。
[X1,Y1,T1,AUC1] = perfcurve(t_test(1),resp(1),1);
.
.
.
[X10,Y10,T10,AUC10] = perfcurve(t_test(10),resp(10),1);
如何解决?如何绘制10条ROC曲线的平均曲线?
解决方法
因此,您的k
曲线的点数不同,在两个维度上都以[0..1]
的间隔绑定。首先,您需要在指定的查询点为每个曲线计算插值。现在,您有了具有固定点数的新曲线,并且可以计算它们的平均值。 interp1
函数将执行插值部分。
%% generating sample data
k = 10;
X = cell(k,1);
Y = cell(k,1);
hold on;
for i=1:k
n = 10+randi(10);
X{i} = sort([0 1 rand(1,n)]);
Y{i} = sort([0 1 rand(1,n)].^.5);
end
%% Calculating interpolations
% location of query points
X2 = linspace(0,1,50);
n = numel(X2);
% initializing values for different curves at different query points
Y2 = zeros(k,n);
for i=1:k
% finding interpolated values for i-th curve
Y2(i,:) = interp1(X{i},Y{i},X2);
end
% finding the mean
meanY = mean(Y2,1);
请注意,不同的插值方法可能会影响您的结果。例如,ROC图数据是阶梯数据。要在这些曲线上找到确切的值,您应该使用上一个邻居内插法,而不是线性内插法,后者是interp1
的默认方法:
Y2(i,X2); % linear
Y3(i,X2,'previous');
这是如何影响最终结果的:
,我使用Matlab的 perfcurve 解决了该问题。为此,我必须将“ label ”和“分数” 的向量列表(大小向量1xn)作为参数传递。因此, perfcurve 函数已经被理解为使用k折的一组分辨率,并且除了AUC及其置信区间之外,还返回了平均ROC曲线及其置信区间。
[X1,Y1,T1,AUC1] = perfcurve(t_test_list,resp_list,1);
t_test 和 resp 它们是大小为1xk的列表(k是倍数/ k倍),并且列表中的每个元素都是一个1xn的带有分数的向量和标签。
resp = nnet(x_test(i));
t_test_act = t_test(i);
resp 具有2xn格式(n是预测样本数)。有两节课。
t_test_act 包含当前测试集的标签,它已形成2xn并由0和1组成(每列具有1和0,表示样本的真实类别)
resp_list{i} = resp(1,:) %(scores)
t_test_list{i} = t_test_act(1,:) %(labels)
[X1,1);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。