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