最小二乗法
関数を「データにあわせる」というのはどういうことか?
上のページの例のように、感覚的にあわせるのではなく、ある基準をもって客観的に「あわせる」必要がある
最小二乗法という方法が、その基本的な原理である
「誤差」をみる
「関数をデータにあわせられている」というのは、関数とデータの誤差が小さい状態であると考える
たとえば直線モデル$ y = ax+bとデータの誤差は、以下の図で示す点線にあたる
https://gyazo.com/ed4d535eb844561453c2836e2e881fa2
「誤差」を、「データの$ yの値」から「関数(直線)の$ yの値」を引いたものと定義する
たとえばこの図でいうと、そのように計算した誤差の値が以下のようになるとする
https://gyazo.com/cdfcabe2c9f18bf7d6f4e87367d3355a
このように、データごとに「データと関数との誤差」が計算できる
この誤差を、全体的に、可能な限り小さくするような直線を引くことができれば、全体の誤差が小さくなるだろう
全体的な誤差の程度:平均二乗誤差(MSE)
「全体的に誤差を小さくする」にはどうすればよいか?
全体的な誤差の程度を表すものとして「誤差の平均」を計算し、これを小さくすることが、ひとつの有力な考え方になる
ここで、各データの誤差にはプラスの値とマイナスの値があるので、誤差を二乗し、その平均をとることを考える
この、「誤差を二乗したものの、全データでの平均」を、平均二乗誤差(MSE: Mean Squared Error)という
$ MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y_i})^2
$ n:データの数、$ y_i:データの出力値、$ \hat{y_i}:モデル(関数)の出力値
このMSEが小さくなるような関数が、「データにあわせることができている、良い関数」ということになる
https://gyazo.com/cdfcabe2c9f18bf7d6f4e87367d3355a
この図では、$ MSE = \frac{(-0.4)^2+ (0.6)^2 + (-0.1)^2 + (0.2)^2 + (-0.7)^2 + (0.5)^2 + (-0.2)^2}{7} = 0.1928...となる
MSEのままでも指標になるが、二乗してしまっているために、大きな値になってしまい、直感的にとらえにくい値になっている
そのため、わかりやすさのために、MSEの正の平方根をとったRMSE(Root Mean Squared Error)がよく用いられる
$ RMSE = \sqrt{MSE}
上の例では$ RMSE = 0.439...となる
これは「平均して0.439程度、直線とデータが離れている」と解釈できる
つまりRMSEは、「平均してどの程度誤差があるか?」ということを示す指標になる
「誤差が小さくなるように」関数を決めるということ
たとえば下の図は、3パターンのパラメータを設定して直線を引いたもの
「誤差を二乗して平均する」ので、大きな誤差を含んでいる場合はMSEは大きくなる
下の場合は、一番右の図が最もMSEが小さい
https://gyazo.com/1ee4e6d37797b0695244f90a1b504299
ここで、いま求めたいのは、MSEがなるべく小さい関数であるので、上の図では、一番右が3つのうちで最も「良い」関数であるとみなせる
では、無限に考えられるパラメータの設定のなかで、「最もMSEを小さくできるパラメータ」はどう決めればよいか?
それをみつけることができれば、最適な関数を求めることができる
この、MSEを最も小さくするパラメータをみつける数学的な方法として、最小二乗法という方法がある
この最小二乗法は、行列という数学的な方法を使うと簡単に計算でき、答えを求めることができる
今回の直線モデルは最小二乗法が使えるので、データに対して最適な直線、というものを求めることができる
なお、モデルによっては最小二乗法が使えないため、別の方法を使ってパラメータを決めるが、「全体的な誤差をなるべく小さくするような関数のパラメータを求める」という基本的な考え方は同じ
Pythonではどう実現するか
scikit-learnが持つ、linear_modelという線形モデルの機能群の中にある、LinearRegressionという機能を使う
(Linear Regressionというのは「線形回帰」。直線モデルというのは、正確には、「線形回帰モデル」とよばれるモデルの一種と捉えられます)
まとめ
機械学習(教師あり学習)における「学習」というのは、データにあわせられるような関数を求めること、つまり、関数をデータにあわせられるように、関数のパラメータを決定することである
機械学習(教師あり学習)というのは要するにそういうことをやっているんだ、という理解がとても大切です
どんな複雑なモデルも、原理は同じで、データにあうような関数を作っているのです!