Python入門トップページ


目次

  1. データを眺める
  2. 重回帰分析
  3. 重回帰分析とリッジ回帰
  4. リッジ回帰を自作してみよう
  5. scikit-learnでリッジ回帰をしてみよう

リッジ回帰をしてみよう

重回帰分析とリッジ回帰

重回帰分析

重回帰分析の定式化

前のページで考えた入力が \(x_1\)\(x_2\) であるような 2 次元の重回帰分析を考える.切片にあたるバイアスを \(w_0\) とし,\(x_1\)\(x_2\) に対する重み(係数)パラメータをそれぞれ \(w_1\)\(w_2\) とすると,重回帰分析の回帰式は

\[ \hat{y} = w_0 + w_1 x_1 + w_2 x_2 \]

となる.

今は2次元であるが,次元が大きくなると見通しが悪くなることからベクトルを使って表記してみよう.まず, 入力ベクトルは先頭に1を付加して,

\[ {\bf{x}}^{\rm T} = \left(1,~ x_1,~ x_2 \right) \]

と書くことにする.なお,\(\rm T\) は転置を意味するので,

\[ {\bf{x}} = \left( \begin{array}{c} 1 \\ x_1 \\ x_2 \end{array} \right) \]

である.一方で係数ベクトルを

\[ {\bf{w}}^{\rm T} = \left(w_0,~ w_1,~ w_2 \right) \]

と書くことにする.ベクトル表記を利用すれば,回帰式は次の通り書くことができる.

\begin{eqnarray} \hat{y} &=& w_0 + w_1 x_1 + w_2 x_2 \\ &=& \left( \begin{array}{ccc} w_0 & w_1 & w_2 \end{array} \right) \left( \begin{array}{c} 1 \\ x_1 \\ x_2 \end{array} \right) \\ &=& {\bf{w}}^{\rm T} {\bf{x}} \end{eqnarray}

もちろん,次のように書き換えることもできる.

\begin{eqnarray} \hat{y} &=& {\bf{x}}^{\rm T} {\bf{w}} \end{eqnarray}

前のページのデータでは10個のデータがあったが,データ数を \(N\) とし,\(i ~(=1,\cdots,N)\) 番目の入力データを \({\bf{x}}_i\)\(i ~(=1,\cdots,N)\) 番目の予測値を \(\hat{y}_i\) と書く.このとき,上の式を次のように書き並べることができる.

\[ \left( \begin{array}{c} \hat{y}_1 \\ \hat{y}_2 \\ \vdots \\ \hat{y}_N \end{array} \right) = \left( \begin{array}{c} {\bf{x}}^{\rm T}_1 {\bf{w}} \\ {\bf{x}}^{\rm T}_2 {\bf{w}} \\ \vdots \\ {\bf{x}}^{\rm T}_N {\bf{w}} \end{array} \right) = \left( \begin{array}{c} {\bf{x}}^{\rm T}_1 \\ {\bf{x}}^{\rm T}_2 \\ \vdots \\ {\bf{x}}^{\rm T}_N \end{array} \right) {\bf{w}} \]

さらに,これは次のように書ける.

\[ \left( \begin{array}{c} \hat{y}_1 \\ \hat{y}_2 \\ \vdots \\ \hat{y}_N \end{array} \right) = \left( \begin{array}{ccc} 1 & x_{11} & x_{12} \\ 1 & x_{21} & x_{22} \\ \vdots & \vdots & \vdots \\ 1 & x_{N1} & x_{N2} \end{array} \right) \left( \begin{array}{c} w_0 \\ w_1 \\ w_2 \end{array} \right) \]

上の式において,予測値のベクトルを \(\hat{\bf y} = (\hat{y}_1, ~\hat{y}_2, \cdots, \hat{y}_N )\)とし,入力データの行列を \({\bf X} \) とすると,\(\hat{\bf y} \) は次のように書ける.

\[ \hat{{\bf y}} = {\bf X}{\bf w} \]

重回帰の二乗誤差

重回帰分析では二乗誤差を最小にするような係数パラメータ \(\bf w\) を決めることになる.ここではその二乗誤差を定式化する.

データ数を \(N\)\(i ~(= 1, 2, \cdots, N)\) 番目の出力データを \(y_i\),回帰式 \({\bf{x}}^{\rm T}_i {\bf{w}}\) から得られた予測値を \(\hat{y}_i\) とする.このとき,\(i ~(= 1, 2, \cdots, N)\) 番目のデータに対する二乗誤差は

\[ \left( y_i - \hat{y}_i \right)^2 \]

と書けるので,すべてのデータに対する二乗誤差の合計\(E\)

\begin{eqnarray} E &=& \left( y_1 - \hat{y}_1 \right)^2 + \left( y_2 - \hat{y}_2 \right)^2 + \cdots + \left( y_N - \hat{y}_N \right)^2 \\ &=& \sum_{i=1}^{N} \left( y_i - \hat{y}_i \right)^2 \end{eqnarray}

となる.

さらに上の式はベクトルと行列を使って次のように書き換えることも可能である.

\begin{eqnarray} E &=& \sum_{i=1}^{N} \left( y_i - \hat{y}_i \right)^2 \\ &=& \sum_{i=1}^{N} \left( y_i - {\bf x}_i^{\rm T} {\bf w} \right)^2 \\ &=& \left( {\bf y} - {\bf X} {\bf w} \right)^2 \end{eqnarray}

準ニュートン法などの任意の最適化アルゴリズムを使って上式の \(\bf E\) を最小化する \(\bf w\) を求めればよいが, \( E\) を最小にする解は次のようになる.

\[ {\bf w} = \left( {\bf X}^{\rm T} {\bf X} \right)^{-1} {\bf X}^{\rm T} {\bf y} \]

リッジ回帰

リッジ回帰では,係数が極端に大きくなりすぎないように,重回帰の二乗誤差の式(上の式)に係数のペナルティとなる項を付け加える.これを正則化 (regularization) という.係数のペナルティは係数の二乗和にさらに重み \(\alpha ~(\geq 0)\) をかけ合わせたものになる.

まず,係数の二乗和は

\begin{eqnarray} w_0^2 + w_1^2 + w_2^2 \end{eqnarray}

である.ベクトル \( \bf w \) を使って次のように書くこともできる.

\begin{eqnarray} {\bf w}^{\rm T} {\bf w} \end{eqnarray}

上の \( {\bf w}^{\rm T} {\bf w} = w_0^2 + w_1^2 + w_2^2 \) という関係が成り立つことを念の為に確かめておく.

\begin{eqnarray} {\bf w}^{\rm T} {\bf w} &=& \left( \begin{array}{ccc} w_0 & w_1 & w_2 \end{array} \right) \left( \begin{array}{c} w_0 \\ w_1 \\ w_2 \end{array} \right) \\ &=& w_0^2 + w_1^2 + w_2^2 \end{eqnarray}

確かに,\( {\bf w}^{\rm T} {\bf w} \) が係数の二乗和を意味していることがわかりました.

リッジ回帰では係数の二乗和 \( {\bf w}^{\rm T} {\bf w} \) に重み \(\alpha ~(\geq 0)\) をかけた項を重回帰の \(E\) に加えて

\begin{eqnarray} E &=& \left( {\bf y} - {\bf X} {\bf w} \right)^2 + \alpha {\bf w}^{\rm T} {\bf w} \end{eqnarray}

を最小化するような係数 \( {\bf w} \) を求めることになる.これによって,係数が極端に大きくなりすぎないようにすることができる.

なお,上の \( E \) を最小にする解は次のようになる.

\[ {\bf w} = \left( {\bf X}^{\rm T} {\bf X} + \alpha {\bf I} \right)^{-1} {\bf X}^{\rm T} {\bf y} \]

ここで,\( {\bf I} \) は単位行列である.

目次に戻る