lassoglm
一般化線形モデルに対する LASSO または Elastic Net 正則化
構文
説明
は、1 つ以上の名前と値のペアの引数で指定された追加オプションを使用して、正則化された一般化線形回帰を当てはめます。たとえば B = lassoglm(X,y,distr,Name,Value)Alpha=0.5 は、パラメーター Alpha が 0.5 に等しい Elastic Net を正則化の手法として設定します。
例
冗長な予測子があるデータ セットを作成し、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

緑の円と点線は、交差検証誤差が最小になる 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);

この関数は、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 = 7.7526
共分散行列を使用して 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 = 0.8942
共分散行列を使用した当てはめ時間は、使用しない場合の時間より小さいです。共分散行列を使用した結果の高速化係数を表示します。
speedup = timefalse/timetrue
speedup = 8.6695
返された係数 B および B2 が似ていることを確認します。
norm(B-B2)/norm(B)
ans = 3.6556e-15
結果は実質的に同一です。
入力引数
予測子データ。数値行列として指定します。各行は 1 つの観測値を、各列は 1 つの予測子変数を表します。
データ型: single | double
応答データ。数値ベクトル、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 最適化で使用されるパラメーターを設定します。
リッジ (L2) 最適化に対する LASSO (L1) 最適化の重み。区間 (0,1] の正のスカラー値として指定します。値 Alpha = 1 は LASSO 回帰を表します。0 に近い Alpha はリッジ回帰に近づき、他の値は Elastic Net 最適化を表します。Elastic Netを参照してください。
例: Alpha=0.75
データ型: single | double
メガバイト単位の共分散行列のサイズ。正のスカラーまたは "maximal" を指定します。関数 lassoglm は、引数 UseCovariance が true または "auto" の場合、当てはめに共分散行列を使用できます。
UseCovariance が true または "auto" であり、CacheSize が "maximal" である場合、lassoglm は利用可能なメモリを超える共分散行列を割り当てようとする場合があります。この場合、MATLAB® はエラーを生成します。
例: CacheSize="maximal"
データ型: double | char | string
逸脱度を推定するための交差検証の指定。次のいずれかとして指定します。
"resubstitution"—lassoglmは、交差検証を使用せずに、Xとyを使用してモデルを当てはめ、逸脱度を予測します。正の整数スカラー
K—lassoglmはK分割交差検証を使用します。cvpartitionオブジェクトcvp—lassoglmは、cvpで表された交差検証法を使用します。"leaveout"またはカスタムの"holdout"分割はlassoglmと一緒には使用できません。
例: CV=10
モデル内の非ゼロ係数の最大個数。正の整数スカラーとして指定します。lassoglm は、この基準を満たす Lambda の値のみについて結果を返します。
例: DFmax=25
データ型: single | double
正則化係数。非負値のベクトルとして指定します。LASSOを参照してください。
Lambdaを指定しなかった場合、lassoglmは非 Null モデルを提供するLambdaの最大値を推定します。この場合、LambdaRatioはシーケンスの最小値/最大値の比を示し、NumLambdaはベクトルの長さを示します。Lambdaを指定した場合、lassoglmはLambdaRatioとNumLambdaを無視します。Standardizeがtrueである場合、Lambdaは、平均がゼロ、分散が 1 になるようにXのデータを標準化した状態でモデルを当てはめるために使用された値の集合です。
既定は、最大値だけが B = 0 になる可能性がある、NumLambda の値の等比数列です。
データ型: single | double
Lambda を指定しなかった場合の、Lambda の最大値に対する最小値の比率。正のスカラーとして指定します。
LambdaRatio = 0 に設定した場合、lassoglm は Lambda の値について既定の数列を生成し、最小値を 0 に置き換えます。
例: LambdaRatio=1e–2
データ型: single | double
応答の平均 µ と線形予測子 Xb の間のマッピング。次の表の値のいずれかとして指定します。
| 値 | 説明 |
|---|---|
"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
交差検証用のモンテカルロ反復回数。正の整数スカラーとして指定します。
CVが"resubstitution"であるか"resubstitution"タイプのcvpartitionである場合、MCRepsは1でなければなりません。CVが"holdout"タイプのcvpartitionである場合、MCRepsは1より大きくなければなりません。CVが"kfold"タイプのカスタムのcvpartitionである場合、MCRepsは1でなければなりません。
例: MCReps=2
データ型: single | double
追加の予測子変数。X と同じ行数の数値ベクトルとして指定します。関数 lassoglm は、Offset の係数値を 1.0 に固定します。
データ型: single | double
並列計算と乱数ストリーム設定のオプション。構造体として指定します。並列計算は CV が "resubstitution" の場合は使用されません。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
X に現れる順序で並んでいる、予測子変数の名前。string 配列または文字ベクトルの cell 配列として指定します。
例: PredictorNames=["Height","Weight","Age"]
データ型: string | cell
座標降下アルゴリズム[3]の収束しきい値。正のスカラーとして指定します。係数ベクトルの連続推定が、L2 ノルムにおいて RelTol 未満の相対的な量の差異がある場合、このアルゴリズムは終了します。
例: RelTol=2e–3
データ型: single | double
モデルを当てはめる前に予測子データ X を標準化するフラグ。true または false のいずれかとして指定します。Standardize が true である場合、平均がゼロ、分散が 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 の長さは n です。ここで、n は X の行数です。少なくとも 2 つの値が正でなければなりません。
データ型: single | double
出力引数
一般化線形モデルの当てはめ情報。次の表に記載されているフィールドが含まれている構造体として返されます。
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 が cvpartition オブジェクトの場合、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 |
λ の非負の値に対して、lassoglm は次の問題を解決します。
この方程式の関数 Deviance は、切片 β0 と予測子係数 β を使用して応答に当てはめたモデルの逸脱度です。逸脱度の式は、
lassoglmに指定するdistrパラメーターに依存します。λ ペナルティ付き逸脱度を最小化することは λ ペナルティ付き対数尤度を最大化することと等価です。N は、観測数です。
λ は
Lambdaの 1 つの値に対応する非負の正則化パラメーターです。パラメーター β0 と β はそれぞれ、スカラーと長さ p のベクトルです。
λ が増えると、β の非ゼロの要素が減ります。
LASSO の問題は、Elastic Net のアルゴリズムとは対照的に β の L1 ノルムと関わっています。
厳密に 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.
拡張機能
並列実行するには、名前と値の引数 Options を指定します。statset を使用してオプション構造体の UseParallel フィールドを true に設定します。
Options=statset(UseParallel=true)
並列計算は CV が "resubstitution" の場合は使用されません。並列計算の詳細については、自動並列サポートを使用した MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2012a で導入
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- 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)