投稿者leck_3328TweetPocket前回は線形回帰の最も基礎的な回帰手段である最小二乗法を扱った。最小2乗法(OLS)をSCIKIT-LEARNで使ってみるここでは以下の損失項を最小にするようなパラメータwの組を求めた。$$|Xw-y|^2$$今回は手元にある訓練データを過剰に学習してしまうオーバーフィッティング(過学習)を防ぐための工夫の1つとして、損失項の中にパラメータの値の大きさを制限するものを入れるものがある。その中でもパラメータベクトルのノルムの1乗を損失に加えるラッソ(Lasso)回帰とリッジ(Rdige)回帰について数式面で簡単にさらったあと、scikit-learnで実際に使ってみる。今回も以下のscikit-learnの公式サイトを参考にしながらまとめた。scikit-learnそれぞれの回帰の特徴としてはリッジ回帰パラメータの値が増大するのを防ぐことでオーバーフィッティングを防ぐ。ラッソ回帰モデルに使う特徴量(説明変数)の数を減らすことでオーバーフィッティングを防ぐ。定式化リッジ回帰ではパラメータwの値が大きくなりすぎないように(生成されるモデルの形が歪になりすぎないように)パラメータのノルムの2乗(L2ノルム)を損失Lの値に加える。|w|^2$$ここでXはNxpの行列で、p個を1つのセットにしたデータをNセット分格納した行列(pは特徴量の数)。yはN次元の縦ベクトルで教師データ。w_p)$$が今回推定したいパラメータ。\$$のモデルを構築するのが最終目標。Lの値が最小になるようなパラメータwを求める。ここのαは正則化項と二乗誤差との相対的な重要度を調節するハイパーパラメータなので、手動で調節するところ。これを見ると、逆行列を求めやすくなるように単位行列のα倍したものを足し合わせている。実装まずは学習させる元のデータを作成する。1.5が定数項このデータをプロットすると以下のような感じ。curve')plt.xlabel('x')plt.ylabel('y')plt.legend()plt.grid()plt.show()これを以下のモデルで学習させる。\$$今回、変数はxのべき乗のみにした。y)結果をプロットする。[1.74259826]少ない点の数でもパラメータの値を抑制できるのでただの最小2乗法(OLS)よりも程よく近似できていることが分かる。学習されたパラメータは以下の感じ。0.015パラメータの絶対値が抑制されているのが分かる。αの値を決めるαの値を勝手に決めてもらうことも可能。validation)を使って丁度良いαの値を指定することができる。定式化ラッソ(Lasso)ではパラメータのノルムの1乗の項(L1ノルム)が損失に付け加えられる。\$$サンプル数で二乗誤差を正規化しているがリッジ回帰との本質的な違いはL2ノルムではなくL1ノルムだけが付け加わっていること。この形の損失だとαの値が十分に大きければwの成分の一部が0になり、疎な解(有効な特徴量の数が少ないモデル)を得られる。αの値で正則化の度合いを調整する。変数選択をする基準Lasso回帰は回帰に使用する変数を減らす目的で使われるので、その変数を選択する基準をいくつか用意している。先ほどのサインカーブの予測を行う。-0.018変数が選択されていることが分かる。学習させたモデルを可視化してみる。label='lasso(α=0.1)')plt.xlabel('x')plt.ylabel('y')plt.grid()plt.legend()plt.show()かなり程よく近似されてるのが分かる。今回のケースではリッジ回帰よりもラッソ回帰の方がうまく回帰できたようだ。Validation)で推定する。LeastAngleRegressionを使ったLassoLarsCVがあるが、より多次元データに対してはLassoCVの方が好ましいとされている。cv=5)lasso_cv.fit(X,y)print(lasso_cv.alpha_)実行結果1.0グラフをプロットしてみる。学習されたパラメータは以下の通り。-0.018まとめ今回はラッソ回帰とリッジ回帰についてまとめた。線形回帰ではかなりお世話になる変数であり、リッジ回帰はkaggleでもモデルの一部として使われることもある。シンプルながらも汎用性は高いもののようだ。理論的にもっとよく知りたい方は以下のサイトが参考になるので見てみてほしい。ubuntu著者プロフィール。