В этом примере показано, как упорядочить модель со значительно большим количеством предикторов, чем наблюдения. Широкие данные являются данными с большим количеством предикторов, чем наблюдения. Как правило, с широкими данными вы хотите идентифицировать важные предикторы. Используйте lassoglm
как исследовательский или экранирующий инструмент, чтобы выбрать меньший набор переменных, чтобы приоритизировать ваше моделирование и исследование. Используйте параллельные вычисления, чтобы ускорить перекрестную проверку.
Загрузите ovariancancer
данные. Эти данные имеют 216 наблюдений и 4 000 предикторов в 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 6 workers. ans = Pool 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 82.390258 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 14.668383 seconds.
Графически сравните новые результаты с первыми результатами.
lassoPlot(Bquick,Squick,'PlotType','CV'); legend('show') % Show legend
lassoPlot(Bquick,Squick,'PlotType','Lambda','XScale','log')
Количество ненулевых коэффициентов в самом низком плюс одна модель стандартного отклонения - приблизительно 50, похожие на первый расчет.