Широкие Данные через Лассо и Параллельные вычисления

Этот пример показывает, как использовать lasso наряду с перекрестной проверкой, чтобы идентифицировать важные предикторы.

Загрузите выборочные данные и отобразите описание.

load spectra
Description
Description =

  11×72 char array

    '== Spectral and octane data of gasoline ==                              '
    '                                                                        '
    'NIR spectra and octane numbers of 60 gasoline samples                   '
    '                                                                        '
    'NIR:     NIR spectra, measured in 2 nm intervals from 900 nm to 1700 nm '
    'octane:  octane numbers                                                 '
    'spectra: a dataset array containing variables for NIR and octane        '
    '                                                                        '
    'Reference:                                                              '
    'Kalivas, John H., "Two Data Sets of Near Infrared Spectra," Chemometrics'
    'and Intelligent Laboratory Systems, v.37 (1997) pp.255-259              '

Ловите арканом и эластичная сеть особенно хорошо подходят для широких данных, то есть, данных с большим количеством предикторов, чем наблюдения с лассо и эластичной сетью. Существуют избыточные предикторы в этом типе данных. Можно использовать lasso наряду с перекрестной проверкой, чтобы идентифицировать важные предикторы.

Вычислите подгонку lasso по умолчанию.

[b fitinfo] = lasso(NIR,octane);

Постройте количество предикторов в подходящей регуляризации лассо как функция Lambda, с помощью логарифмического x - ось.

lassoPlot(b,fitinfo,'PlotType','Lambda','XScale','log');

Трудно сказать, какое значение Lambda является соответствующим. Чтобы определить хорошее значение, попытайтесь соответствовать перекрестной проверке.

tic
[b fitinfo] = lasso(NIR,octane,'CV',10);
toc
Elapsed time is 7.353767 seconds.

Постройте результат.

lassoPlot(b,fitinfo,'PlotType','Lambda','XScale','log');

Отобразите предложенное значение Lambda.

fitinfo.Lambda1SE
ans =

    0.0302

Отобразите Lambda с минимальным MSE.

fitinfo.LambdaMinMSE
ans =

    0.0144

Исследуйте качество пригодного для предложенного значения Lambda.

lambdaindex = fitinfo.Index1SE;
mse = fitinfo.MSE(lambdaindex)
df = fitinfo.DF(lambdaindex)
mse =

    0.0528


df =

    11

Подгонка использует всего 11 из этого 401 предиктора и достигает маленького перекрестного подтвержденного MSE.

Исследуйте график перекрестного подтвержденного MSE.

lassoPlot(b,fitinfo,'PlotType','CV');
% Use a log scale for MSE to see small MSE values better
set(gca,'YScale','log');

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

Набор по умолчанию значений Lambda не включает значения, достаточно маленькие, чтобы включать все предикторы. В этом случае, кажется, нет причины посмотреть на меньшие значения. Однако, если вы хотите меньшие значения, чем значение по умолчанию, используйте параметр LambdaRatio или предоставьте последовательность значений Lambda с помощью параметра Lambda. Для получения дополнительной информации смотрите страницу с описанием lasso.

Перекрестная проверка может быть медленной. Если вы имеете лицензию Parallel Computing Toolbox, ускоряете вычисление перекрестной подтвержденной оценки лассо с помощью параллельных вычислений. Запустите параллельный пул.

mypool = parpool()
Starting parallel pool (parpool) using the 'local' profile ...
connected to 6 workers.

mypool = 

 Pool with properties: 

            Connected: true
           NumWorkers: 6
              Cluster: local
        AttachedFiles: {}
    AutoAddClientPath: true
          IdleTimeout: 30 minutes (30 minutes remaining)
          SpmdEnabled: true

Установите опцию параллельных вычислений и вычислите оценку лассо.

opts = statset('UseParallel',true);
tic;
[b fitinfo] = lasso(NIR,octane,'CV',10,'Options',opts);
toc
Elapsed time is 3.799009 seconds.

Вычисление в параллели с помощью двух рабочих быстрее на этой проблеме.

Остановите параллельный пул.

delete(mypool)
Parallel pool using the 'local' profile is shutting down.