02.1.4 高校生向け
多項式回帰(高校生向け)
こんな場面を想像してみよう #
1 年分の「月の平均気温」と「家の光熱費」を散布図にしたとします。寒い月は暖房、暑い月は冷房で光熱費が上がるので、12 個の点は U の字に並ぶはずです。ここに 線形回帰 で直線を 1 本引くと、どうなるでしょうか。
直線は曲がれないので、U の両端(1 月と 8 月)でも真ん中でも点から大きく外れます。「直線しか引けない」という制限をゆるめて、カーブを当てはめたい。これが多項式回帰の出発点です。

上の図は S 字に並んだデータの例です。青の点線(直線)は左端の \(x = -3\) 付近では点の上を、中央では点の下を通ってしまいます。赤の曲線(3 次の多項式)は 2 回向きを変えながら点の流れに沿っていて、本当の関係を表す緑の線とほぼ重なっています。
カーブはどうやって引く? #
多項式回帰は新しい道具を使うわけではなく、線形回帰に渡す表に \(x^2\) や \(x^3\) の列を足すだけです。
まず列を増やします。もとの表には \(x\) の列が 1 つだけあるので、そこに \(x^2\) の列、\(x^3\) の列を計算して付け足します。表は横に広がりますが、各行の \(y\) は変わりません。次に式の形を決めます。たとえば 2 次なら \(y = a x^2 + b x + c\) で、係数 \(a, b, c\) はまだ分かりません。続いて係数 \(a, b, c\) を最小二乗法で決めます。各点と曲線の縦方向のズレを 2 乗して全部足し、それがいちばん小さくなる \(a, b, c\) を選ぶ、線形回帰とまったく同じ計算です。図では、曲線が点の集まりの「まん中」を通るように形が決まっていきます。最後に次数を選びます。1 次なら曲がらない直線、2 次なら 1 回曲がる放物線、3 次なら上の図のように 2 回曲がる S 字で、次数を上げるほど曲線は細かく曲がれるようになります。
列を増やす作業は、Python の 4 行で確かめられます。次の 4 行は、\(x\) が 5 個だけの表を \(x, x^2, x^3\) の 3 列に広げて表示します。
| |
出力は (-2, 4, -8), (-1, 1, -1), … と、もとの 1 列が 3 列に増えます。この 3 列を「3 つの変数」として線形回帰に渡すと、結果が 3 次の曲線になります。
動かして見てみよう #
下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。
気をつけたいこと #
最初の課題は次数を上げすぎると過学習することで、10 個の点に 9 次の多項式を使えば全部の点を通る曲線が作れますが、点と点の間で激しく波打ち、新しいデータには役立ちません。手元への当てはまりと新しいデータでの誤差は別物です。二つ目はデータの範囲の外では暴れること。上の図でも、曲線は左端の \(x = -3.5\) あたりで急に下がっています。3 次の多項式は範囲の外で \(x^3\) の項に引かれて急激に大きく(小さく)なるので、外側の予測は信用できません。三つ目は**「多項式=非線形回帰」ではない**ことで、式は曲がっていても係数 \(a, b, c\) については足し算の形(線形)です。だから線形回帰と同じ解き方が使えます。
やってみよう #
まず、方眼紙に \(y = x^2\) の形に近い点を 8 個ほど描き、定規で直線を引いてみましょう。どこでズレが大きくなるか確かめ、次に放物線をフリーハンドで描いてズレを比べてください。次に、身の回りで「増えてから減る」「減ってから増える」関係を 2 つ探してみましょう(例:ボールを投げたときの高さと時間、勉強時間と集中力)。最後に、点が 5 個しかないデータに 4 次の多項式を当てはめたら曲線はどんな形になるか予想してみてください。「全部の点を通る」ことは良いことだろうか、と考えるのがこの課題の狙いです。
つぎに読む #
数式(多項式基底)と scikit-learn の PolynomialFeatures を使った実装は 標準版の多項式回帰 で扱っています。土台となる直線 \(y = ax + b\) の当てはめは 線形回帰(高校生向け) に戻って確認してください。曲線が暴れないように係数にブレーキをかける考え方は リッジ回帰・ラッソ回帰(高校生向け) で紹介しています。