#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 ')
Комментарии:
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-')
И теперь вы должны увидеть приведенный выше график, где зеленая кривая была заменена пурпурной кривой с точками-звездочками.