微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用Matlab进行交叉验证和ROC曲线:如何绘制平均ROC曲线?

如何解决使用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);

enter image description here

请注意,不同的插值方法可能会影响您的结果。例如,ROC图数据是阶梯数据。要在这些曲线上找到确切的值,您应该使用上一个邻居内插法,而不是线性内插法,后者是interp1的默认方法:

Y2(i,X2); % linear
Y3(i,X2,'previous');

enter image description here

这是如何影响最终结果的:

enter image description here

,

我使用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 举报,一经查实,本站将立刻删除。