ポリノミアル回帰の応用
ポリノミアル回帰(Polynomial Regression)は、線形回帰の拡張であり、線形では表現できない複雑な関係をモデル化するために使用されます。線形回帰は特徴量と目的変数の間に直線的な関係を仮定しますが、ポリノミアル回帰では高次の多項式を用いることで、曲線を使ってデータにフィットさせることが可能です。本記事では、ポリノミアル回帰の基本概念と、Pythonでの実装方法を解説します。
ポリノミアル回帰の基本概念
ポリノミアル回帰は、次のようにモデル化されます。
y = w0 + w1 * x + w2 * x^2 + ... + wn * x^n
ここで、y
は目的変数、x
は説明変数、w0
からwn
はパラメータです。このように、x
の高次の項(x^2, x^3
など)が加わることで、より複雑な曲線をモデルに含めることができます。
線形回帰との違い
ポリノミアル回帰は、非線形なデータにも対応できるため、線形回帰が対応できない複雑なデータにフィットすることが可能です。特に、非線形なデータセットにおいて、ポリノミアル回帰はデータの傾向をより正確に表現することができます。
線形回帰とポリノミアル回帰の比較
線形回帰 | ポリノミアル回帰 |
---|---|
直線的な関係性に適合 | 曲線的な関係性もモデル化可能 |
特徴量は1次の項のみ | 特徴量に高次の項が含まれる |
過学習のリスクが少ない | 高次になると過学習のリスクが増加 |
Pythonでのポリノミアル回帰の実装
次に、Pythonのscikit-learn
ライブラリを使用して、ポリノミアル回帰を実装します。まず、サンプルデータを作成し、ポリノミアル回帰モデルを訓練します。
サンプルデータの作成
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 # 0から10までの100サンプル
y = 2 * X**2 + 3 * X + np.random.randn(100, 1) * 10 # 2次関数にノイズを加えたデータ
# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
このコードでは、X
とy
に2次関数の関係を持つサンプルデータを作成し、訓練データとテストデータに分割しています。
ポリノミアル回帰モデルの構築
# 2次のポリノミアル特徴量を作成
poly = PolynomialFeatures(degree=2)
X_train_poly = poly.fit_transform(X_train)
X_test_poly = poly.transform(X_test)
# 線形回帰モデルを適用
model = LinearRegression()
model.fit(X_train_poly, y_train)
# 予測
y_pred = model.predict(X_test_poly)
# 結果のプロット
plt.scatter(X_test, y_test, color='blue', label='True values')
plt.scatter(X_test, y_pred, color='red', label='Predicted values')
plt.xlabel('X')
plt.ylabel('y')
plt.title('Polynomial Regression (degree=2)')
plt.legend()
plt.show()
このコードでは、PolynomialFeatures
クラスを使って入力データに2次の特徴量を追加し、それを用いて線形回帰モデルを訓練しています。結果をグラフにプロットすることで、実際のデータポイントと予測結果を視覚化しています。
モデルの性能評価
ポリノミアル回帰モデルの性能を評価するために、Mean Squared Error(MSE)
を計算します。
from sklearn.metrics import mean_squared_error
# MSEの計算
mse = mean_squared_error(y_test, y_pred)
print(f'ポリノミアル回帰のMSE: {mse:.3f}')
このコードでは、mean_squared_error
関数を使って、モデルの誤差を計算しています。MSEが小さいほど、モデルの予測が実際のデータに近いことを示します。
ポリノミアル回帰を使う上での注意点
- 過学習のリスク: ポリノミアル回帰は高次の多項式を使用するため、モデルがデータに過剰に適合する過学習のリスクが高まります。適切な次数の選定が重要です。
- データのスケーリング: 特徴量の値が大きく異なる場合、スケーリングを行うことでモデルの性能が向上することがあります。
StandardScaler
などを使用すると良いでしょう。 - 正則化の必要性: 高次のモデルを使用する場合、LassoやRidgeなどの正則化手法を併用することで、過学習を防止できます。
まとめ
ポリノミアル回帰は、非線形のデータを扱う場合に有効な手法で、線形回帰では捉えきれない複雑な関係をモデル化することができます。しかし、モデルが複雑になるほど過学習のリスクが高まるため、次数の選定や正則化手法の使用が重要です。Pythonを使用したポリノミアル回帰の実装は、scikit-learn
のPolynomialFeatures
クラスとLinearRegression
クラスを組み合わせることで簡単に行えます。