交差検証による LASSO および Elastic Net
この例では、LASSO と Elastic Net を使用して重量、排気量、馬力および加速度に基づく自動車の燃費 (MPG) を予測する方法を示します。
carbig
データセットを読み込みます。
load carbig
連続 (非カテゴリカル) 予測子を抽出します (LASSO はカテゴリカル予測子を扱いません)。
X = [Acceleration Displacement Horsepower Weight];
10 分割交差検証で LASSO 近似を実行します。
[b,fitinfo] = lasso(X,MPG,'CV',10);
結果をプロットします。
lassoPlot(b,fitinfo,'PlotType','Lambda','XScale','log');
予測子の相関性を計算します。はじめに NaN を削除します。
nonan = ~any(isnan([X MPG]),2); Xnonan = X(nonan,:); MPGnonan = MPG(nonan,:); corr(Xnonan)
ans = 4×4
1.0000 -0.5438 -0.6892 -0.4168
-0.5438 1.0000 0.8973 0.9330
-0.6892 0.8973 1.0000 0.8645
-0.4168 0.9330 0.8645 1.0000
一部の予測子は非常に相関性が高いため、Elastic Net 近似を実行します。Alpha
= 0.5 を使用します。
[ba,fitinfoa] = lasso(X,MPG,'CV',10,'Alpha',.5);
結果をプロットします。曲線を識別できるようにするため、各予測子に名前を付けます。
pnames = {'Acceleration','Displacement','Horsepower','Weight'}; lassoPlot(ba,fitinfoa,'PlotType','Lambda','XScale','log',... 'PredictorNames',pnames);
データ カーソルを有効にしてプロットをクリックすると、予測子の名前、係数、Lambda
の値、およびその当てはめに関連した b
内の列を示す点のインデックスが表示されます。
ここでは、Elastic Net と LASSO の結果はあまり似ていません。また、Elastic Net プロットには、Elastic Net 手法の顕著な品質特性が反映されています。Elastic Net では、Lambda
が大きくなっても (プロットの左側に向かっても) 3 つの係数が非ゼロのままであり、これらの 3 つの係数はほぼ同じ Lambda
の値で 0 に達します。これに対して LASSO プロットでは、3 つの係数のうち 2 つが同じ値の Lambda
で 0 になり、もう 1 つの係数は大きい値の Lambda
について非ゼロのままであることが示されています。
この挙動は、一般的なパターンを説明しています。通常、Elastic Net は Lambda
が増えるにつれて、相関性の高い予測子のグループを保持するか、または棄却する傾向があります。これに対して、LASSO はより小さなグループまたは個別の予測子を棄却する傾向があります。
参考
lasso
| lassoglm
| fitrlinear
| lassoPlot
| ridge