Широкие данные через Lasso и параллельные вычисления

В этом примере показано, как использовать 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.

См. также

| | | |

Похожие темы