【入門】単回帰 〜scikit-learnを使って実装〜

回帰とは

回帰とは得られたデータxを \(Y=f(X)\)という関数に当てはめることを言います。
この関数のことをモデルとも言います。

例えば、以下のようなデータがあった場合、

f:id:ttt242242:20190905145606g:plain

以下のように\(Y=f(X)\)に当てはめることです。

f:id:ttt242242:20190905145716g:plain

そして作成したモデル\(Y=f(X)\)を用いて、
新しいデータ\(x_{new}\)が出た時の予測値\(y_{new}\)を算出します。

単回帰とは

単回帰は、以下のように入力が1つ\(x\)のモデルです。

先ほどの図のモデルと同様に直線になります。
このモデルを、得られたデータに適応させるために\(a\)と\(b\)を求める必要があります。
この時に\(a\)と\(b\)は最小二乗法という方法によって求めることができます。
最小二乗法とはデータの集合とモデルとの二乗誤差を最小にするパラメータを求める方法です。

プログラムで単回帰を試してみる

scikit-learnという有名な機械学習ライブラリを用いて単回帰を試してみます。

scikit-learnは以下のコマンドでインストールできます。

今回は以下のようなデータに対して回帰分析を行っていきます。

元データ

ソースコードを以下に示します。

ソースコードの21〜26行目で\(a\)と\(b\)を求めています。

上記のコードを実行すると、パラメータを出力して、

そのパラメータの単回帰の結果をプロットします。

元データと単回帰よって得られた結果

うまく単回帰を行えているようです。

最小二乗法によってパラメータを求める

解析的(数学的)にパラメータを求めてみましょう。

最小二乗法とは、データ群とモデル(関数)の二乗誤差を最小にするパラメータを求める手法で、回帰問題等でよく用いられる手法です。

少し数式が多くなりますが丁寧に解説していきます。

二乗誤差

まず最小化したい二乗誤差ですが、
これはモデル(関数)と実際のデータと差(誤差)を二乗した誤差です。

例えば以下のようなデータがあります。

そして、今回は線形モデル\(y=ax+b\)によって表現したいとします。

このときのモデルとデータとの二乗誤差は、

この図の\(E_i\)の総和がモデルと各データとの二乗誤差の和が二乗誤差となります。

$$
\begin{eqnarray}
E &=& E_1 + E_2 + E_3 + E_4 + E_5 \\
&=& \bigl(y_1- (ax_1+b) \bigr)^2+ \bigl(y_2- (ax_2+b) \bigr)^2+ \bigl(y_3- (ax_3+b) \bigr)^2 \\
&+& \bigl(y_4- (ax_4+b) \bigr)^2 + \bigl(y_5- (ax_5+b) \bigr)^2 \\
&=& \sum_{i=1}^{5}\bigl(y_i- (ax_i+b) \bigr)^2 \\
\end{eqnarray}
$$

これをデータがn個の場合で一般化すると

$$
\begin{eqnarray}
E &=& \sum_{i=1}^{n}\bigl(y_i- (ax_i+b) \bigr)^2\\
&=& \sum_{i=1}^{n}\bigl(y_i- ax_i-b) \bigr)^2
\end{eqnarray}
$$

これを二乗誤差と言います。
なぜ、誤差に二乗するのかというと、単純な誤差(これを絶対誤差という)だと 誤差を総和誤差同士で打ち消してしまい、誤差が消えて可能性があるからです。

最小二乗法では、この二乗誤差を最小化するようなパラメータを求めます。

最小二乗法の手順

では、先程の二乗誤差を最小化するパラメータを求めてみましょう。

手順としては、以下のようになります。

  1. 二乗誤差をパラメータ\(a\), \(b\)によって微分(偏微分)し、勾配が0となる2つの方程式を得る
  2. 2つの連立方程式を解いて、パラメータ\(a\), \(b\)を求める

では、最小二乗法によってパラメータ\(a\)と\(b\)を求めてみましょう。
まず、データの集合とモデルの誤差\(E\)は以下のようになります。

1. 二乗誤差をパラメータ\(a\), \(b\)によって微分し、勾配が0となる2つの方程式を得る

この二乗誤差を最小にする値は、
この二乗誤差の各パラメータ\(a\), \(b\)に対する勾配が0になるところを求めれば良いことがわかります。

まず、二乗誤差\(E\)をパラメータ\(a\)によって微分してみましょう。

同様にパラメータ\(b\)によって微分します。

2つの方程式(連立方程式)が得られました。

$$
\begin{eqnarray}
-\sum_{i=1}^{n} x_iy_i +a\sum_{i=1}^{n}x^2_i + b\sum_{i=1}^{n}x_i = 0 \tag{1} \\
\sum^{n}_{i=1}y_i -a \sum^{n}_{i=1}x_i -nb = 0 \tag{2}
\end{eqnarray}
$$

この連立方程式を使って\(a\)と\(b\)を求めていきます。

2. 得られた連立方程式を解く

(1)式に\(\times n \)

$$
\begin{eqnarray}
- n\sum^{n}_{i}x_i y_i + na \sum^{n}_{i} x^{2}_{i} + nb\sum^{n}_{i}x_i = 0 \tag{3}
\end{eqnarray}
$$

(2)式に\(\times \sum_{i}x_i\)

$$
\begin{eqnarray}
\sum^{n}_{i=1}x_i\sum^{n}_{i=1}y_i -a (\sum^{n}_{i=1}x_i)^{2} -nb\sum^{n}_{i=1}x_i = 0 \tag{4}
\end{eqnarray}
$$

(3)+(4)は

$$
\begin{eqnarray}
na\sum^n_{i=1} x_i^2 + \sum^n_{i=1} x_i \sum^n_{i=1} y_i -n \sum^n_{i=1} x_i y_i -a (\sum^n_{i=1} x_i)^2=0 \\\\
a(n\sum^n_{i=1} x_i^2 - (\sum^n_{i=1} x_i)^2) = -\sum^n_{i=1} x_i \sum^n_{i=1} y_i + n\sum^n_{i=1} x_i y_i \tag{5} \\
\end{eqnarray}
$$

(5)式をパラメータ\(a\)で整理すると

よって、

$$
\begin{eqnarray}
a = \frac{\frac{1}{n}\sum^n_{i} x_i y_i-\bar{x}\bar{y}}{\frac{1}{n}\sum^n_{i} x_i^2 - \bar{x}^2}
\end{eqnarray}
$$

同様にパラメータ\(b\)についても求めます。
式(2)と先程求めた\(a\)から

$$
\begin{eqnarray}
nb &=& \sum^n_{i} y_i -a \sum^n_{i} x_i \\
nb &=& n\bar{y} - a n\bar{x} & \scriptstyle{\bar{x}=\frac{1}{n}\sum_{i}^{n}x_i\text{から}} \\
\end{eqnarray}
$$

から、式を整理すると\(b\)は、

$$
\begin{eqnarray}
b = \bar{y} - \bar{x} \frac{\frac{1}{n}\sum^n_{i} x_i y_i-\bar{x}\bar{y}}{\frac{1}{n}\sum^n_{i} x_i^2 - \bar{x}^2}
\end{eqnarray}
$$

\(a\)と\(b\)を求めることができました。

参考文献(教科書)

ITエンジニアのための機械学習理論入門

タイトルとURLをコピーしました