低auc(.4)的roc曲线的形状有什么问题?

时间:2019-03-22 09:38:52

标签: matlab svm

我正在尝试绘制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 ')

my ROC

1 个答案:

答案 0 :(得分:0)

如Durkee所示,perfcurve函数将始终是逐步的。实际上,ROC曲线是经验(而不是理论)累积分布函数(ecdf),而ecdf的定义是逐步函数(因为它计算CDF < em>样本中观察到的值。

通常,ROC曲线的平滑通过装箱完成。您可以对得分值进行装箱并计算近似 ROC曲线,也可以对实际ROC曲线获得的误报率值进行装箱(即对{{1}生成的X值进行装箱}})生成一个平滑版本,该版本保留曲线下的面积perfcurve())。

在下面的示例中,我将显示并比较从这两个选项获得的平滑ROC曲线,这可以使用AUC函数的TVals选项和XVals选项来完成分别。

在每种情况下,都进行分箱,以便使用perfcurve函数获得大小近似相等(箱数为等于)的箱。然后,使用tiedrank函数作为原始/预合并变量的每个bin上的TVals值,计算用于XValsgrpstats选项的值(分别为maxscores

X

此代码的图形输出如下: enter image description here

注意:如果查看上述代码生成的文本输出,则会注意到,正如预期的那样,原始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-')

现在您应该看到上面的图,其中绿色曲线已被带有星形点的洋红色曲线所覆盖。