前回は「今後学習していくものがそもそも何なのか」という話をしました。今回は統計的学習に焦点を絞って、統計的学習の雰囲気(何やってるのか、何が目的なのか)をなるべくわかりやすく説明していこうと思います。
統計的学習とは
前回の復習も兼ねて、統計的学習について具体的に説明します。前回のブログでは、統計的学習とは「データを分析するための様々な手法」とざっくり説明しました。
ではこれが具体的にどういうことなのか。前回例として挙げた気象データをもう一度使って説明します。
この気象データには一日の「気温」「湿度」「雲量」「天気」のデータが過去一ヶ月分あります。厳密に言うと温度とか湿度とかは短い時間で変化するものなので、一日を単位にしてまとめて良いものかどうかはわかりませんが、ここでは
一ヶ月の気温:x1, x2, ..., x30 = X
一ヶ月の湿度:y1, y2, ..., y30 = Y
一ヶ月の雲量:z1, z2, ..., z30 = Z
一ヶ月の天気:w1, w2, ..., w30 = W
とします。大学で習う行列の概念が入ってきましたが、要は一日分の気温のデータをx1やx2と表現し、気温のデータの塊をX、湿度のデータの塊をYと表現する感じです。
ここで、関数fを使って今までの気温、湿度、雲量から明日の気温aを予測するとします。
a = f(X, Y, Z) + ε
ここで、左辺のaを出力変数または応答変数と呼び、右辺のX、Y、Zを入力変数または説明変数と呼びます。
f(X, Y, Z)は入力変数をなんか上手いこと計算している部分です。最後の「ε」(イプシロンとよみます)は誤差です。つまり、気温、湿度、雲量とは全く関係ない、偶然とか他のデータの影響です。入力変数では絶対に計算できない部分なので、εと適当な文字をあててほっといておきます。
統計的学習は最適な関数fを探す為に使われる色々な手法のことです。
fは一次関数だったり二次関数だったりしますが、具体的にどんな関数なのかは知らなくても良い場合と知らないといけない場合があります。
予測と推論
関数fを探す目的は2つあります。
- 単純に予測したい
- 入力変数と出力変数の関係を知りたい
1では、適切な関数を選択できればそれで良いので、関数fがどんな関数なのかは正直どうでも良いという場合です。今流行りのディープラーニングがこれに当たります。ディープラーニングの内部でどういう計算が行われているのかは人間が知ることはありませんが、とりあえず良い予測精度が出ているのでヨシ!という感じで使われています。
一方、2では入力変数が変化した場合、出力変数にどのような影響が起こるかを明らかにするのが目的です。気象データならYが全体的に大きくなった場合、つまり湿度の高い日が続くと気温は上がるのか下がるのかを調べます。その中で関数fがどういう関数なのかを知る必要が出てきます。
fの推定
fを推定するには色々なアプローチがありますが、大きく分けるとパラメトリック法とノンパラメトリック法に分けられます。
パラメトリック法
関数fの形を決める→関数fの数字を決めるという順序で行われる推定方法です。
まず、「関数fの形を決める」という段階では、fが例えば下のような一次関数であるとします。
f(X, Y, Z) = α+βX+γY+σZ
α、β、γ、σは係数です。次は「関数fの数字を決める」という段階ですが、ここではこの係数を具体的な数の中から決めます。ここで、訓練データというものを使います。訓練データとは入力変数と正しい出力変数のペアのデータです。この訓練データを式に代入し、a - f(X, Y, Z)の値がなるべく小さくなるように係数を決めます。
ノンパラメトリック法
パラメトリック法と違って、こちらでは関数fの形を決めたりはしません。訓練データについて、なるべく出力変数に近くなるように関数fを色々試して、入力変数を計算しています。パラメトリック手法よりも出力変数に近い計算結果を出せる関数fを推定できますが、訓練データに適応しすぎる「過学習」も起こりやすくなっています。(過学習についてはまたいつか説明します。今はただ「なんか良くないこと」と考えてください。)