久しぶりに機械学習の復習をしてみたので、学んだことをまとめておく。

機械学習は大きく分けると、回帰分析・分類・クラスタリングと3つのカテゴリに分けられるが、今回は回帰分析編。

そして今回は、回帰分析の中でも「最小二乗法」を使った回帰直線の描き方について学んでいく。

回帰分析とは

まず、以下のグラフを見てみよう。

広告のクリック単価(CPC)に対応するクリック数を表すグラフで、例えば約140円のクリック単価をかけた広告では約450クリックを得ることができる、ということが分かるグラフとなっている。

さて、このグラフを見るとクリック単価を上げれば上げるほど得られるクリック数が多くなることが分かるが、ではクリック単価として200円を設定した時、いったい何クリックを得ることができるのか。

これを、現在あるデータを元に予測分析するのが「回帰分析」だ。

そしてデータを元に以下のような予測材料となる直線のことを「回帰直線」という。

回帰直線の描き方

回帰直線は一次関数で、以下の式から成り立つ。

$$y = ax + b$$

aが傾き、bが切片を表すが、回帰における数式では、これから求めるパラメータとしてθを使う。

$$y = θ_{0}x + θ_{1}$$

関数として表すと以下のとおりとなる。

$$f_{θ}(x) = θ_{0}x + θ_{1}$$

それではまず一例として、パラメータθ0とθ1にそれぞれ1と2を代入した回帰直線をJupyter notebookを使って描いてみる。

%matplotlib inline

import matplotlib.pyplot as plt
import numpy as np

x = np.array([58, 70, 81, 84, 132, 230, 262, 289, 295, 321])
y = np.array([374, 385, 375, 401, 439, 578, 616, 640, 689, 799])

# 一次関数
def func01(x):
    return a * x + b

# グラフ描画
def func_plot():
    z = func01(x)

    plt.scatter(x, y)
    plt.plot(x, z, color='red')

    plt.xlabel('CPC')
    plt.ylabel('Click')
    plt.xlim(0, 400)
    plt.ylim(0, 900)

# aとbのパラメータを仮に1、2としてみる
a = 1
b = 2

func_plot()

さすがに適当に設定したパラメータなので、描かれた直線も的外れな位置に配置されている。

実際のデータと直線の距離がかなり離れているが、これから最小二乗法を使ってこの距離を限りなく近づけていく。

最小二乗法

先述のとおり、これから直線とプロットされたデータの誤差を無くしていくのだが、まずはこの誤差の和を求める式を紹介する。

$$E(θ) = \frac{1}{2}\sum_{i=1}^{n}(y_{i} – f_{θ}(x_{i}))^{2}$$

Eは誤差を英語で言った時のErrorの頭文字。
式の詳しい説明は省く。

先ほどのコードで設定したパラメータを元に、この式に実際の値を代入してEを求めると以下のとおりとなる。

e = ((y - func01(x)) ** 2).sum() / 2
print('E: ', e)

# E:  609870.0

ここで表示されたEの値に特に意味はないが、この値を限りなく小さくなるようにパラメータを調整していく。
回帰分析において、このようなアプローチは最小二乗法と呼ばれる。

公式を使ってパラメータを求める

さて、先ほどパラメータを調整していくと書いたが、実際に値を少しずつずらして最小のEを求めるなんてことは、時間がいくらあっても足りない。

しかし数学には素晴らしい公式が用意されており、以下の公式を使うと簡単に最適なパラメータを求めることができるのだ。

$$a = \frac{\bar{xy} – \bar{x}\bar{y}}{\bar{x^{2}} – \bar{x}^{2}}$$

$$b = -a\bar{x} + \bar{y}$$

この式をPythonコードに直してパラメータを求め、回帰直線を描いてみた。

a = ((x * y).mean() - (x.mean() * y.mean())) / ((x ** 2).mean() - x.mean() ** 2)
b = -(a * x.mean()) + y.mean()

func_plot()
func_print_e()
# E:  4643.018443878848

理想の直線を描くことができ、元々60万以上あったE値も最小限におさえることができた。

機械学習系のライブラリを使えば、このような回帰直線も簡単に描くことができるが、ここで紹介した基礎を知り、その中身について少しは把握しておくのも良いかもしれない。