Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

lasso

線形モデルに対する LASSO または Elastic Net 正則化

説明

B = lasso(X,y) は、予測子データ X および応答 y の線形モデルについて当てはめた最小二乗回帰係数を返します。B の各列は Lambda 内の特定の正則化係数に対応します。既定では、lassoLambda の値の等比数列を使用して LASSO 正則化を実行します。

B = lasso(X,y,Name,Value) は、1 つ以上の名前と値のペアの引数で指定された追加オプションを使用して、正則化された回帰を当てはめます。たとえば 'Alpha',0.5 は、パラメーター Alpha が 0.5 に等しい Elastic Net を正則化の手法として設定します。

[B,FitInfo] = lasso(___) は、前の構文の入力引数のいずれかを使用して、モデルの当てはめに関する情報が格納されている構造体 FitInfo も返します。

すべて折りたたむ

冗長な予測子があるデータセットを作成し、lasso を使用してこれらの予測子を識別します。

100 個の 5 次元正規変数が含まれている行列 X を作成します。X の 2 つの成分のみから応答ベクトル y を作成し、小量のノイズを追加します。

rng default % For reproducibility
X = randn(100,5);
weights = [0;2;0;-3;0]; % Only two nonzero coefficients
y = X*weights + randn(100,1)*0.1; % Small added noise

既定の LASSO 近似を作成します。

B = lasso(X,y);

B 内の 25 番目の Lambda の値について係数ベクトルを求めます。

B(:,25)
ans = 5×1

         0
    1.6093
         0
   -2.5865
         0

lasso は冗長予測子を識別して、削除します。

予測子変数を X、応答変数を y=0+2X+ε として標本データを作成します。

rng('default') % For reproducibility
X = rand(100,1);
y = 2*X + randn(100,1)/10;

正則化の値を指定し、切片項のない回帰モデルの係数を求めます。

lambda = 1e-03;
B = lasso(X,y,'Lambda',lambda,'Intercept',false)
Warning: When the 'Intercept' value is false, the 'Standardize' value is set to false.
B = 1.9825

予測値 (線) に対して実数値 (点) をプロットします。

scatter(X,y)
hold on
x = 0:0.1:1;
plot(x,x*B)
hold off

Figure contains an axes object. The axes object contains 2 objects of type scatter, line.

冗長な予測子があるデータセットを作成し、交差検証された lasso を使用してこれらの予測子を識別します。

100 個の 5 次元正規変数が含まれている行列 X を作成します。X の 2 つの成分から応答ベクトル y を作成し、小量のノイズを追加します。

rng default % For reproducibility
X = randn(100,5);
weights = [0;2;0;-3;0]; % Only two nonzero coefficients
y = X*weights + randn(100,1)*0.1; % Small added noise

予測子変数にラベルを付け、10 分割交差検証を使用して、LASSO 近似を作成します。

[B,FitInfo] = lasso(X,y,'CV',10,'PredictorNames',{'x1','x2','x3','x4','x5'});

最小の交差検証平均二乗誤差 (MSE) に対応するモデル内の変数を表示します。

idxLambdaMinMSE = FitInfo.IndexMinMSE;
minMSEModelPredictors = FitInfo.PredictorNames(B(:,idxLambdaMinMSE)~=0)
minMSEModelPredictors = 1x2 cell
    {'x2'}    {'x4'}

最小の MSE から 1 標準誤差以内にある、最もスパースなモデル内の変数を表示します。

idxLambda1SE = FitInfo.Index1SE;
sparseModelPredictors = FitInfo.PredictorNames(B(:,idxLambda1SE)~=0)
sparseModelPredictors = 1x2 cell
    {'x2'}    {'x4'}

この例では、lasso は 2 つのモデルについて同じ予測子を識別し、冗長な予測子を削除します。

さまざまな正則化レベルで交差検証誤差を視覚的に調べます。

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

load acetylene

定数項を持たない、交互作用がある計画行列を作成します。

X = [x1 x2 x3];
D = x2fx(X,"interaction");
D(:,1) = []; % No constant term

10 分割交差検証を使用して LASSO 近似を作成します。結果をプロットできるように、出力 FitInfo を含めます。

rng default % For reproducibility 
[B,FitInfo] = lasso(D,y,CV=10);

交差検証した近似をプロットします。緑の円と点線は、交差検証誤差が最小になる Lambda を示しています。青の円と点線は、最小交差検証誤差に 1 標準誤差を加算した点を示しています。

lassoPlot(B,FitInfo,PlotType="CV");
legend("show")

Figure contains an axes object. The axes object with title Cross-Validated MSE of Lasso Fit, xlabel Lambda, ylabel MSE contains 5 objects of type errorbar, line. One or more of the lines displays its values using only markers These objects represent MSE with Error Bars, LambdaMinMSE, Lambda1SE.

lasso と Elastic Net 法を使用して、学生の試験の点数を予測します。

examgrades データセットを読み込みます。

load examgrades
X = grades(:,1:4);
y = grades(:,5);

データを学習セットとテスト セットに分割します。

n = length(y);
c = cvpartition(n,'HoldOut',0.3);
idxTrain = training(c,1);
idxTest = ~idxTrain;
XTrain = X(idxTrain,:);
yTrain = y(idxTrain);
XTest = X(idxTest,:);
yTest = y(idxTest);

10 分割交差検証と Alpha = 0.75 の Elastic Net 法を使用して、正則化された線形回帰モデルの係数を求めます。平均二乗誤差 (MSE) が最小 MSE から 1 標準誤差以内になる最大の Lambda の値を使用します。

[B,FitInfo] = lasso(XTrain,yTrain,'Alpha',0.75,'CV',10);
idxLambda1SE = FitInfo.Index1SE;
coef = B(:,idxLambda1SE);
coef0 = FitInfo.Intercept(idxLambda1SE);

テスト データについて試験の点数を予測します。基準線を使用して、予測された値を実際の試験の成績と比較します。

yhat = XTest*coef + coef0;
hold on
scatter(yTest,yhat)
plot(yTest,yTest)
xlabel('Actual Exam Grades')
ylabel('Predicted Exam Grades')
hold off

Figure contains an axes object. The axes object with xlabel Actual Exam Grades, ylabel Predicted Exam Grades contains 2 objects of type scatter, line.

N 個の p 次元正規変数が含まれている行列 X を作成します。ここで N は大きく、p = 1000 です。モデル y = beta0 + X*p から加法性ノイズとともに応答ベクトル y を作成します。ここで beta0 は定数です。

rng default % For reproducibility
N = 1e4; % Number of samples
p = 1e3; % Number of features
X = randn(N,p);
beta = randn(p,1); % Multiplicative coefficients
beta0 = randn; % Additive term
y = beta0 + X*beta + randn(N,1); % Last term is noise

既定の LASSO 近似を作成します。作成時間を計ります。

B = lasso(X,y,"UseCovariance",false); % Warm up lasso for reliable timing data
tic
B = lasso(X,y,"UseCovariance",false);
timefalse = toc
timefalse = 30.7600

共分散行列を使用して LASSO 当てはめを作成します。作成時間を計ります。

B2 = lasso(X,y,"UseCovariance",true); % Warm up lasso for reliable timing data
tic
B2 = lasso(X,y,"UseCovariance",true);
timetrue = toc
timetrue = 0.6863

共分散行列を使用した当てはめ時間は、使用しない場合の時間よりはるかに小さいです。共分散行列を使用した結果の高速化係数を表示します。

speedup = timefalse/timetrue
speedup = 44.8201

返された係数 B および B2 が似ていることを確認します。

norm(B-B2)/norm(B)
ans = 5.2508e-15

結果は実質的に同一です。

入力引数

すべて折りたたむ

予測子データ。数値行列として指定します。各行は 1 つの観測値を、各列は 1 つの予測子変数を表します。

データ型: single | double

応答データ。数値ベクトルを指定します。y の長さは n です。n は X の行数です。応答 y(i)X の i 番目の行に対応します。

データ型: single | double

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名、Value は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。

R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name を引用符で囲みます。

例: lasso(X,y,'Alpha',0.75,'CV',10) は、10 分割交差検証を使用して Elastic Net 正則化を実行します。名前と値のペアの引数 'Alpha',0.75 は、Elastic Net 最適化で使用されるパラメーターを設定します。

ADMM アルゴリズムの収束の判定に使用する絶対許容誤差。'AbsTol' と正のスカラーから構成されるコンマ区切りのペアとして指定します。このアルゴリズムは、係数ベクトルの連続する推定値の差異が AbsTol 未満の量になると収束します。

メモ

このオプションは、tall 配列に対して lasso を使用する場合のみ適用されます。詳細は、拡張機能を参照してください。

例: 'AbsTol',1e–3

データ型: single | double

リッジ (L2) 最適化に対する LASSO (L1) 最適化の重み。'Alpha' と区間 (0,1] にある正のスカラー値から構成されるコンマ区切りのペアとして指定します。値 Alpha = 1 は LASSO 回帰を表します。0 に近い Alphaリッジ回帰に近づき、他の値は Elastic Net 最適化を表します。Elastic Netを参照してください。

例: 'Alpha',0.5

データ型: single | double

ADMM アルゴリズムにおける x の係数の初期値。'B0' と数値ベクトルから構成されるコンマ区切りのペアとして指定します。

メモ

このオプションは、tall 配列に対して lasso を使用する場合のみ適用されます。詳細は、拡張機能を参照してください。

データ型: single | double

メガバイト単位の共分散行列のサイズ。正のスカラーまたは 'maximal' を指定します。関数 lasso は、引数 UseCovariancetrue または 'auto' の場合、当てはめに共分散行列を使用できます。

UseCovariancetrue または 'auto' であり、CacheSize'maximal' である場合、lasso は利用可能なメモリを超える共分散行列を割り当てようとする場合があります。この場合、MATLAB® はエラーを生成します。

例: 'CacheSize','maximal'

データ型: double | char | string

平均二乗誤差 (MSE) を推定するための交差検証の指定。'CV' と次のいずれかから構成されるコンマ区切りのペアとして指定します。

  • 'resubstitution'lasso は、交差検証を使用せずに、Xy を使用してモデルを当てはめ、MSE を予測します。

  • 正の整数スカラー KlassoK 分割交差検証を使用します。

  • cvpartition オブジェクト cvplasso は、cvp で表された交差検証法を使用します。'leaveout' またはカスタムの 'holdout' 分割は lasso と一緒には使用できません。

例: 'CV',3

モデル内の非ゼロ係数の最大個数。'DFmax' と正の整数スカラーから構成されるコンマ区切りのペアとして指定します。lasso は、この基準を満たす Lambda の値のみについて結果を返します。

例: 'DFmax',5

データ型: single | double

切片項のあるモデルを当てはめるためのフラグは、'Intercept' と、true または false のいずれかで構成されるコンマ区切りのペアとして指定します。既定値は true であり、モデルに切片項が含まれることを示しています。Interceptfalse の場合、返される切片値は 0 になります。

例: 'Intercept',false

データ型: logical

正則化係数。'Lambda' と非負値のベクトルから構成されるコンマ区切りのペアとして指定します。LASSOを参照してください。

  • Lambda を指定しなかった場合、lasso は非 Null モデルを提供する Lambda の最大値を計算します。この場合、LambdaRatio はシーケンスの最小値/最大値の比を示し、NumLambda はベクトルの長さを示します。

  • Lambda を指定した場合、lassoLambdaRatioNumLambda を無視します。

  • Standardizetrue である場合、Lambda は、平均がゼロ、分散が 1 になるように X のデータを標準化した状態でモデルを当てはめるために使用された値の集合です。

既定は、最大値だけが B = 0 になる可能性がある、NumLambda の値の等比数列です。

例: 'Lambda',linspace(0,1)

データ型: single | double

Lambda を指定しなかった場合の、Lambda の最大値に対する最小値の比率。'LambdaRatio' と正のスカラーから構成されるコンマ区切りのペアとして指定します。

LambdaRatio = 0 に設定した場合、lassoLambda の値について既定の数列を生成し、最小値を 0 に置き換えます。

例: 'LambdaRatio',1e–2

データ型: single | double

許容される最大反復回数。'MaxIter' と正の整数スカラーから構成されるコンマ区切りのペアとして指定します。

反復回数が MaxIter 回になっても収束許容誤差 RelTol に達しなかった場合、反復が停止し、警告メッセージが返されます。

NumLambda1 より大きい場合、複数の警告が返される可能性があります。

既定値は、標準データの場合は 1e5、tall 配列の場合は 1e4 です。

例: 'MaxIter',1e3

データ型: single | double

交差検証用のモンテカルロ反復回数。'MCReps' と正の整数スカラーから構成されるコンマ区切りのペアとして指定します。

  • CV'resubstitution' であるか 'resubstitution' タイプの cvpartition である場合、MCReps1 でなければなりません。

  • CV'holdout' タイプの cvpartition である場合、MCReps1 より大きくなければなりません。

  • CV'kfold' タイプのカスタムの cvpartition である場合、MCReps1 でなければなりません。

例: 'MCReps',5

データ型: single | double

Lambda を指定しなかった場合に lasso で使用する Lambda の値の個数。'NumLambda' と正の整数スカラーから構成されるコンマ区切りのペアとして指定します。当てはめの残差誤差が y の分散のしきい値の比率を下回る場合、lassoNumLambda より少ない個数の当てはめを返す可能性があります。

例: 'NumLambda',50

データ型: single | double

並列的な交差検証と乱数ストリームを指定するためのオプション。'Options' と構造体から構成されるコンマ区切りのペアとして指定します。並列計算には Parallel Computing Toolbox™ が必要です。

statset を使用して Options 構造体を作成します。このオプションのフィールドは以下です。

  • UseParallel — 並列計算する場合は true に設定します。既定の設定は false です。

  • UseSubstreams — 再生成可能な方法で並列計算する場合は true に設定します。再現性を得るには、'mlfg6331_64''mrg32k3a' などのサブストリームを許可するタイプに Streams を設定します。既定の設定は false です。

  • StreamsRandStream オブジェクトまたはそのようなオブジェクトで構成される cell 配列。Streams を指定しなかった場合、lasso は既定のストリームを使用します。

例: 'Options',statset('UseParallel',true)

データ型: struct

X に現れる順序で並んでいる、予測子変数の名前。'PredictorNames' と string 配列、または文字ベクトルの cell 配列から構成されるコンマ区切りのペアとして指定します。

例: 'PredictorNames',{'x1','x2','x3','x4'}

データ型: string | cell

座標降下アルゴリズム[3]の収束しきい値。'RelTol' と正のスカラーから構成されるコンマ区切りのペアとして指定します。係数ベクトルの連続推定が、L2 ノルムにおいて RelTol 未満の相対的な量の差異がある場合、このアルゴリズムは終了します。

例: 'RelTol',5e–3

データ型: single | double

ADMM アルゴリズムのための拡張ラグランジュ パラメーター ρ。'Rho' と正のスカラーから構成されるコンマ区切りのペアとして指定します。既定は自動選択です。

メモ

このオプションは、tall 配列に対して lasso を使用する場合のみ適用されます。詳細は、拡張機能を参照してください。

例: 'Rho',2

データ型: single | double

モデルを当てはめる前の予測子データ X の標準化フラグ。'Standardize'true または false から構成されるコンマ区切りのペアで指定します。Standardizetrue である場合、平均がゼロ、分散が 1 になるように X のデータがスケーリングされます。Standardize は、標準化されたスケールと元のスケールのどちらで正則化を係数に適用するかに影響を与えます。結果は、常に元のデータ スケールで与えられます。

Interceptfalse である場合、指定した Standardize の値にかかわらず、ソフトウェアによって Standardizefalse に設定されます。

Intercepttrue である場合、Xy は常にセンタリングされます。

例: 'Standardize',false

データ型: logical

当てはめへの共分散行列の使用の指示。'auto' または logical スカラーとして指定します。

  • 'auto' にすると、lasso は、観測値の数が問題の変数の個数を超えた場合、当てはめに共分散行列を使用しようとします。この試行は、メモリが不足している場合、失敗する可能性があります。lasso が当てはめに共分散行列を使用したかどうかを調べるには、FitInfo 出力の UseCovariance フィールドを確認します。

  • true にすると、必要なサイズが CacheSize を超えない限り、lasso は当てはめに共分散行列を使用します。必要な共分散行列のサイズが CacheSize を超えると、lasso は警告を発して、当てはめに共分散行列を使用しません。

  • false にすると、lasso は当てはめに共分散行列を使用しません。

当てはめに共分散行列を使用する方が使用しない場合より高速ですが、必要なメモリが増える可能性があります。LASSO を当てはめるための相関行列の使用を参照してください。高速化が数値安定性にマイナスの影響を与える場合があります。詳細については、座標降下アルゴリズムを参照してください。

例: 'UseCovariance',true

データ型: logical | char | string

ADMM アルゴリズムにおけるスケーリングされた双対変数 u の初期値。'U0' と数値ベクトルから構成されるコンマ区切りのペアとして指定します。

メモ

このオプションは、tall 配列に対して lasso を使用する場合のみ適用されます。詳細は、拡張機能を参照してください。

データ型: single | double

観測値の重み。'Weights' と非負のベクトルから構成されるコンマ区切りのペアとして指定します。Weights の長さは n です。n は X の行数です。関数 lasso は、合計が 1 になるように Weights をスケーリングします。

データ型: single | double

出力引数

すべて折りたたむ

近似された係数。数値行列として返されます。B は p 行 L 列の行列です。p は X 内の予測子 (列) の個数、L は Lambda の値の個数です。Lambda の値の個数は、名前と値のペアの引数 NumLambda を使用して指定できます。

切片項に対応する係数は、FitInfo のフィールドです。

データ型: single | double

線形モデルの当てはめ情報。次の表に記載されているフィールドが含まれている構造体として返されます。

FitInfo のフィールド説明
Intercept各線形モデルの切片の項 β01 行 L 列のベクトル
Lambda昇順の Lambda パラメーター、1 行 L 列のベクトル
AlphaAlpha パラメーターの値、スカラー値
DFLambda の各値の B 内の非ゼロ係数の数、1 行 L 列のベクトル
MSE平均二乗誤差 (MSE)、1 行 L 列のベクトル
PredictorNamesPredictorNames パラメーターの値、文字ベクトルの cell 配列として格納
UseCovariance当てはめに共分散行列が使用されたかどうかを示す logical 値。共分散が計算され、使用された場合、true になります。そうでない場合は false です。

交差検証を行うように名前と値のペアの引数 CV を設定した場合、構造体 FitInfo には次の追加フィールドが含まれます。

FitInfo のフィールド説明
SE交差検証中に計算される各 Lambda の MSE の標準誤差、1 行 L 列のベクトル
LambdaMinMSEMSE が最小である Lambda の値、スカラー
Lambda1SEMSE と最小 MSE の差が 1 標準誤差以内になる最大の Lambda の値、スカラー
IndexMinMSELambdaMinMSELambda のインデックス、スカラー
Index1SELambda1SELambda のインデックス、スカラー

詳細

すべて折りたたむ

LASSO

指定の λ 値 (非負のパラメーター) の場合、lasso は次の問題を解決します。

minβ0,β(12Ni=1N(yiβ0xiTβ)2+λj=1p|βj|).

  • N は、観測数です。

  • yi は、観測値 i の応答データです。

  • xi はデータ (観測値 i における長さ p のベクトル) です。

  • λ は Lambda の 1 つの値に対応する非負の正則化パラメーターです。

  • パラメーター β0 と β はそれぞれ、スカラーと長さ p のベクトルです。

λ が増えると、β の非ゼロの要素が減ります。

LASSO の問題は、Elastic Net のアルゴリズムとは対照的に β の L1 ノルムと関わっています。

Elastic Net

厳密に 0 と 1 の間にある α および非負の λ について、Elastic Net は次の問題を解きます。

minβ0,β(12Ni=1N(yiβ0xiTβ)2+λPα(β)),

ここで

Pα(β)=(1α)2β22+αβ1=j=1p((1α)2βj2+α|βj|).

α = 1 の場合、Elastic Net は LASSO と同じになります。α の他の値の場合、ペナルティ項 Pα(β) が β の L1 ノルムと β の L2 ノルムの 2 乗との間を内挿します。α が 0 に向かって縮小するにつれて、Elastic Net は ridge 回帰に近づきます。

アルゴリズム

すべて折りたたむ

座標降下アルゴリズム

lasso は、Friedman、Tibshirani および Hastie [3]に基づく "座標降下" という名前の効率的な手続きによって、多くの λ の値を同時に当てはめます。この手続きには、当てはめが共分散行列を使用するかどうかに応じて、2 つの主要なコード パスがあります。名前と値の引数 UseCovariance で、この選択を変更できます。

lasso が共分散行列を使用して、N 個のデータ点と D 個の予測子を当てはめる場合、この当てはめにはおよそ D*D の計算量があります。共分散行列がない場合、計算量はおよそ N*D です。したがって一般的には、共分散行列を使用すると、N > D 場合、高速化する場合があります。引数 UseCovariance の既定の設定 'auto' は、こちらを選択しています。共分散行列を使用した場合、lasso は、そうでない場合よりも大きな数を減算します。このため、数値安定性が低下する可能性があります。これらのアルゴリズムの違いの詳細については、[3]を参照してください。時間と精度の違いの比較は、LASSO を当てはめるための相関行列の使用を参照してください。

ADMM アルゴリズム

tall 配列を処理する場合、lasso は交互方向乗数法 (ADMM) [5] に基づくアルゴリズムを使用します。ここで使用している表記法は参考文献と同じです。この手法では、次の形式の問題を解きます。

l(x)+g(z) を最小化する

Ax+Bz=c という条件を適用する

この表記法を使用すると、LASSO 回帰問題は次のようになります。

l(x)+g(z)=12Axb22+λz1 を最小化する

xz=0 という条件を適用する

損失関数 l(x)=12Axb22 は 2 次なので、このアルゴリズムで実行される反復の更新では、単一の係数行列と複数の右辺を使用して連立一次方程式を解くことになります。このアルゴリズムでは、各反復で次の更新が実行されます。

xk+1=(ATA+ρI)1(ATb+ρ(zkuk))zk+1=Sλ/ρ(xk+1+uk)uk+1=uk+xk+1zk+1

A はデータセット (tall 配列)、x は係数、ρ はペナルティ パラメーター (拡張ラグランジュ パラメーター)、b は応答 (tall 配列)、S はソフトしきい値演算子です。

Sκ(a)={aκ,a>κ0,|a|κa+κ,a<κ.

係数行列 ATA+ρI が対称な正定値なので、lasso はコレスキー分解を使用して連立一次方程式を解きます。ρ は反復間で変化しないので、コレスキー分解が反復間でキャッシュされます。

A と b は tall 配列ですが、これらは ATA および ATb という項のみに現れます。この 2 つの行列乗算の結果は小さいためメモリに収まるので、これらは事前に計算され、反復間の反復更新は完全にメモリ内で実行されます。

参照

[1] Tibshirani, R. “Regression Shrinkage and Selection via the Lasso.” Journal of the Royal Statistical Society. Series B, Vol. 58, No. 1, 1996, pp. 267–288.

[2] Zou, H., and T. Hastie. “Regularization and Variable Selection via the Elastic Net.” Journal of the Royal Statistical Society. Series B, Vol. 67, No. 2, 2005, pp. 301–320.

[3] Friedman, J., R. Tibshirani, and T. Hastie. “Regularization Paths for Generalized Linear Models via Coordinate Descent.” Journal of Statistical Software. Vol. 33, No. 1, 2010. https://www.jstatsoft.org/v33/i01

[4] Hastie, T., R. Tibshirani, and J. Friedman. The Elements of Statistical Learning. 2nd edition. New York: Springer, 2008.

[5] Boyd, S. “Distributed Optimization and Statistical Learning via the Alternating Direction Method of Multipliers.” Foundations and Trends in Machine Learning. Vol. 3, No. 1, 2010, pp. 1–122.

拡張機能

バージョン履歴

R2011b で導入