Этот пример показывает, как сделать более устойчивую и более простую модель, пытаясь удалить предикторы, не вредя прогностической степени модели. Это особенно важно, когда у вас есть много предикторов в данных. Линейный дискриминантный анализ использует два параметра регуляризации, Гамма и Дельта, чтобы идентифицировать и удалить избыточные предикторы. 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.