はじめに
前回は、線形回帰によって直線的な関係を予測しました。今回はその発展として「多項式回帰(Polynomial Regression)」を扱います。
多項式回帰では、直線では表現しきれないような曲線的な関係も学習可能になります。その一方で、モデルの柔軟性が高くなりすぎると過学習(Overfitting)が発生しやすくなるという課題もあります。
この記事では、多項式回帰の実装とともに、過学習の具体例を可視化を交えて体験してみましょう。
多項式回帰とは?
モデル式のイメージ
線形回帰: 多項式回帰:y = w1x + b
多項式回帰 : y = w2x^2 + w1x + b
より一般的には:y = wnx^n + ・・・ + w2x^2 + w1x + b
特徴
- 複雑なパターンも捉えられる
- 次元を高くしすぎると過学習の原因に
- scikit-learnでは
PolynomialFeaturesを使って簡単に実装可能
データの準備:曲線的な関係をもつデータ
import numpy as np
import matplotlib.pyplot as plt
# xとyの非線形な関係(sin関数 + ノイズ)
np.random.seed(42)
x = np.linspace(0, 6, 100)
y = np.sin(x) + np.random.normal(0, 0.2, len(x))線形回帰と多項式回帰の比較
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
# 線形回帰モデル
model_linear = LinearRegression()
model_linear.fit(x.reshape(-1, 1), y)
y_pred_linear = model_linear.predict(x.reshape(-1, 1))
# 多項式回帰(次数=3)
model_poly3 = make_pipeline(PolynomialFeatures(degree=3), LinearRegression())
model_poly3.fit(x.reshape(-1, 1), y)
y_pred_poly3 = model_poly3.predict(x.reshape(-1, 1))
# 可視化
plt.scatter(x, y, label="実測値", color="black")
plt.plot(x, y_pred_linear, label="線形回帰", color="blue")
plt.plot(x, y_pred_poly3, label="多項式回帰(3次)", color="red")
plt.legend()
plt.title("線形 vs 多項式回帰")
plt.show()過学習の例を見てみる(高次元モデル)
# 多項式回帰(次数=15)
model_poly15 = make_pipeline(PolynomialFeatures(degree=15), LinearRegression())
model_poly15.fit(x.reshape(-1, 1), y)
y_pred_poly15 = model_poly15.predict(x.reshape(-1, 1))
plt.scatter(x, y, label="実測値", color="black")
plt.plot(x, y_pred_poly15, label="多項式回帰(15次)", color="green")
plt.legend()
plt.title("過学習の例(高次の多項式)")
plt.show()高次の多項式では訓練データにはぴったり合っても、滑らかでない曲線になっているのがわかります。これが典型的な過学習の兆候です。
モデルの評価(R²)で比較
from sklearn.metrics import r2_score
print("R²(線形):", r2_score(y, y_pred_linear))
print("R²(多項式3次):", r2_score(y, y_pred_poly3))
print("R²(多項式15次):", r2_score(y, y_pred_poly15))- 高すぎるR²が必ずしも良いとは限らない(過学習の可能性)
- 汎化性能(テストデータへの対応力)を見極めることが重要
おわりに
多項式回帰を使えば、データの複雑な関係性を捉えることが可能ですが、柔軟すぎるモデルは過学習につながります。「複雑さ」と「汎化能力」のバランスが重要です。
次回は、この過学習を防ぐテクニックとして知られる「正則化(リッジ回帰・ラッソ回帰)」について学びます。
練習問題
Q1. 多項式回帰はどのような場合に有効か?
- A. 直線で表せる関係性
- B. ラベルが0か1の分類問題
- C. 曲線的な関係性をもつデータ
Q2. 過学習とは何か?
- A. テストデータの精度が高すぎる状態
- B. 訓練データにだけよく合って、汎化性能が低い状態
- C. データが足りない状態
Q3. 過学習の兆候を見つけるには何を比較すべきか?
- A. 訓練精度とテスト精度
- B. 特徴量の個数
- C. クラス数
🔗 機械学習シリーズ 関連リンク
▶ 入門〜分類編
- 【入門】scikit-learnとは?機械学習の全体像と学習の流れ
- 【準備】sklearnのインストールとデータセットの扱い方
- 【分類①】K近傍法(KNN)を使ってシンプルな分類をしてみよう
- 【分類②】ロジスティック回帰でスパム判定をしてみよう
- 【分類③】決定木・ランダムフォレストの特徴と可視化方法
- 【分類④】混同行列・精度・再現率・F1スコアの正しい使い方
- 【モデル比較】SVM・決定木・ランダムフォレストの精度と解釈性の違い

コメント