このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
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.
参考
lasso
| lassoglm
| fitrlinear
| lassoPlot
| ridge