INDEX
ポリノミアル回帰の応用
ポリノミアル回帰(Polynomial Regression)は、線形回帰を拡張した回帰手法です。線形回帰が直線でデータの傾向を表すのに対し、ポリノミアル回帰では2次・3次などの高次の項を加えることで、曲線的な関係を表現できます。
非線形なデータに対して有効ですが、次数を高くしすぎると過学習が起こりやすくなるため、適切な次数の選択が重要です。
ポリノミアル回帰の仕組みを図で理解する

ポリノミアル回帰とは
ポリノミアル回帰は、説明変数の高次の項を使って、曲線的な関係をモデル化する手法です。
例えば、単純な線形回帰では表現しにくい放物線のようなデータでも、2次項を加えることでより自然にフィットさせることができます。
y = w0 + w1 * x + w2 * x^2 + ... + wn * x^n
| 項 | 意味 |
|---|---|
x |
1次の特徴量 |
x^2 |
2次の特徴量 |
x^3 |
3次の特徴量 |
n |
多項式の次数 |
線形回帰との違い
線形回帰は直線でデータを表現しますが、ポリノミアル回帰は曲線でデータを表現できます。
| 項目 | 線形回帰 | ポリノミアル回帰 |
|---|---|---|
| モデルの形 | 直線 | 曲線 |
| 特徴量 | 1次の項のみ | 高次の項を追加 |
| 向いているデータ | 直線的な関係 | 曲線的な関係 |
| 過学習のリスク | 比較的低い | 次数が高いと高くなる |
次数によるモデルの違い
ポリノミアル回帰では、次数を上げるほど複雑な曲線を表現できます。
- 1次: 線形回帰と同じ直線モデル
- 2次: 放物線のような曲線を表現できる
- 3次以上: より複雑な曲線を表現できる
ただし、次数を高くしすぎると訓練データに過剰に適合し、未知のデータに弱くなることがあります。
Pythonでのポリノミアル回帰の実装
Pythonでは、scikit-learnのPolynomialFeaturesとLinearRegressionを組み合わせて実装できます。
サンプルデータの作成
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.model_selection import train_test_split
# サンプルデータ作成
np.random.seed(0)
X = np.random.rand(100, 1) * 10
y = 2 * X**2 + 3 * X + np.random.randn(100, 1) * 10
# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(
X,
y,
test_size=0.2,
random_state=42
)
このコードでは、2次関数にノイズを加えたサンプルデータを作成しています。
ポリノミアル特徴量の作成
# 2次のポリノミアル特徴量を作成
poly = PolynomialFeatures(degree=2)
X_train_poly = poly.fit_transform(X_train)
X_test_poly = poly.transform(X_test)
PolynomialFeaturesを使うことで、元の特徴量からx^2などの高次の特徴量を作成できます。
モデルの学習と予測
# 線形回帰モデルを適用
model = LinearRegression()
model.fit(X_train_poly, y_train)
# 予測
y_pred = model.predict(X_test_poly)
ポリノミアル回帰では、高次の特徴量を作成したうえで、通常の線形回帰モデルを適用します。
結果の可視化
plt.scatter(X_test, y_test, label='True values')
plt.scatter(X_test, y_pred, label='Predicted values')
plt.xlabel('X')
plt.ylabel('y')
plt.title('Polynomial Regression degree=2')
plt.legend()
plt.show()
グラフを確認することで、曲線的なデータに対してモデルがどの程度フィットしているかを把握できます。
モデルの性能評価
回帰モデルの性能は、平均二乗誤差(MSE)などを使って評価できます。
from sklearn.metrics import mean_squared_error
mse = mean_squared_error(y_test, y_pred)
print(f'ポリノミアル回帰のMSE: {mse:.3f}')
MSEが小さいほど、予測値と実際の値の差が小さいことを示します。
ポリノミアル回帰を使う場面
- データが直線ではなく曲線的な傾向を持つ場合
- 単純な線形回帰では誤差が大きい場合
- 少数の特徴量で非線形な関係を表現したい場合
- データの変化に山や谷がある場合
ポリノミアル回帰を使う際の注意点
- 次数の選択: 次数が低すぎると表現力が不足し、高すぎると過学習しやすくなります。
- 過学習: 高次の多項式は訓練データに細かく適合しすぎることがあります。
- スケーリング: 高次の項では値が大きくなりやすいため、標準化が有効な場合があります。
- 正則化: RidgeやLassoなどを組み合わせることで、過学習を抑えやすくなります。
次数と過学習の関係
| 次数 | モデルの状態 | 特徴 |
|---|---|---|
| 低すぎる | アンダーフィッティング | データの傾向を十分に表現できない |
| 適切 | 良いフィット | データの傾向を自然に表現できる |
| 高すぎる | 過学習 | 訓練データに細かく適合しすぎる |