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