R言語

【R言語】リッジ回帰・ラッソ回帰 glmnetを用いたL1, L2正則化

  1. HOME >
  2. R言語 >

【R言語】リッジ回帰・ラッソ回帰 glmnetを用いたL1, L2正則化

スポンサーリンク

R言語でリッジ回帰・ラッソ回帰を実行する関数やその実行例を紹介します。

この記事では、モデルの過適合を回避するための正則化(regularization)をRで行い、実際にテストデータに対する予測精度が良くなっているか確認します。

この記事で紹介するRファイルは以下からダウンロードできます。

通常の重回帰分析や一般化線形モデル、多項式回帰については以下の記事を参照。

【R言語】関数lmによる線形回帰 単回帰分析・重回帰分析 回帰分析で予測する

R言語の回帰分析の実行方法を紹介していきます。回帰分析の実行方法だけでなく、回帰分析により作ったモデルでテストデータの予測も行っていきます。 実行方法では、回帰分析の結果の見方やその抽出方法を詳しく解 ...

続きを見る

【R言語】一般化線形モデル 関数glmの使いかた

一般化線形モデルを行う方法を解説していきます。 R言語で回帰分析を行う方法については、以下の記事で紹介しています。 一般化線形モデルを用いることで、母分布が正規分布でなくても線形モデルを構築することが ...

続きを見る

正則化

物理学や機械学習などでモデルの過適合や過学習を回避する手法の1つとして正則化があります。

次のように、誤差にペナルティー項を加えることで回帰係数が過剰に大きくならないように最適化を行うことができます。

\begin{align} \| \boldsymbol{y} - f(\boldsymbol{\beta}) \|_2^2+ \lambda\cfrac{1}{p} \| \boldsymbol{\beta} \|_p^p,\end{align}

ここに、\(\|\boldsymbol{\beta} \|_p^p\)は\(\boldsymbol{\beta}\)の\(p\)-ノルム。

\(p = 2\)ときL2正則化(リッジ回帰)

\begin{align}\label{eq1} \| \boldsymbol{y} - f(\boldsymbol{\beta}) \|_2^2 + \lambda\cfrac{1}{2} \| \boldsymbol{\beta} \|_2^2\tag{1}\end{align}

となり、\(p=1\)のときにL1正則化(ラッソ回帰)

\begin{align}\label{eq2} \| \boldsymbol{y} - f(\boldsymbol{\beta}) \|_2^2 + \lambda \| \boldsymbol{\beta} \|_1\tag{2}\end{align}

に対応します。

また、機械学習でよく用いられるエラスティックネットは、次のL2正則化とL1正則化のペナルティー項の和からなるモデルで与えられます。

\begin{align}\label{eq3} \| \boldsymbol{y} - f(\boldsymbol{\beta}) \|_2^2 + \lambda\left[\alpha \|\boldsymbol{\beta}\|_1+ \cfrac{(1 - \alpha)}{2} \| \boldsymbol{\beta} \|_2^2\right], \quad 0\leq \alpha \leq 1. \tag{3}\end{align}

\(\alpha = 0\)のとき\eqref{eq1}のL1正則化、\(\alpha = 1\)のとき\eqref{eq2}のL2正則化に一致します。

関数glmnet

以下関数glmnetとその引数の説明です。引数が多いのでよく用いるものだけ載せときます。

glmnet(x, y, family=c("gaussian","binomial","multinomial"), alpha = 1, nlambda = 100, lambda.min = ifelse(nobs
関数glmnetの引数
x説明変数に対応するベクトルまたは行列。
y目的変数に対応するベクトルまたは行列。
familycharacter型。目的変数の母集団分布。"gaussian"で正規分布、"binomial"で二項分布、"multinomial"多項分布。
alphanumeric型。\eqref{eq3}の\(\alpha\)。
nlambdanumeric型。ハイパーパラメータ\(\lambda\)の数。
lambda.minnumeric型。ハイパーパラメータ\(\lambda\)の最小値。

glmnetでリッジ回帰、ラッソ回帰、エラスティックネットを実行するには、次のように引数alphaを与える必要があります。

  • L2正則化(リッジ回帰):alpha = 0
  • L1正則化(ラッソ回帰):alpha = 1
  • エラスティックネット:0 < alpha < 1

実行例

上で紹介した関数glmnetを用いて、実際にL1正則化(ラッソ回帰)とL2正則化(リッジ回帰)を行っていきます。

多項式回帰にL2正則化を適用することで過適合を抑えたり、スパ―ス推定の観点でのL1正則化とL2正則化の違いについてみたりしていきます。

リッジ回帰を用いて過適合を回避する(L2正則化)

まずは、L2正則化(リッジ回帰)の実行例について見ていきます。多項式回帰にL2正則化を適用していきます。

データセットとして、次の多項式にホワイトノイズを加えた乱数を使用します。

パッケージggplot2glmnetを使うので事前にinstall.packagesを使ってインストールしておいてください。

datasetをプロットすると分かるように、下の画像のように多項式x * (x + 2) * (x + 1)の周辺にデータがサンプリングされています。

散布図

次に乱数を用いてトレインデータとテストデータを4:1の割合で作成します。

多項式回帰を用いてdatasetfxで予測していきます。次のように、関数lmを用いることで多項式回帰を実行できます。

事前に用意しておいたtestDataに対するモデルの予測精度を検証してみます。関数predictを用いて予測値を計算し平均二乗誤差とテストデータの散布図と回帰曲線は次のようになります。

多項式回帰

グラフから分かること

トレインデータに対する平均二乗誤差は小さいのですが、反対にテストデータに対する誤差は著しく大きいことが分かります。これがいわゆる過適合です。

これを回避する手法の一つして正則化があり、今回はL2正則化(リッジ回帰)を適用したいと思います。リッジ回帰はパッケージglmnetの関数glmnetの引数alphaを0にすることで実行できます。

通常の多項式回帰はpolyを用いて多項式を表現しましたが、glmnetの引数xには多項式に対応する計画行列を代入する必要があるため、2行目でmodel.matrixを用いて計画行列を作っています。また、4行目でcv.glmnetを用いてますが、これは最適なハイパーパラメータを決定するためです。クロスバリデーションにより最適なλを決定し、この値をもとに5行目でリッジ回帰を実行しています。今回はサンプル数が少ないのでフォールド数を5にしています(nfold = 5)。

また、plotを用いることでハイパーパラメータが変化したときの各回帰係数の挙動を確認することもできます。

L2正則化 回帰係数

関数cv.glmnetの結果をプロットすると、次のハイパーパラメータと誤差の関係がプロットされます。

L2正則化 誤差

リッジ回帰の結果は次のようにregression_ridgeの後ろに$を付けることで取得できます。

上を実行すると作業ディレクトリに次の画像のcsvファイルが作成されます。

リッジ回帰結果

最後に、リッジ回帰の予測精度をみていきます。次を実行するとリッジ回帰の平均二乗誤差と回帰曲線をプロットすることができます。

リッジ回帰

グラフから分かること

画像から分かるように、多項式回帰のときと比べてテストデータに対する平均二乗誤差が大幅に減少していることが分かります。

回帰係数が小さくなるような最適化の条件を与えることで、トレインデータへの過適合を回避しています。

ラッソ回帰とリッジ回帰の比較(L1, L2正則化の比較)

次にラッソ回帰の実行例を紹介します。ラッソ回帰とリッジ回帰の比較を行いたいと思います。

使用するデータセットは次のBostonです。BostonはパッケージMASSに入っているので事前にinstall.packagesでインストールしてください。

Bostonは次の14個の変数から成ります。一番最後の住宅価格medvを他の変数で予測したいと思います。

まず、リッジ回帰を実行したいと思います。次を実行するとリッジ回帰を実行することができます。

次にラッソ回帰を行います。ラッソ回帰は、関数glmnetの引数alphaを1に指定することで行うことができます。

ラッソ回帰の回帰係数とハイパーパラメータの関係をプロットすると次の画像のようになります。

L1正則化 回帰係数

リッジ回帰と同様に回帰係数をデータフレームとして保存します。

リッジ回帰とラッソ回帰の回帰係数を比較してみます。

Ridge回帰のindusは-0.038328191である一方、Lasso回帰では0.000000000となっており、回帰係数を疎(0)にする性質があることが分かります。

このように回帰係数を0にする、すなわち変数選択という意味でラッソ回帰がよく用いられます。

まとめ

R言語で正則化を実行する関数やその実行例を紹介しました。

パッケージglmnetを用いることでL1正則化L2正則化、またエラスティックネットを実行することが可能です。

クロスバリデーションによって最適なハイパーパラメータを決定する関数も実装されているため便利なパッケージです。

スポンサーリンク

  • この記事を書いた人
  • 最新記事

usagi-san

統計学とゲームとかをメインに解説していくよ。 数式とかプログラミングコードにミスがあったり質問があったりする場合はコメントで受け付けます。すぐに対応します。

-R言語
-, , , ,