Этот пример показывает, как сделать более устойчивую и более простую модель, пытаясь удалить предикторы, не вредя прогностической степени модели. Это особенно важно, когда у вас есть много предикторов в данных. Линейный дискриминантный анализ использует два параметра регуляризации, Гамма и Дельта, чтобы идентифицировать и удалить избыточные предикторы. The 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 вычисление по таковому в Guo, Hastie и Tibshirani [1], график тепловых карт ошибки и количества предикторов против Gamma и индекс Delta параметр. (The 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] Guo, Y., T. Hastie, and R. Tibshirani. «Упорядоченный дискриминантный анализ и его применение в микромассиве». Биостатистика, том 8, № 1, стр. 86-100, 2007.