メインコンテンツ

LASSO および並列計算によるワイド データ

この例では、lasso と交差検証を使用して重要な予測子を特定する方法を示します。

標本データを読み込みます。

load spectra

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 1.309120 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 'Processes' profile ...
13-Nov-2024 15:35:53: Job Queued. Waiting for parallel pool job with ID 1 to start ...
Connected to parallel pool with 4 workers.

mypool = 

 ProcessPool with properties: 

            Connected: true
           NumWorkers: 4
                 Busy: false
              Cluster: Processes (Local Cluster)
        AttachedFiles: {}
    AutoAddClientPath: true
            FileStore: [1x1 parallel.FileStore]
           ValueStore: [1x1 parallel.ValueStore]
          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 1.829342 seconds.

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

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

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

参考

| | | |

トピック