В этом примере показано, как сделать модель более надежной и простой, пытаясь удалить предикторы без ущерба для прогнозирующей силы модели. Это особенно важно, когда в данных много предикторов. Линейный дискриминантный анализ использует два параметра регуляризации, Гамма и Дельта, для идентификации и удаления избыточных предикторов. cvshrink помогает определить соответствующие настройки для этих параметров.
Создание классификатора линейного дискриминантного анализа для ovariancancer данные. Установите SaveMemory и FillCoeffs аргументы пары «имя-значение» для сохранения достаточно малого размера получаемой модели. Для простоты вычислений этот пример использует случайное подмножество примерно одной трети предикторов для обучения классификатора.
load ovariancancer rng(1); % For reproducibility numPred = size(obs,2); obs = obs(:,randsample(numPred,ceil(numPred/3))); Mdl = fitcdiscr(obs,grp,'SaveMemory','on','FillCoeffs','off');
Использовать 25 уровней Gamma и 25 уровней Delta для поиска хороших параметров. Этот поиск занимает много времени. Набор Verbose кому 1 для просмотра хода выполнения.
[err,gamma,delta,numpred] = cvshrink(Mdl,... 'NumGamma',24,'NumDelta',24,'Verbose',1);
Done building cross-validated model. Processing Gamma step 1 out of 25. Processing Gamma step 2 out of 25. Processing Gamma step 3 out of 25. Processing Gamma step 4 out of 25. Processing Gamma step 5 out of 25. Processing Gamma step 6 out of 25. Processing Gamma step 7 out of 25. Processing Gamma step 8 out of 25. Processing Gamma step 9 out of 25. Processing Gamma step 10 out of 25. Processing Gamma step 11 out of 25. Processing Gamma step 12 out of 25. Processing Gamma step 13 out of 25. Processing Gamma step 14 out of 25. Processing Gamma step 15 out of 25. Processing Gamma step 16 out of 25. Processing Gamma step 17 out of 25. Processing Gamma step 18 out of 25. Processing Gamma step 19 out of 25. Processing Gamma step 20 out of 25. Processing Gamma step 21 out of 25. Processing Gamma step 22 out of 25. Processing Gamma step 23 out of 25. Processing Gamma step 24 out of 25. Processing Gamma step 25 out of 25.
Постройте график количества предикторов по отношению к ошибке.
plot(err,numpred,'k.') xlabel('Error rate') ylabel('Number of predictors')

Более внимательно изучите левую нижнюю часть графика.
axis([0 .1 0 1000])

Существует четкий компромисс между меньшим количеством предикторов и меньшей ошибкой.
Несколько пар Gamma и Delta значения дают примерно такую же минимальную ошибку. Отображение индексов этих пар и их значений.
Сначала найдите минимальное значение ошибки.
minerr = min(min(err))
minerr = 0.0139
Найти подстрочные значения err получение минимальной погрешности.
[p,q] = find(err < minerr + 1e-4);
Преобразование из подстрочных индексов в линейные индексы.
idx = sub2ind(size(delta),p,q);
Отображение Gamma и Delta значения.
[gamma(p) delta(idx)]
ans = 4×2
0.7202 0.1145
0.7602 0.1131
0.8001 0.1128
0.8001 0.1410
Эти точки имеют всего 29% от общего числа предикторов с ненулевыми коэффициентами в модели.
numpred(idx)/ceil(numPred/3)*100
ans = 4×1
39.8051
38.9805
36.8066
28.7856
Чтобы еще больше уменьшить число предикторов, необходимо принять более высокие коэффициенты ошибок. Например, чтобы выбрать Gamma и Delta которые дают самую низкую частоту ошибок с 200 или менее предикторами.
low200 = min(min(err(numpred <= 200))); lownum = min(min(numpred(err == low200))); [low200 lownum]
ans = 1×2
0.0185 173.0000
Вам нужно 173 предиктора, чтобы достичь коэффициента ошибок 0,0185, и это самый низкий коэффициент ошибок среди тех, у кого 200 предикторов или меньше.
Отображение Gamma и Delta которые достигают этой ошибки/количества предикторов.
[r,s] = find((err == low200) & (numpred == lownum)); [gamma(r); delta(r,s)]
ans = 2×1
0.6403
0.2399
Установка классификатора с этими значениями Gamma и Delta, используйте точечную нотацию.
Mdl.Gamma = gamma(r); Mdl.Delta = delta(r,s);
Чтобы сравнить cvshrink расчет с таковым в Го, Хасти и Тибширани [1], график тепловых карт ошибки и количество предикторов против Gamma и индекс Delta параметр. ( Delta диапазон параметров зависит от значения Gamma параметр. Таким образом, чтобы получить прямоугольный график, используйте Delta индекс, а не сам параметр.)
% Create the Delta index matrix indx = repmat(1:size(delta,2),size(delta,1),1); figure subplot(1,2,1) imagesc(err) colorbar colormap('jet') title('Classification error') xlabel('Delta index') ylabel('Gamma index') subplot(1,2,2) imagesc(numpred) colorbar title('Number of predictors in the model') xlabel('Delta index') ylabel('Gamma index')

Вы видите лучшую ошибку классификации, когда Delta является небольшим, но меньше предикторов, когда Delta большой.
[1] Го, Я., Т. Хасти и Р. Тибширани. «Регуляризованный дискриминантный анализ и его применение в микрочипе». Биостатистика, том 8, № 1, стр. 86-100, 2007.