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.
参考
lasso | lassoglm | fitrlinear | lassoPlot | ridge