Main Content

lassoglm

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

説明

B = lassoglm(X,y) は、予測子データ X および応答 y の一般化線形モデルについて、ペナルティ付き最尤近似係数を返します。y 内の値は正規確率分布に従うと仮定されます。B の各列は Lambda 内の特定の正則化係数に対応します。既定では、lassoglmLambda の値の等比数列を使用して LASSO 正則化を実行します。

B = lassoglm(X,y,distr) は、y について確率分布 distr を使用することにより、LASSO 正則化を実行してモデルを当てはめます。

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

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

すべて折りたたむ

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

100 個の観測値と 10 個の予測子が含まれているランダムな行列 X を作成します。予測子のうち 4 つのみと小量のノイズを使用して、正規分布に従う応答 y を作成します。

rng default
X = randn(100,10);
weights = [0.6;0.5;0.7;0.4];
y = X(:,[2 4 5 7])*weights + randn(100,1)*0.1; % Small added noise

LASSO 正則化を実行します。

B = lassoglm(X,y);

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

B(:,75)
ans = 10×1

         0
    0.5431
         0
    0.3944
    0.6173
         0
    0.3473
         0
         0
         0

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

ポアソン モデルからデータを作成し、lassoglm を使用して重要な予測子を特定します。

20 個の予測子が含まれているデータを作成します。予測子のうち 3 つのみと定数を使用して、ポアソン応答変数を作成します。

rng default % For reproducibility
X = randn(100,20);
weights = [.4;.2;.3];
mu = exp(X(:,[5 10 15])*weights + 1);
y = poissrnd(mu);

データのポアソン回帰モデルの交差検証 LASSO 正則化を構築します。

[B,FitInfo] = lassoglm(X,y,'poisson','CV',10);

Lambda 正則化パラメーターの効果を確認するために交差検証プロットを調べます。

lassoPlot(B,FitInfo,'plottype','CV'); 
legend('show') % Show legend

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

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

識別された 2 つの点に対応する非ゼロのモデル係数を検出します。

idxLambdaMinDeviance = FitInfo.IndexMinDeviance;
mincoefs = find(B(:,idxLambdaMinDeviance))
mincoefs = 7×1

     3
     5
     6
    10
    11
    15
    16

idxLambda1SE = FitInfo.Index1SE;
min1coefs = find(B(:,idxLambda1SE))
min1coefs = 3×1

     5
    10
    15

最小値に 1 標準誤差を加えた点の係数は、データを作成するために使用した係数そのものです。

lassoglm を使用して、学生が最後の試験で B 以上を取ったかどうかを予測します。

examgrades データ セットを読み込みます。最後の試験成績を logical ベクトルに変換します。1 は 80 点以上の成績を、0 は 80 点未満の成績を表します。

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

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

rng default    % Set the seed for reproducibility
c = cvpartition(yBinom,'HoldOut',0.3);
idxTrain = training(c,1);
idxTest = ~idxTrain;
XTrain = X(idxTrain,:);
yTrain = yBinom(idxTrain);
XTest = X(idxTest,:);
yTest = yBinom(idxTest);

学習データに対する 3 分割の交差検証を使用して、一般化線形モデル回帰について LASSO 正則化を実行します。y 内の値は二項分布に従うと仮定します。予期される逸脱度が最小である Lambda に対応するモデル係数を選択します。

[B,FitInfo] = lassoglm(XTrain,yTrain,'binomial','CV',3);
idxLambdaMinDeviance = FitInfo.IndexMinDeviance;
B0 = FitInfo.Intercept(idxLambdaMinDeviance);
coef = [B0; B(:,idxLambdaMinDeviance)]
coef = 5×1

  -21.1911
    0.0235
    0.0670
    0.0693
    0.0949

前の手順で求めたモデル係数を使用して、テスト データについて試験成績を予測します。'logit' を使用して、二項応答のリンク関数を指定します。予測値を logical ベクトルに変換します。

yhat = glmval(coef,XTest,'logit');
yhatBinom = (yhat>=0.5);

混同行列を使用して、予測の精度を判断します。

c = confusionchart(yTest,yhatBinom);

Figure contains an object of type ConfusionMatrixChart.

この関数は、31 個の試験成績を正しく予測しています。しかし、1 人の学生を B 以上、4 人の学生を B 未満の成績として誤って予測しています。

N 個の p 次元正規変数が含まれている行列 X を作成します。ここで N は大きく、p = 1000 です。モデル y = X*beta + noise から応答ベクトル y を作成します。ここで beta は 50% が非ゼロ値である定数のベクトルです。

rng default % For reproducibility
N = 1e4; % Number of samples
p = 1e3; % Number of features
X = randn(N,p);
beta = 1 + 3*rand(p,1); % Multiplicative coefficients
activep = randperm(p,p/2); % 50% nonzero coefficients
y = X(:,activep)*beta(activep) + randn(N,1)*0.1; % Add noise

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

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

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

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

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

speedup = timefalse/timetrue
speedup = 
6.6083

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

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

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

入力引数

すべて折りたたむ

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

データ型: single | double

応答データ。数値ベクトル、logical ベクトル、categorical 配列、または 2 列の数値行列を指定します。

  • distr'binomial' ではない場合、y は長さ n の数値ベクトルまたは categorical 配列です。nX の行数です。応答 y(i)X の行 i に対応します。

  • distr'binomial' である場合、y は次のいずれかです。

    • 各エントリが成功 (1) または失敗 (0) を表す、長さ n の数値ベクトル

    • 各エントリが成功または失敗を表す、長さ n の logical ベクトル

    • 各エントリが成功または失敗を表す、長さ n の categorical 配列

    • 1 列目に各観測値の成功回数、2 列目に総試行回数が含まれている、2 列の数値行列

データ型: single | double | logical | categorical

応答データの分布。次のいずれかを指定します。

  • 'normal' (既定の設定)

  • 'binomial'

  • 'poisson'

  • 'gamma'

  • 'inverse gaussian'

lassoglm は、distr に対応する既定のリンク関数を使用します。別のリンク関数を指定するには、名前と値のペアの引数 Link を使用します。

名前と値の引数

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

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

例: lassoglm(X,y,'poisson','Alpha',0.5) は、応答値がポアソン分布に従っていると仮定して Elastic Net 正則化を実行します。名前と値のペアの引数 'Alpha',0.5 は、Elastic Net 最適化で使用されるパラメーターを設定します。

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

例: 'Alpha',0.75

データ型: single | double

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

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

例: 'CacheSize','maximal'

データ型: double | char | string

逸脱度を推定するための交差検証の指定。'CV' と次のいずれかから構成されるコンマ区切りのペアとして指定します。

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

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

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

例: 'CV',10

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

例: 'DFmax',25

データ型: single | double

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

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

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

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

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

データ型: single | double

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

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

例: 'LambdaRatio',1e–2

データ型: single | double

応答の平均 µ と線形予測子 Xb の間のマッピング。'Link' と次の表のいずれかの値から構成されるコンマ区切りのペアとして指定します。

説明
'comploglog'

log(–log((1 – µ))) = Xb

'identity'、分布の既定の設定 'normal'

µ = Xb

'log'、分布の既定の設定 'poisson'

log(µ) = Xb

'logit'、分布の既定の設定 'binomial'

log(µ/(1 – µ)) = Xb

'loglog'

log(–log(µ)) = Xb

'probit'

Φ–1(µ) = Xb、Φ は正規 (ガウス) 累積分布関数

'reciprocal'、分布の既定の設定 'gamma'

µ–1 = Xb

p (数値)、分布 'inverse gaussian' の既定の設定 (p = –2 の場合)

µp = Xb

FL を格納するフィールド LinkFD を格納するフィールド Derivative、および FI を格納するフィールド Inverse をもつ関数ハンドルの構造体。

ユーザー指定のリンク関数 (カスタム リンク関数を参照)

例: 'Link','probit'

データ型: char | string | single | double | cell

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

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

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

例: 'MaxIter',1e3

データ型: single | double

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

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

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

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

例: 'MCReps',2

データ型: single | double

Lambda を指定しなかった場合に lassoglm で使用する Lambda の値の個数。'NumLambda' と正の整数スカラーから構成されるコンマ区切りのペアとして指定します。null の逸脱度 (予測子 X を使用しない当てはめの逸脱度) のしきい値の比率を当てはめの逸脱度が下回る場合、lassoglmNumLambda より少ない個数の当てはめを返す可能性があります。

例: 'NumLambda',150

データ型: single | double

追加の予測子変数。'Offset' と、行数が X と同じである数値ベクトルから構成されるコンマ区切りのペアとして指定します。関数 lassoglm は、Offset の係数値を 1.0 に固定します。

データ型: single | double

並列計算と乱数ストリーム設定のオプション。構造体として指定します。statset を使用して Options 構造体を作成します。次の表は、オプションのフィールドとその値の一覧です。

フィールド名既定の設定
UseParallel並列計算を行う場合は、この値を true に設定します。false
UseSubstreams

再現可能な方法で計算する場合は、この値を true に設定します。

再現性のある計算を行うには、Streams をサブストリームを許可する型 ("mlfg6331_64" または "mrg32k3a") に設定します。

false
StreamsRandStream オブジェクトまたはそのようなオブジェクトの cell 配列としてこの値を指定します。UseParallel の値が true でなく、UseSubstreams の値も false でない場合、単一オブジェクトを使用します。この場合は、並列プールと同じサイズの cell 配列を使用します。Streams を指定しなかった場合、lassoglm は既定のストリームを使用します。

メモ

並列計算を行うには、Parallel Computing Toolbox™ が必要です。

例: Options=statset(UseParallel=true,UseSubstreams=true,Streams=RandStream("mlfg6331_64"))

データ型: struct

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

例: 'PredictorNames',{'Height','Weight','Age'}

データ型: string | cell

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

例: 'RelTol',2e–3

データ型: single | double

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

例: 'Standardize',false

データ型: logical

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

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

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

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

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

例: 'UseCovariance',true

データ型: logical | char | string

観測値の重み。'Weights' と非負のベクトルから構成されるコンマ区切りのペアとして指定します。Weights の長さは n です。nX の行数です。少なくとも 2 つの値が正でなければなりません。

データ型: single | double

出力引数

すべて折りたたむ

当てはめた係数。数値行列として返されます。BpL 列の行列です。pX 内の予測子 (列) の個数、LLambda の値の個数です。Lambda の値の個数は、名前と値のペアの引数 NumLambda を使用して指定できます。

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

データ型: single | double

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

FitInfo のフィールド説明
Intercept各線形モデルの切片の項 β01L 列のベクトル
Lambda昇順の Lambda パラメーター、1L 列のベクトル
AlphaAlpha パラメーターの値、スカラー値
DFLambda の各値の B 内の非ゼロ係数の数、1L 列のベクトル
Deviance

Lambda の各値についての当てはめたモデルの逸脱度、1L 列のベクトル

モデルを交差検証した場合、Deviance の値は、交差検証で計算された、新しいデータに適用したモデルの推定期待逸脱度を表します。実行しない場合、Deviance は当てはめを行うために使用されたデータに適用される、当てはめられたモデルの逸脱度です。

PredictorNamesPredictorNames パラメーターの値、文字ベクトルの cell 配列として格納
UseCovariance当てはめに共分散行列が使用されたかどうかを示す logical 値。共分散が計算され、使用された場合、true になります。そうでない場合は false です。

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

FitInfo のフィールド説明
SE交差検証時に計算される各 LambdaDeviance の標準誤差、1L 列のベクトル
LambdaMinDeviance交差検証によって計算された、最小期待逸脱度をもつ Lambda の値、スカラー値
Lambda1SEDeviance と最小値の差が 1 標準誤差以内になる最大の Lambda の値、スカラー
IndexMinDevianceLambdaMinDevianceLambda のインデックス、スカラー
Index1SELambda1SELambda のインデックス、スカラー

詳細

すべて折りたたむ

リンク関数

リンク関数 f(μ) は次の式を使用して、平均 μ の分布を、データ X と係数ベクトル b をもつ線形モデルにマッピングします。

f(μ) = Xb.

リンク関数の式については、名前と値のペアの引数 Link の説明を参照してください。次の表は、各分布で一般に使用されるリンク関数の一覧です。

分布族既定のリンク関数他の一般的なリンク関数
'normal''identity' 
'binomial''logit''comploglog', 'loglog', 'probit'
'poisson''log' 
'gamma''reciprocal' 
'inverse gaussian'–2 

LASSO

λ の非負の値に対して、lassoglm は次の問題を解決します。

minβ0,β(1NDeviance(β0,β)+λj=1p|βj|).

  • この方程式の関数 Deviance は、切片 β0 と予測子係数 β を使用して応答に当てはめたモデルの逸脱度です。逸脱度の式は、lassoglm に指定する distr パラメーターに依存します。λ ペナルティ付き逸脱度を最小化することは λ ペナルティ付き対数尤度を最大化することと等価です。

  • N は、観測数です。

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

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

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

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

Elastic Net

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

minβ0,β(1NDeviance(β0,β)+λPα(β)),

ここで

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

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

アルゴリズム

すべて折りたたむ

座標降下アルゴリズム

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

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

参照

[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] Dobson, A. J. An Introduction to Generalized Linear Models. 2nd edition. New York: Chapman & Hall/CRC Press, 2002.

[6] McCullagh, P., and J. A. Nelder. Generalized Linear Models. 2nd edition. New York: Chapman & Hall/CRC Press, 1989.

[7] Collett, D. Modelling Binary Data. 2nd edition. New York: Chapman & Hall/CRC Press, 2003.

拡張機能

バージョン履歴

R2012a で導入