我正在尝试绘制ROC曲线。我有75个数据点,我只考虑了10个功能。我正在上楼梯,如下图所示。这是因为数据集太少了吗?我们可以添加更多点来改善曲线吗? AUC非常低.44。有什么方法可以上传csv文件?
species1= readtable('target.csv');
species1 = table2cell(species1)
meas1= readtable('feature.csv');
meas1=meas1(:,1:10);
meas1= table2array(meas1)
numObs = length(species1);
half = floor(numObs/2);
training = meas1(1:half,:);
trainingSpecies = species1(1:half);
sample = meas1(half+1:end,:);
trainingSpecies = cell2mat(trainingSpecies)
group = species1(half+1:end,:);
group = cell2mat(group)
SVMModel = fitcsvm(training,trainingSpecies)
[label,score] = predict(SVMModel,sample);
[X,Y,T,AUC] = perfcurve(group,score(:,2),'1');
plot(X,Y,'LineWidth',3)
xlabel('False positive rate')
ylabel('True positive rate')
title('ROC for Classification ')
答案 0 :(得分:0)
如Durkee所示,perfcurve
函数将始终是逐步的。实际上,ROC曲线是经验(而不是理论)累积分布函数(ecdf),而ecdf的定义是逐步函数(因为它计算CDF < em>样本中观察到的值。
通常,ROC曲线的平滑通过装箱完成。您可以对得分值进行装箱并计算近似 ROC曲线,也可以对实际ROC曲线获得的误报率值进行装箱(即对{{1}生成的X
值进行装箱}})生成一个平滑版本,该版本保留曲线下的面积(perfcurve()
)。
在下面的示例中,我将显示并比较从这两个选项获得的平滑ROC曲线,这可以使用AUC
函数的TVals
选项和XVals
选项来完成分别。
在每种情况下,都进行分箱,以便使用perfcurve
函数获得大小近似相等(箱数为等于)的箱。然后,使用tiedrank
函数作为原始/预合并变量的每个bin上的TVals
值,计算用于XVals
和grpstats
选项的值(分别为max
或scores
。
X
注意:如果查看上述代码生成的文本输出,则会注意到,正如预期的那样,原始ROC的%% Reference for the original ROC curve example: https://www.mathworks.com/help/stats/perfcurve.html
load fisheriris
pred = meas(51:end,1:2);
resp = (1:100)'>50; % Versicolor = 0, virginica = 1
mdl = fitglm(pred,resp,'Distribution','binomial','Link','logit');
scores = mdl.Fitted.Probability;
[X,Y,T,AUC] = perfcurve(species(51:end,:),scores,'virginica');
AUC
%% Define the number of bins to use for smoothing
nbins = 10;
%% Option 1 (RED): Smooth the ROC curve by defining score thresholds (based on equal-size bins of the score).
scores_grp = ceil(nbins * tiedrank(scores(:,1)) / length(scores));
scores_thr = grpstats(scores, scores_grp, @max);
[X_grpScore,Y_grpScore,T_grpScore,AUC_grpScore] = perfcurve(species(51:end,:),scores,'virginica','TVals',scores_thr);
AUC_grpScore
%% Option 2 (GREEN) Smooth the ROC curve by binning the False Positive Rate (variable X of the perfcurve() output)
X_grp = ceil(nbins * tiedrank(X(:,1)) / length(X));
X_thr = grpstats(X, X_grp, @max);
[X_grpFPR,Y_grpFPR,T_grpFPR,AUC_grpFPR] = perfcurve(species(51:end,:),scores,'virginica','XVals',X_thr);
AUC_grpFPR
%% Plot
figure
plot(X,Y,'b.-'); hold on
plot(X_grpScore,Y_grpScore,'rx-')
plot(X_grpFPR,Y_grpFPR,'g.-')
xlabel('False positive rate')
ylabel('True positive rate')
title('ROC for Classification by Logistic Regression')
legend({'Original ROC curve', ...
sprintf('Smoothed ROC curve in %d bins (based on score bins)', nbins), ...
sprintf('Smoothed ROC curve in %d bins (based on FPR bins)', nbins)}, ...
'Location', 'SouthEast')
值和基于FPR分箱(GREEN选项)上的AUC
重合(AUC = 0.7918
),而基于得分分箱(RED选项)的平滑ROC曲线的AUC
值比原始AUC(= 0.6342
),因此应首选FPR方法作为绘图的平滑技术。但是请注意,FPR方法需要两次计算ROC曲线,一次是在原始scores
变量上,一次是在合并的FPR值(第一次ROC计算的X
值)上。
但是,可以避免进行第二次ROC计算,因为可以通过对X
值进行装箱并在每个bin上计算max(Y)
值来获得相同的平滑ROC曲线,如以下代码段所示:
%% Compute max(Y) on the binned X values
% Make a dataset with the X and Y variables as columns (for easier manipulation and grouping)
ds = dataset(X,Y);
% Compute equal size bins on X and the corresponding MAX statistics
ds.X_grp = ceil(nbins * tiedrank(ds.X(:,1)) / size(ds.X,1));
ds_grp = grpstats(ds, 'X_grp', @max, 'DataVars', {'X', 'Y'});
% Add the smooth curve to the previous plot
hold on
plot(ds_grp.max_X, ds_grp.max_Y, 'mx-')
现在您应该看到上面的图,其中绿色曲线已被带有星形点的洋红色曲线所覆盖。