Этот пример показывает, как сделать более устойчивую и более простую модель путем попытки удалить предикторы, не повреждая предсказательную силу модели. Это особенно важно, когда у вас есть много предикторов в ваших данных. Линейный дискриминантный анализ использует два параметра регуляризации, Гамму и 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.
Постройте количество предикторов против ошибки.
figure; plot(err,numpred,'k.') xlabel('Error rate'); ylabel('Number of predictors');
Исследуйте нижнюю левую часть графика более тесно.
axis([0 .1 0 1000])
Существует ясный компромисс между более низким количеством предикторов и более низкой ошибкой.
Несколько пар Gamma
и значений Delta
производят о той же минимальной ошибке. Отобразите индексы этих пар и их значений.
minerr = min(min(err)) [p,q] = find(err < minerr + 1e-4); % Subscripts of err producing minimal error numel(p) idx = sub2ind(size(delta),p,q); % Convert from subscripts to linear indices [gamma(p) delta(idx)]
minerr = 0.0139 ans = 4 ans = 0.7202 0.1145 0.7602 0.1131 0.8001 0.1128 0.8001 0.1410
Эти точки имеют только 20% общих предикторов, которые имеют ненулевые коэффициенты в модели.
numpred(idx)/ceil(numPred/3)*100
ans = 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 = 0.0185 173.0000
Вам нужны 195 предикторов, чтобы достигнуть коэффициента ошибок 0,0185, и это - самый низкий коэффициент ошибок среди тех, которые имеют 200 предикторов или меньше.
Отобразите Gamma
и Delta
, которые достигают этой ошибки/номера предикторов.
[r,s] = find((err == low200) & (numpred == lownum)); [gamma(r); delta(r,s)]
ans = 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.