データ分析メモと北欧生活

旧Untitled Note. データ分析、計量経済・統計とR、水産管理、英語勉強、海外生活などについて備忘録や自分の勉強のOutputの場所として

MENU

【機械学習】1標準偏差ルールはLASSOの正則化係数の正しい選び方?

機械学習に関してはビギナーレベルの知識しかないのだが、引っかかった点を備忘録にしておく。

ベーシックな機械学習手法の一つにLASSOがある。もう少し広く言うと正則化手法の中に含まれる。

一般的な線形回帰に推定法に比べて、パラメータの値を抑えたりゼロにしたりすることで、手元にあるデータに対する過学習を防ぎ、モデルの汎化性能を向上させるというものだ。

線形回帰は誤差の平方和を最小にする最小二乗法によって推定するのが一般的だが、LASSOなどの正則化手法では、正則化項を加えて推定する。

例えば以下の線形モデルを推定するとする。

 y_{i} = x_{i}'\beta + \varepsilon_{i}

y_{i}は従属変数、 x_{i}は説明変数、 \betaはパラメータで、 \varepsilonは誤差項である。

このモデルで、説明変数の数が多い場合などに正則化を使う。正則化のうち例えばLASSO推定の目的関数は以下のようになる。

 \min \sum_{i=1}_{N} (y_i - x_{i}'\beta)^2 + \lambda ||\beta||

一項目は最小二乗法と同じだが、二項目にL1ノルムの罰則項がついている。直感的に言えば、 \betaを選んで一項目を最小にするのだが、自由に \betaを選んだ場合、二項目のL1ノルムが大きくなりすぎる可能性があるので、合計が大きくなりすぎないように \betaを選ぶのである。
この時、正則化係数である \lambdaが罰則項の強さを規定する。

ではこの \lambdaをどうやって選ぶのか?
手法としては、モデルの複雑さを表す一般自由度などの基準や、AICのような情報量基準を正則化手法向けに改良した基準を用いる方法が提案されているようだが、
現場でよく使われる手法はクロスバリデーションが多いようだ。*1

クロスバリデーション(CV)は、データをいくつかのグループに分け、一つのグループをテスト用データとしておいておき、残りのデータでモデル推定をやったあと、残しておいたテスト用データで当てはまりをチェックする、というプロセスをグループの数だけ繰り返して、当てはまりの尺度(例えば平均誤差二乗和)を計算して、もっともあてはまりのよいパラメータを選ぶという手法である。

ここが引っかかっているところである。というのは、正則化係数を選ぶ時、最も当てはまりの良い係数を選ぶのではなく、より大きい係数(強い正則化)の中で、平均誤差ニ乗和の標準偏差が、最も当てはまりの良いものより1だけ大きいものを選ぶという方法が標準だというからである。

日本語で検索してみたのだが、いまいちこれに関する言及はなく、R関連の記事でも最も当てはまりのよい係数( \lambda_{min})を選んでいる。

RでL1 / L2正則化を実践する - 渋谷駅前で働くデータサイエンティストのブログ

5分でわかるかもしれないglmnet

https://toukei-lab.com/%E7%B7%9A%E5%BD%A2%E5%9B%9E%E5%B8%B0%E3%83%BBlasso%E3%83%BBridge%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86%EF%BC%81

リッジ/Ridge回帰、Lasso回帰、Elastic Net (R - glmnet) - 東京に棲む日々

LASSO 回帰 / R | R/glmnet パッケージで LASSO によるスパース推定を行う方法

手元の日本語の教科書には具体的な選び方が書いていなかったのだが、英語での書籍ではIntroduction to Statistical Learningにはone-standard-error ruleという記述がある。

In this setting, we can select a model using the one-standard-error rule. We first calculate the one-standard- error rule standard error of the estimated test MSE for each model size, and then select the smallest model for which the estimated test error is within one standard error of the lowest point on the curve. The rationale here is that if a set of models appear to be more or less equally good, then we might as well choose the simplest model—that is, the model with the smallest number of predictors. In this case, applying the one-standard-error rule to the validation set or cross-validation approach leads to selection of the three-variable model. (P.214)

以下Deep Lによる翻訳を少し修正したもの。

この設定では、1標準誤差ルールを用いてモデルを選択することができます。我々はまず、各モデル・サイズについて推定されたテストMSEの1標準誤差ルール標準誤差を計算し、次に、推定されたテスト誤差が曲線上の最低点から1標準誤差以内である最小のモデルを選択する。ここでの理論的根拠は、モデルのセットが多かれ少なかれ等しく良好であるように見える場合、最も単純なモデル、すなわち、予測変数の数が最も少ないモデルを選択した方がよいかもしれないということです。この場合,検証集合またはクロスバリデーション・アプローチに1標準誤差ルールを適用すると,3変数モデルを選択することになる.

つまり、この1標準誤差(one-standard-error rule)のアイデアとしては、あんまり予測誤差が変わりない範囲(=1標準誤差の範囲)で最もシンプルな(=係数の少ない=正則化の強い)モデルを選ぼうというものである。

ちなみに上の本、Introduction to Statistical Learningは英語のみですが、無料で公開されている
この翻訳本も販売されている。

Rによる 統計的学習入門

Rによる 統計的学習入門


Rでの例

Rだと以下のようになる。
glmnetパッケージを使用して、練習データを推定する。

# glmnetパッケージのロード
pacman::p_load("glmnet")

# 練習用データをロード
data(QuickStartExample)

# 10-fold CVによるランダム性から結果を複製可能にするためにシードを固定
set.seed(3)

# LASSOを推定
cvfit = cv.glmnet(x,y, alpha = 1)

cv.glmnetによって、自動的に10-fold Cross Validationを実行する。
平均誤差二乗和を縦軸に、対数を取った正則化係数を横軸にとったグラフが以下である。

  plot(cvfit)

f:id:keita43a:20200512063840p:plain


この図を見ると、対数を取った正則化係数が-2あたりまでは平均誤差二乗和に大きな差はないが、それより正則化を強くすると急激に予測誤差が大きくなることがわかる。

この図において、二本ある点線のうち、左側がもっとも平均誤差二乗和を小さくする正則化係数 \lambda_{min}で、右側が平均誤差二乗和が1標準誤差に収まる範囲で最も大きな正則化係数( \lambda_{1se})である。

これらの正則化係数はcv.glmnetが自動的に推定してくれる。
実際に推定された正則化係数はそれぞれ

> cvfit$lambda.min
[1] 0.07569327

> cvfit$lambda.1se
[1] 0.1451729

となっている。

これらの正則化係数にそれぞれ対応した係数の数を見てみると

> length(coef(cvfit, s = "lambda.min")@x)
[1] 11
> length(coef(cvfit, s = "lambda.1se")@x)
[1] 9

となり、\lambda_{min}ならば、係数の数は11だが、\lambda_{1se}なら係数の数は9と少なくなる。
この変化を端的に表した図が以下である。この図では赤縦線が\lambda_{min}、青縦線が\lambda_{1se}を表し、他のそれぞれのラインが各係数の推定値が \lambdaの大きさに対応して収縮していく様子が描かれている。

plot(cvfit$glmnet.fit, xvar = "lambda") 
abline(v = log(cvfit$lambda.min), col = "red")
abline(v = log(cvfit$lambda.1se), col = "blue")

f:id:keita43a:20200512064315p:plain


このように、エラーがあまり最小値と変わりない範囲で係数の少ないモデルを選んでいる。

しかし、なんともアドホックな基準ではある。
一つは、1seが小さければ問題ないが、大きくなった場合に正則化しすぎるということはないのか?ということ。
また、もう一つはCVによって汎化性能をチェックしているのに、そのCVが手元のトレーニングデータによって行われたからといって、さらに過学習を警戒して
正則化を強めるのは、なぜか?という点だ。CV自体がそもそも外部のデータにも適用されるかどうかをチェックするためのプロセスではないのだろうか? 

Cross Validated(という名前の質問サイト)にも似た疑問が寄せられている。

stats.stackexchange.com

stats.stackexchange.com

そこではone-standard-error ruleに言及する論文や教科書などが挙げられているが、1つ目の回答に集約されている気がする。

>>The suggestion is that the choice of one standard error is entirely heuristic, based on the sense that one standard error typically is not large relative to the range of λ values.<<

heuristicとは発見的、という意味であり、計算機科学などの世界では、必ず正しい答えを導けるわけではないが、ある程度のレベルで正解に近い解を得ることができる方法という意味でheuristicsを使う。
本来ならば、時間がかかる手法やCVでもleave-one-out (一個抜き)CVでもを行うべきところをk-fold CVという方法で時間的な節約を行っているために、起こりうるoverfittingの可能性をこの規則によってできるだけ下げることができるという理解でいいのだろうか?

もし詳しい方がいらっしゃたらコメント等で教えてほしいです。