В чем проблема с формой кривой roc при низком auc (.4)?

#matlab #svm

#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 ')
  

мой ROC

Комментарии:

1. Perfcurve создает пороговое значение для каждой отдельной точки, когда это происходит, это всегда будет пошаговый график.

2. Здесь нечего решать. Именно так это и работает. Я думаю, вы могли бы запустить функцию сглаживания, но это ухудшило бы качество.

3. какая функция сглаживания

Ответ №1:

Как указано Durkee, perfcurve функция всегда будет пошаговой. Фактически, кривая ROC является эмпирической (в отличие от теоретической) кумулятивной функцией распределения (ecdf), а ecdf по определению являются пошаговыми функциями (поскольку она вычисляет CDF на основе значений, наблюдаемых в выборке).

Обычно сглаживание кривой ROC выполняется с помощью биннинга. Вы могли бы объединить значения баллов и вычислить приблизительную кривую ROC, или вы могли бы объединить ложноположительные значения скорости, полученные с помощью фактической кривой ROC (т. Е. объединить X значения, сгенерированные perfcurve() ), которая генерирует гладкую версию, которая сохраняет область под кривой ( AUC ).

В следующем примере я покажу и сравню сглаженные кривые ROC, полученные из этих двух опций, которые могут быть выполнены с использованием TVals опции и XVals опции perfcurve функции, соответственно.

В каждом случае объединение выполняется так, что мы получаем ячейки примерно одинакового размера (равные в ряде случаев), используя tiedrank функцию. Значения, используемые для TVals и XVals опций, затем вычисляются с использованием grpstats функции в качестве max значения в каждой ячейке исходной / предварительно сгруппированной переменной ( scores или X , соответственно).

 %% 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')
  

Графический вывод из этого кода следующий:
введите описание изображения здесь

Примечание: если вы посмотрите на текстовый вывод, сгенерированный приведенным выше кодом, вы заметите, что, как и ожидалось, AUC значения для исходного ROC и сглаженной кривой ROC на основе ячеек FPR (ЗЕЛЕНЫЙ вариант) совпадают ( AUC = 0.7918 ), тогда как AUC значение для сглаженной кривой ROC на основе ячеек score (КРАСНЫЙ вариант) значительно меньше исходного AUC ( = 0.6342 ), поэтому подход FPR следует предпочесть в качестве метода сглаживания для цели построения заговора. Однако обратите внимание, что подход FPR требует вычисления кривой ROC дважды, один раз для исходной scores переменной и один раз для привязанных значений FPR ( X значений первого вычисления ROC).
Однако второго вычисления ROC можно избежать, потому что ту же сглаженную кривую ROC можно получить путем объединения X значений и вычисления max(Y) значения в каждой ячейке, как показано в следующем фрагменте:

 %% 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-')
  

И теперь вы должны увидеть приведенный выше график, где зеленая кривая была заменена пурпурной кривой с точками-звездочками.