В этом примере показано, как регуляризовать модель с гораздо большим количеством предикторов, чем наблюдения. Широкие данные - это данные с большим количеством предикторов, чем наблюдения. Как правило, с широкими данными вы хотите определить важные предикторы. Использовать lassoglm как исследовательский или скрининговый инструмент для выбора меньшего набора переменных, чтобы расставить приоритеты в моделировании и исследованиях. Используйте параллельные вычисления для ускорения перекрестной проверки.
Загрузить ovariancancer данные. Эти данные имеют 216 наблюдений и 4000 предикторов в obs переменная рабочей области. Ответы двоичные, либо 'Cancer' или 'Normal', в grp переменная рабочей области. Преобразовать ответы в двоичные для использования в lassoglm.
load ovariancancer y = strcmp(grp,'Cancer');
Задайте параметры для использования параллельных вычислений. Подготовка к параллельному вычислению с использованием parpool.
opt = statset('UseParallel',true);
parpool()Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 6).
ans =
ProcessPool with properties:
Connected: true
NumWorkers: 6
Cluster: local
AttachedFiles: {}
AutoAddClientPath: true
IdleTimeout: 30 minutes (30 minutes remaining)
SpmdEnabled: true
Подгонка перекрестно проверенного набора регуляризованных моделей. Используйте Alpha параметр в пользу сохранения групп высоко коррелированных предикторов, в отличие от исключения всех членов группы, кроме одного. Обычно используется относительно большое значение Alpha.
rng('default') % For reproducibility tic [B,S] = lassoglm(obs,y,'binomial','NumLambda',100, ... 'Alpha',0.9,'LambdaRatio',1e-4,'CV',10,'Options',opt); toc
Elapsed time is 90.892114 seconds.
Изучите график перекрестной проверки.
lassoPlot(B,S,'PlotType','CV'); legend('show') % Show legend

Изучить график трассировки.
lassoPlot(B,S,'PlotType','Lambda','XScale','log')

Правая (зеленая) вертикальная пунктирная линия представляет Lambda обеспечение наименьшего перекрестно подтвержденного отклонения. Левая (синяя) пунктирная линия имеет минимальное отклонение плюс не более одного стандартного отклонения. Эта синяя линия имеет гораздо меньше предикторов:
[S.DF(S.Index1SE) S.DF(S.IndexMinDeviance)]
ans = 1×2
50 89
Вы спросили lassoglm для подгонки с использованием 100 различных Lambda значения. Сколько он использовал?
size(B)
ans = 1×2
4000 84
lassoglm остановлено после 84 значений, потому что отклонение было слишком маленьким для малого Lambda значения. Во избежание переоборудования, lassoglm останавливается, когда отклонение подогнанной модели слишком мало по сравнению с отклонением в двоичных откликах, игнорируя переменные предиктора.
Вы можете форсировать lassoglm для включения дополнительных терминов с помощью 'Lambda' аргумент пары имя-значение. Например, определите набор Lambda значения, которые дополнительно включают три значения, меньшие, чем значения в S.Lambda.
minLambda = min(S.Lambda); explicitLambda = [minLambda*[.1 .01 .001] S.Lambda];
Определить 'Lambda',explicitLambda при вызове lassoglm функция. lassoglm останавливается, когда отклонение подогнанной модели слишком мало, даже если вы явно предоставляете набор Lambda значения.
Для экономии времени можно использовать:
Меньше Lambda, что означает меньшее количество посадок
Меньше складок перекрестной проверки
Большее значение для LambdaRatio
Используйте последовательные вычисления и все три метода экономии времени:
tic [Bquick,Squick] = lassoglm(obs,y,'binomial','NumLambda',25,... 'LambdaRatio',1e-2,'CV',5); toc
Elapsed time is 16.517331 seconds.
Графическое сравнение новых результатов с первыми результатами.
lassoPlot(Bquick,Squick,'PlotType','CV'); legend('show') % Show legend

lassoPlot(Bquick,Squick,'PlotType','Lambda','XScale','log')

Количество ненулевых коэффициентов в модели с наименьшим плюс одним стандартным отклонением составляет около 50, аналогично первому вычислению.