今回は多項式回帰について学びます。回帰についてはこれまで、線形回帰と重回帰について説明しました。
以下の線形回帰と重回帰の記事で紹介したものは、より厳密には、線形回帰の中の単回帰、重回帰に分類されます。
- 機械学習の入り口「線形回帰」の実装を Python × NumPy で体験 = (線形)単回帰
- 重回帰とは!?図解と数式で徹底解説【Python コード付き】 = (線形)重回帰
今回学ぶ多項式回帰も線形回帰に、もっと言えば重回帰に含まれる手法です。そのため基本的には同じですが、単回帰よりも柔軟にデータを表現できます。
単回帰と多項式回帰の違い
同じ線形回帰に含まれる手法ですが、具体的には仮説が異なります。
まず、単回帰の仮説はどういうものだったか思い出しましょう。説明変数が一つだけ含まれる、次のような一次関数です。つまり、直線で仮説を表すものでした。
一方多項式回帰では、以下のように説明変数の二次以上の項を持つ関数を仮説として設定します。
つまり、曲線でデータの関係を表現することができます。
データの準備
今回は「平成1年~30年の生産年齢(15~64歳)の人口推移」のデータを例に実践したいと思います。
これまで同様、NumPy配列で作成します。
グラフ表示したデータを見ると、直線よりも曲線の方がデータの分布を表せそうだということがわかります。
データの前処理 – 標準化
今回も単回帰の時と同じく、前処理として標準化を行います。
標準化については「データの前処理:正規化・標準化のプロセスをプログラムで体験」を参照してください。
標準化によってデータのスケールを揃えました。このデータに対して、多項式回帰を行います。
多項式回帰の実装
多項式回帰も、流れは単回帰と同じです。違うのは仮説のみです。
回帰の流れを、もう一度載せておきます。
今回もこの流れに沿って、
1.仮説 → 2.目的関数 → 3.パラメータ更新(学習)
の順に実装します。
1. 仮説
まずは、単回帰との最大の違いである仮説の定義です。今回はデータの二次の項まで入れて仮説を表してみます。
具体的には、パラメータをa1、a2、bとして
です。
単回帰の仮説に、Xの二乗の項を追加しています。
実装する際は今回も「重回帰」の講義と同じく、配列と行列積を使ってこの仮説を定義します。
a1、a2、bをまとめた配列をtheta、Xの二乗、X、1をまとめた配列をX_と置くと、実装ではドット積を使って「h=np.dot(X_,theta)」と書くことで実装できます。
Xの二乗まで仮説に含めました。確かに仮説が二次関数の形になっています。ここからデータにフィットするように、パラメータを調整するのは単回帰と同じです。
2. 目的関数
目的関数は「予測値と正解値の誤差」でした。そのため、仮説によって変わりません。
単回帰の時と同じ、以下の二乗和誤差を使います。
最初のtheta(値が1)を入れて計算した結果、102くらいの誤差になりました。この値が小さくなるようにパラメータthetaを更新していきます。
3. パラメータ更新(最急降下法)
パラメータ更新の方法も、同じく最急降下法を使います。
パラメータが3つあるので、3つそれぞれについてこれを行うだけです。
最急降下法の式を実装するためにまず勾配部分(目的関数の微分)を計算してみましょう。パラメータa1、a2、bのそれぞれについて考えると
となります(微分については、実際に目的関数にhの式を代入して計算してみてください)。
こちらもパラメータが増えたことと仮説以外は何も変わりません。
学習率を0.01、繰り返し回数を1000回として学習してみました。目的関数の値の推移を見ると、パラメータを更新するたびに目的関数の値が下がっていっていることがわかると思います。
さらに、グラフを見ると仮説がしっかりとデータの分布を表しています。
未知データの予測
最後にこれまで同様、得られた仮説によって未知のデータに対する予測を行ってみましょう。
(実際には平成は31年までしかありませんが、あると仮定して入れてみます)。
※今回はデータを標準化しているので、予測するデータにも標準化を行う必要があります。さらに、標準化したデータを入れて得られた予測値も標準化された値になるので、元のスケールに戻す必要があります。詳しくは「データの前処理:正規化・標準化のプロセスをプログラムで体験」で説明しています。
まとめ
今回は「多項式回帰」について説明しました。単回帰との違いがわかったでしょうか。このように、線形単回帰、線形重回帰、多項式回帰と見てきましたが、大きな違いは「仮説」です。仮説を変えるだけで表現の幅は広がるので、対象のデータに合わせて使い分けることで適切な予測が行えるようになります。