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