今回のブログでは前回の続きで多重線形回帰(重回帰:multiple linear regression)について書こうと思っています。
前回のブログで紹介した単純線形回帰では、変数が1つだけで結構簡単でした。でも実際の世界では変数が1つだけの簡単な場合はあり得ないと思います。変数が複数の場合はどうするかが今回の内容である、多重線形回帰になります。
単純: Y = A * X + B
多重: Y = A1 * X1 + A2 * X2 + … Ai * Xi + B
平均二乗誤差
変数が複数の場合は前回の最小二乗法だけではうまく計算ができないため、平均二乗誤差を使います。(説明はwikipediaを参照:https://ja.wikipedia.org/wiki/%E5%B9%B3%E5%9D%87%E4%BA%8C%E4%B9%97%E5%81%8F%E5%B7%AE)
簡単にいうと今回の場合には実際値と予測値(予測値は適当に設定する)の誤差の2乗の平均値のことです。
その数値が一番小さくなる時が適切な値になります。
※マシンラーニングでは a(傾き) と b(切片) を求めるため適切な傾き値と切片値になります。
勾配降下法
前回のブログでは予測値を得る時、適切な傾きを探すことが大事でした。傾きを表す a 値が多くなったり、小さくなったりすると正しい予測値から離れることになります。
これを2次関数グラフにすると
こんなグラフになります。
このグラフで誤差が一番小さいところは矢印があるところになります。このグラフで矢印があるところの値を求めるとすると、赤い線のどこかに点をつけて矢印がある方向に移動しながら前の点で計算した値と移動した後に計算した値を比較して矢印があるところに近づけることになります。それで点の位置が次々と下降するので勾配降下法になります。
ここで微分が登場します。微分積分については数学になりますのでここでは説明しません。(僕の時代は韓国では文系では微分積分は学びませんでしたので、今勉強した知識では他の人に説明できるレベルではないと思います。)
微分というのはある点での瞬間傾きです。赤い線の上にある点を入れて線を引くと傾きになります。ここで矢印があるところに点を入れて線を引くとx軸と並行になります。つまり傾きが0になりますね。これはまた微分値が0ってことになります。
※微分値(瞬間傾き) = Y誤差 / X誤差
微分値が0になる順番を整理すると
- 赤いグラフ上のある点の微分値を求める。
- ある点の傾きの逆方向に移動して別の点の微分値を求める。
- 微分値が0になるまで繰り返す。
この順番で微分値が0になる点を求める際に気をつけることがあります。2番目で点を移動する距離が遠すぎると点が降下しながら矢印がある点に近づくのではなく、むしろ上昇して無限に繰り返してしまう、ということで移動する距離値も適切に決めなければなりません。それが「学習率」です。勾配降下法は2次グラフを描いて適切な学習率を設定して微分値が0になる点を求めることです。
前回のデータをもう一回使うと以下の表になります。ここで今回使う平均二乗誤差をために実際値と予測値の誤差を追加します。
一番適切の場合
a = 0.41
b = 2.5
ゲームプレイ時間 | 10 | 20 | 30 | 40 | 50 |
クリアステージ数 | 4 | 17 | 10 | 20 | 23 |
予測値 | 6.6 | 10.7 | 14.8 | 18.9 | 23 |
誤差 | -2.6 | 6.3 | -4.8 | 1.1 | 0 |
2乗 | 6.76 | 39.69 | 23.04 | 1.21 | 0 |
(-2.6)^2 + (6.3)^2 + (-4.8)^2 + (1.1)^2 + (0)^2 / 5 = 14.14
上記の場合が一番適切か検証するため、a、b を適当に設定してみます。
a = 0.5
b = 2
ゲームプレイ時間 | 10 | 20 | 30 | 40 | 50 |
クリアステージ数 | 4 | 17 | 10 | 20 | 23 |
予測値 | 7 | 12 | 17 | 22 | 27 |
誤差 | -3 | 5 | -7 | -2 | -4 |
2乗 | 9 | 25 | 49 | 4 | 16 |
(-3)^2 + (5)^2 + (-7)^2 + (-2)^2 + (-4)^2 / 5 = 20.6
a = 0.3
b = 3
ゲームプレイ時間 | 10 | 20 | 30 | 40 | 50 |
クリアステージ数 | 4 | 17 | 10 | 20 | 23 |
予測値 | 6 | 9 | 12 | 15 | 18 |
誤差 | -2 | 8 | -2 | 5 | 5 |
2乗 | 4 | 64 | 4 | 25 | 25 |
前回求めた値が一番小さいです。
今は a と b を自分が適当に入れてみました。それでは勾配降下法を使い、a と b を求めてみます。まず予測値は ax + b になります。
そのため誤差は (ax + b) – 実際値、2乗は ((ax + b) – 実際値)^2 になります。
ここで知りたい値は a と b になりますので微分しなければなりません。でも a と b を合わせて微分するのではなく、a をため、b のため各々微分しなければなりません。それを「偏微分」(説明はwikipediaを参照:https://ja.wikipedia.org/wiki/%E5%81%8F%E5%BE%AE%E5%88%86)と言います。
※かける記号は変数xと見にくいため*に表記
実際に a と b を求める順番は
- 最初には a と b を 0 に設定
- a の偏微分 = (x * (y – (a * x + b)))の合計 / 2 / n
b の偏微分 = (y – (a * x + b))の合計 / 2 / n
3. a の偏微分と b の偏微分の結果に設定した学習率をかけて a と b を更新する。
繰り返しながら平均二乗誤差が一番小さい時の a と b を探す。
結果のグラフは以下のようになります。
ここまでが勾配降下法になります。
最初は説明を簡単にするために変数を1つにしましたが、最初語ったように変数が複数になる場合が本題です。
でもここまで来てなんとなく流れが理解できれば複数の変数の場合も簡単に解決できます。
多重線形回帰(重回帰)
多重線形回帰は変数が複数の場合使います。関数式で表すと y = a1 x 1 + a2 x 2 + … anxn + b になります。これは上記とどう異なるようになるか見てみます。
基本的には上記とは変わりません。a が増えた分、偏微分も増えるだけです。
※変数が2つの場合
- 最初には a と b を 0 に設定
- a1 の偏微分 = (x1 * (y – (a1 * x1 + a2 * x2 + b))) の合計 / 2 / n
a2 の偏微分 = (x2 * (y – (a1 * x1 * a2 * x2 * b))) の合計 / 2 / n
b の偏微分 = (y – (a1 * x1 + a2 * x2 + b)) の合計 / 2 / n
3. a の偏微分と b の偏微分の結果に設定した学習率をかけて a と b を更新する。
繰り返しながら平均二乗誤差が一番小さい時の a と b を探す。
今まで簡単に単純線形回帰と多重線形回帰についてみてみました。データの分析の方法は他にもたくさんあり、数学(特に統計)の式もっとあると思いますが、今のところでは初級の本を何回か繰り返して読んで理解はできたので自分で直接簡単なものから作って社内のLT(勉強発表会)で発表してみようと思ってます。