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

使用Matlab进行交叉验证和ROC曲线:如何绘制平均ROC曲线?,matlab,cross-validation,roc,auc,k-fold,Matlab,Cross Validation,Roc,Auc,K Fold,我使用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条曲线,具有不同数量的点,所有曲线在两个维度

我使用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]
间隔绑定。首先,需要计算指定查询点处每条曲线的插值。现在您有了固定点数的新曲线,可以计算它们的平均值。该函数将执行插值部分

%%生成示例数据
k=10;
X=单元(k,1);
Y=单元(k,1);
等等
对于i=1:k
n=10+randi(10);
X{i}=sort([01rand(1,n)]);
Y{i}=sort([01rand(1,n)]。^.5);
结束
%%计算插值
%查询点的位置
X2=linspace(0,1,50);
n=努美尔(X2);
%在不同查询点初始化不同曲线的值
Y2=零(k,n);
对于i=1:k
%寻找第i条曲线的插值
Y2(i,:)=interp1(X{i},Y{i},X2);
结束
%求平均值
平均值y=平均值(Y2,1);

请注意,不同的插值方法可能会影响结果。例如,ROC绘图数据是一种楼梯数据。要找到此类曲线上的精确值,应使用上一个相邻插值方法,而不是线性插值,线性插值是
interp1
的默认方法:

Y2(i, :) = interp1(X{i}, Y{i}, X2); % linear
Y3(i, :) = interp1(X{i}, Y{i}, X2, 'previous');

这就是它如何影响最终结果:


因此,在两个维度中,都有具有不同点数的
k
曲线,所有曲线都以
[0..1]
间隔为界。首先,需要计算指定查询点处每条曲线的插值。现在您有了固定点数的新曲线,可以计算它们的平均值。该函数将执行插值部分

%%生成示例数据
k=10;
X=单元(k,1);
Y=单元(k,1);
等等
对于i=1:k
n=10+randi(10);
X{i}=sort([01rand(1,n)]);
Y{i}=sort([01rand(1,n)]。^.5);
结束
%%计算插值
%查询点的位置
X2=linspace(0,1,50);
n=努美尔(X2);
%在不同查询点初始化不同曲线的值
Y2=零(k,n);
对于i=1:k
%寻找第i条曲线的插值
Y2(i,:)=interp1(X{i},Y{i},X2);
结束
%求平均值
平均值y=平均值(Y2,1);

请注意,不同的插值方法可能会影响结果。例如,ROC绘图数据是一种楼梯数据。要找到此类曲线上的精确值,应使用上一个相邻插值方法,而不是线性插值,线性插值是
interp1
的默认方法:

Y2(i, :) = interp1(X{i}, Y{i}, X2); % linear
Y3(i, :) = interp1(X{i}, Y{i}, X2, 'previous');

这就是它如何影响最终结果:


我使用Matlab的性能曲线求解它。为此,我必须将“标签”和“分数”的向量列表(大小向量1xn)作为参数传递。因此,perfcurve函数已经理解为一组使用k-fold进行的分辨率,并返回平均ROC曲线及其置信区间,以及AUC及其置信区间

[X1,Y1,T1,AUC1]=性能曲线(t\u测试列表,对应列表,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,表示样本的真实类别)


我用Matlab的perfcurve解决了这个问题。为此,我必须将“标签”和“分数”的向量列表(大小向量1xn)作为参数传递。因此,perfcurve函数已经理解为一组使用k-fold进行的分辨率,并返回平均ROC曲线及其置信区间,以及AUC及其置信区间

[X1,Y1,T1,AUC1]=性能曲线(t\u测试列表,对应列表,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,表示样本的真实类别)


谢谢你的回答。我发现了一个使用perfcurve的解决方案,我相信这是一个更简单的任务,但你的答案也是很多。谢谢你的回答。我使用perfcurve找到了一个解决方案,我相信这是一个更简单的任务,但您的答案也很多。