В этом примере показано, как сделать более устойчивую и более простую модель путем попытки удалить предикторы, не повреждая предсказательную силу модели. Это особенно важно, когда у вас есть много предикторов в ваших данных. Линейный дискриминантный анализ использует два параметра регуляризации, Гамму и Delta, чтобы идентифицировать и удалить избыточные предикторы. 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); numel(p)
ans = 4
Преобразуйте от индексов до линейных индексов.
idx = sub2ind(size(delta),p,q); [gamma(p) delta(idx)]
ans = 4×2
0.7202 0.1145
0.7602 0.1131
0.8001 0.1128
0.8001 0.1410
Эти точки имеют только 20% общих предикторов, которые имеют ненулевые коэффициенты в модели.
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
Вам нужны 195 предикторов, чтобы достигнуть коэффициента ошибок 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
вычисление к этому в Го, Hastie, и Tibshirani [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] Го, Y., Т. Хэсти и Р. Тибширэни. Упорядоченный Дискриминантный анализ и Его Приложение в Микромассиве. Биостатистика, Издание 8, № 1, стр 86–100, 2007.