Main Content

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 と Elastic Net は、ワイド データ、つまり、観測値よりも多くの予測子をもつデータに特に適しています。このタイプのデータには冗長な予測子があります。交差検証とともに lasso を使用すると、重要な予測子を識別できます。

既定の lasso 近似を計算します。

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

対数 x 軸を使用して、当てはめた LASSO 正則化の予測子の個数を Lambda の関数としてプロットします。

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

MSE が最小である Lambda を表示します。

fitinfo.LambdaMinMSE
ans =

    0.0144

Lambda の推奨値について当てはめの品質を調べます。

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

    0.0528


df =

    11

この当てはめでは 401 個の予測子のうち 11 個だけを使用しましたが、交差検証済み 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 のライセンスがある場合は、並列計算を使用して交差検証済み LASSO 推定値の計算を高速化できます。並列プールを起動します。

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

並列計算オプションを設定し、LASSO 推定値を計算します。

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

2 つのワーカーを使用して並列計算を行うと、この問題では高速になります。

並列プールを停止します。

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

参考

| | | |

関連するトピック