В чем проблема с формой кривой roc с низким auc (.4)? - PullRequest
0 голосов
/ 22 марта 2019

Я пытаюсь построить кривую 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 голосов
/ 25 марта 2019

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

Обычно сглаживание кривой ROC выполняется с помощью биннинга. Вы можете связать значения баллов и вычислить приблизительную ROC-кривую, или вы можете добавить значения False Positive Rate, полученные по фактической ROC-кривой (т. Е. Bin * 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')

Графический вывод этого кода следующий: enter image description here

Примечание : если вы посмотрите на текстовый вывод, сгенерированный вышеуказанным кодом, вы заметите, что, как и ожидалось, значения AUC для исходного ROC и сглаженной кривой ROC на основе бинов FPR (Опция GREEN) совпадают (AUC = 0.7918), тогда как значение AUC для сглаженной кривой ROC, основанной на бинах оценок (опция RED), значительно меньше, чем исходный 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-')

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

...