lassoglm
一般化線形モデルに対する LASSO または Elastic Net 正則化
構文
説明
は、1 つ以上の名前と値のペアの引数で指定された追加オプションを使用して、正則化された一般化線形回帰を当てはめます。たとえば B
= lassoglm(X
,y
,distr
,Name,Value
)'Alpha',0.5
は、パラメーター Alpha
が 0.5 に等しい Elastic Net を正則化の手法として設定します。
例
LASSO 正則化の使用による冗長な予測子の削除
冗長な予測子があるデータ セットを作成し、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
は冗長予測子を識別して、削除します。
一般化線形モデルの、交差検証された LASSO 正則化
ポアソン モデルからデータを作成し、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
緑の円と点線は、交差検証誤差が最小になる 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 標準誤差を加えた点の係数は、データを作成するために使用した係数そのものです。
LASSO 正則化の使用による値の予測
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);
この関数は、31 個の試験成績を正しく予測しています。しかし、1 人の学生を B 以上、4
人の学生を B 未満の成績として誤って予測しています。
lassoglm
を当てはめるための相関行列の使用
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
結果は実質的に同一です。
入力引数
X
— 予測子データ
数値行列
予測子データ。数値行列として指定します。各行は 1 つの観測値を、各列は 1 つの予測子変数を表します。
データ型: single
| double
y
— 応答データ
数値ベクトル | logical ベクトル | categorical 配列 | 数値行列
応答データ。数値ベクトル、logical ベクトル、categorical 配列、または 2 列の数値行列を指定します。
データ型: single
| double
| logical
| categorical
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで Name
は引数名、Value
は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。
R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name
を引用符で囲みます。
例: lassoglm(X,y,'poisson','Alpha',0.5)
は、応答値がポアソン分布に従っていると仮定して Elastic Net 正則化を実行します。名前と値のペアの引数 'Alpha',0.5
は、Elastic Net 最適化で使用されるパラメーターを設定します。
Alpha
— リッジ最適化に対する LASSO 最適化の重み
1
(既定値) | 正のスカラー
リッジ (L2) 最適化に対する LASSO (L1) 最適化の重み。'Alpha'
と区間 (0,1]
にある正のスカラー値から構成されるコンマ区切りのペアとして指定します。値 Alpha = 1
は LASSO 回帰を表します。0
に近い Alpha
はリッジ回帰に近づき、他の値は Elastic Net 最適化を表します。Elastic Netを参照してください。
例: 'Alpha',0.75
データ型: single
| double
CacheSize
— メガバイト単位の共分散行列のサイズ
1000
(既定値) | 正のスカラー | 'maximal'
メガバイト単位の共分散行列のサイズ。正のスカラーまたは 'maximal'
を指定します。関数 lassoglm
は、引数 UseCovariance
が true
または 'auto'
の場合、当てはめに共分散行列を使用できます。
UseCovariance
が true
または 'auto'
であり、CacheSize
が 'maximal'
である場合、lassoglm
は利用可能なメモリを超える共分散行列を割り当てようとする場合があります。この場合、MATLAB® はエラーを生成します。
例: 'CacheSize','maximal'
データ型: double
| char
| string
CV
— 逸脱度を推定するための交差検証の指定
'resubstitution'
(既定値) | 正の整数スカラー | cvpartition
オブジェクト
逸脱度を推定するための交差検証の指定。'CV'
と次のいずれかから構成されるコンマ区切りのペアとして指定します。
'resubstitution'
—lassoglm
は、交差検証を使用せずに、X
とy
を使用してモデルを当てはめ、逸脱度を予測します。正の整数スカラー
K
—lassoglm
はK
分割交差検証を使用します。cvpartition
オブジェクトcvp
—lassoglm
は、cvp
で表された交差検証法を使用します。'leaveout'
またはカスタムの'holdout'
分割はlassoglm
と一緒には使用できません。
例: 'CV',10
DFmax
— 非ゼロ係数の最大個数
Inf
(既定値) | 正の整数スカラー
モデル内の非ゼロ係数の最大個数。'DFmax'
と正の整数スカラーから構成されるコンマ区切りのペアとして指定します。lassoglm
は、この基準を満たす Lambda
の値のみについて結果を返します。
例: 'DFmax',25
データ型: single
| double
Lambda
— 正則化係数
非負のベクトル
正則化係数。'Lambda'
と非負値のベクトルから構成されるコンマ区切りのペアとして指定します。LASSOを参照してください。
Lambda
を指定しなかった場合、lassoglm
は非 Null モデルを提供するLambda
の最大値を推定します。この場合、LambdaRatio
はシーケンスの最小値/最大値の比を示し、NumLambda
はベクトルの長さを示します。Lambda
を指定した場合、lassoglm
はLambdaRatio
とNumLambda
を無視します。Standardize
がtrue
である場合、Lambda
は、平均がゼロ、分散が 1 になるようにX
のデータを標準化した状態でモデルを当てはめるために使用された値の集合です。
既定は、最大値だけが B
= 0
になる可能性がある、NumLambda
の値の等比数列です。
データ型: single
| double
LambdaRatio
— Lambda
の最大値に対する最小値の比率
1e–4
(既定値) | 正のスカラー
Lambda
を指定しなかった場合の、Lambda
の最大値に対する最小値の比率。'LambdaRatio'
と正のスカラーから構成されるコンマ区切りのペアとして指定します。
LambdaRatio
= 0 に設定した場合、lassoglm
は Lambda
の値について既定の数列を生成し、最小値を 0
に置き換えます。
例: 'LambdaRatio',1e–2
データ型: single
| double
Link
— 応答の平均と線形予測子の間のマッピング
'comploglog'
| 'identity'
| 'log'
| 'logit'
| 'loglog'
| ...
応答の平均 µ と線形予測子 Xb の間のマッピング。'Link'
と次の表のいずれかの値から構成されるコンマ区切りのペアとして指定します。
値 | 説明 |
---|---|
'comploglog' | log(–log((1 – µ))) = Xb |
| µ = Xb |
| log(µ) = Xb |
| log(µ/(1 – µ)) = Xb |
| log(–log(µ)) = Xb |
'probit' | Φ–1(µ) = Xb、Φ は正規 (ガウス) 累積分布関数 |
'reciprocal' 、分布の既定の設定 'gamma' | µ–1 = Xb |
| µp = Xb |
| ユーザー指定のリンク関数 (カスタム リンク関数を参照) |
例: 'Link','probit'
データ型: char
| string
| single
| double
| cell
MCReps
— 交差検証用のモンテカルロ反復回数
1
(既定値) | 正の整数スカラー
交差検証用のモンテカルロ反復回数。'MCReps'
と正の整数スカラーから構成されるコンマ区切りのペアとして指定します。
CV
が'resubstitution'
であるか'resubstitution'
タイプのcvpartition
である場合、MCReps
は1
でなければなりません。CV
が'holdout'
タイプのcvpartition
である場合、MCReps
は1
より大きくなければなりません。CV
が'kfold'
タイプのカスタムのcvpartition
である場合、MCReps
は1
でなければなりません。
例: 'MCReps',2
データ型: single
| double
Offset
— 追加の予測子変数
数値ベクトル
追加の予測子変数。'Offset'
と、行数が X
と同じである数値ベクトルから構成されるコンマ区切りのペアとして指定します。関数 lassoglm
は、Offset
の係数値を 1.0
に固定します。
データ型: single
| double
Options
— 並列計算と乱数ストリーム設定のオプション
構造体
並列計算と乱数ストリーム設定のオプション。構造体として指定します。statset
を使用して Options
構造体を作成します。次の表は、オプションのフィールドとその値の一覧です。
フィールド名 | 値 | 既定の設定 |
---|---|---|
UseParallel | 並列計算を行う場合は、この値を true に設定します。 | false |
UseSubstreams | 再現可能な方法で計算する場合は、この値を 再現性のある計算を行うには、 | false |
Streams | RandStream オブジェクトまたはそのようなオブジェクトの cell 配列としてこの値を指定します。UseParallel の値が true でなく、UseSubstreams の値も false でない場合、単一オブジェクトを使用します。この場合は、並列プールと同じサイズの cell 配列を使用します。 | Streams を指定しなかった場合、lassoglm は既定のストリームを使用します。 |
メモ
並列計算を行うには、Parallel Computing Toolbox™ が必要です。
例: Options=statset(UseParallel=true,UseSubstreams=true,Streams=RandStream("mlfg6331_64"))
データ型: struct
PredictorNames
— 予測子変数の名前
{}
(既定値) | string 配列 | 文字ベクトルの cell 配列
X
に現れる順序で並んでいる、予測子変数の名前。'PredictorNames'
と string 配列、または文字ベクトルの cell 配列から構成されるコンマ区切りのペアとして指定します。
例: 'PredictorNames',{'Height','Weight','Age'}
データ型: string
| cell
RelTol
— 座標降下アルゴリズムの収束しきい値
1e–4
(既定値) | 正のスカラー
座標降下アルゴリズム[3]の収束しきい値。'RelTol'
と正のスカラーから構成されるコンマ区切りのペアとして指定します。係数ベクトルの連続推定が、L2 ノルムにおいて RelTol
未満の相対的な量の差異がある場合、このアルゴリズムは終了します。
例: 'RelTol',2e–3
データ型: single
| double
Standardize
— モデル当てはめ前の予測子データ標準化のフラグ
true
(既定値) | false
モデルを当てはめる前の予測子データ X
の標準化フラグ。'Standardize'
と true
または false
から構成されるコンマ区切りのペアで指定します。Standardize
が true
である場合、平均がゼロ、分散が 1 になるように X
のデータがスケーリングされます。Standardize
は、標準化されたスケールと元のスケールのどちらで正則化を係数に適用するかに影響を与えます。結果は、常に元のデータ スケールで与えられます。
例: 'Standardize',false
データ型: logical
UseCovariance
— 当てはめへの共分散行列の使用の指示
'auto'
(既定値) | 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
— 観測値の重み
1/n*ones(n,1)
(既定値) | 非負のベクトル
観測値の重み。'Weights'
と非負のベクトルから構成されるコンマ区切りのペアとして指定します。Weights
の長さは n です。n は X
の行数です。少なくとも 2 つの値が正でなければなりません。
データ型: single
| double
出力引数
FitInfo
— モデルの当てはめ情報
構造体
一般化線形モデルの当てはめ情報。次の表に記載されているフィールドが含まれている構造体として返されます。
FitInfo のフィールド | 説明 |
---|---|
Intercept | 各線形モデルの切片の項 β0、1 行 L 列のベクトル |
Lambda | 昇順の Lambda パラメーター、1 行 L 列のベクトル |
Alpha | Alpha パラメーターの値、スカラー値 |
DF | Lambda の各値の B 内の非ゼロ係数の数、1 行 L 列のベクトル |
Deviance |
モデルを交差検証した場合、 |
PredictorNames | PredictorNames パラメーターの値、文字ベクトルの cell 配列として格納 |
UseCovariance | 当てはめに共分散行列が使用されたかどうかを示す logical 値。共分散が計算され、使用された場合、true になります。そうでない場合は false です。 |
交差検証を行うように名前と値のペアの引数 CV
を設定した場合、構造体 FitInfo
には次の追加フィールドが含まれます。
FitInfo のフィールド | 説明 |
---|---|
SE | 交差検証時に計算される各 Lambda の Deviance の標準誤差、1 行 L 列のベクトル |
LambdaMinDeviance | 交差検証によって計算された、最小期待逸脱度をもつ Lambda の値、スカラー値 |
Lambda1SE | Deviance と最小値の差が 1 標準誤差以内になる最大の Lambda の値、スカラー |
IndexMinDeviance | 値 LambdaMinDeviance の Lambda のインデックス、スカラー |
Index1SE | 値 Lambda1SE の Lambda のインデックス、スカラー |
詳細
リンク関数
リンク関数 f(μ) は次の式を使用して、平均 μ の分布を、データ X と係数ベクトル b をもつ線形モデルにマッピングします。
f(μ) = Xb.
リンク関数の式については、名前と値のペアの引数 Link
の説明を参照してください。次の表は、各分布で一般に使用されるリンク関数の一覧です。
分布族 | 既定のリンク関数 | 他の一般的なリンク関数 |
---|---|---|
'normal' | 'identity' | |
'binomial' | 'logit' | 'comploglog' , 'loglog' , 'probit' |
'poisson' | 'log' | |
'gamma' | 'reciprocal' | |
'inverse gaussian' | –2 |
LASSO
λ の非負の値に対して、lassoglm
は次の問題を解決します。
この方程式の関数 Deviance は、切片 β0 と予測子係数 β を使用して応答に当てはめたモデルの逸脱度です。逸脱度の式は、
lassoglm
に指定するdistr
パラメーターに依存します。λ ペナルティ付き逸脱度を最小化することは λ ペナルティ付き対数尤度を最大化することと等価です。N は、観測数です。
λ は
Lambda
の 1 つの値に対応する非負の正則化パラメーターです。パラメーター β0 と β はそれぞれ、スカラーと長さ p のベクトルです。
λ が増えると、β の非ゼロの要素が減ります。
LASSO の問題は、Elastic Net のアルゴリズムとは対照的に β の L1 ノルムと関わっています。
Elastic Net
厳密に 0 と 1 の間にある α および非負の λ について、Elastic Net は次の問題を解きます。
ここで
α = 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.
拡張機能
自動並列サポート
Parallel Computing Toolbox™ を使用して自動的に並列計算を実行することで、コードを高速化します。
並列実行するには、この関数を呼び出すときに名前と値の引数 Options
を指定し、statset
を使用してオプション構造体の UseParallel
フィールドを true
に設定します。
Options=statset(UseParallel=true)
並列計算の詳細については、自動並列サポートを使用した MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2012a で導入
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)