多項式回帰のPython実装

目次

はじめに

このページでは、機械学習の応用的な手法である多項式回帰分析を用いて、カリフォルニア州の住宅価格を予測する方法を学びます。多項式回帰は、線形回帰の拡張版で、非線形の関係を捉えることができる手法です。

重回帰分析が複数の異なる説明変数を使用するのに対し、多項式回帰は単一の説明変数の多項式(2乗、3乗など)を使用します。これにより、より複雑な関係性をモデル化することができます。

使用するデータセットは、カリフォルニア州の住宅に関する情報です。この中から、世帯の平均収入(MedInc)を用いて住宅価格を予測するモデルを構築します。

それでは、実際にPythonコードを見ながら、多項式回帰分析の流れを詳しく見ていきましょう。

ライブラリのインポート

まず、必要なライブラリをインポートします。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures

各ライブラリの役割を説明します:

  • matplotlib.pyplot: データの可視化に使用します。
  • numpy: 数値計算や多次元配列の操作に使用します。
  • pandas: データの操作や分析に使用します。
  • sklearn (scikit-learn): 機械学習のアルゴリズムや関連する機能を提供するライブラリです。
  • datasets: サンプルデータセットを提供します。
  • metrics: モデルの性能評価に使用する指標を計算します。
  • linear_model: 線形回帰モデルを提供します。
  • preprocessing: データの前処理機能を提供します。ここでは多項式特徴量の生成に使用します。

これらのライブラリをインポートすることで、データの読み込みから分析、モデリング、評価、可視化まで一連の作業を行うことができます。

データセットのインポート

次に、scikit-learnに用意されているカリフォルニア住宅データセットをインポートします。

dataset = datasets.fetch_california_housing()

fetch_california_housing()関数を使用して、カリフォルニア住宅データセットをダウンロードし、dataset変数に格納します。このデータセットには、カリフォルニア州の各地域の住宅に関する様々な特徴量と、それに対応する住宅価格の中央値が含まれています。

データセットの確認

データセットの内容を確認します。

print('特徴量:', dataset.feature_names)
print('目的変数:', dataset.target_names)
pd.set_option('display.max_columns', None)
df = pd.DataFrame(dataset.data, columns=dataset.feature_names)
df['target'] = dataset.target
df.head()

出力

特徴量: ['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup', 'Latitude', 'Longitude']
目的変数: ['MedHouseVal']

ここでは以下の操作を行っています:

  1. データセットの特徴量(説明変数)と目的変数の名前を表示します。。
  2. pandasの表示オプションを設定し、全ての列を表示できるようにします。
  3. データセットの特徴量をpandas DataFrameに変換します。
  4. 目的変数(住宅価格の中央値)をDataFrameに追加します。
  5. データの最初の5行を表示して、内容を確認します。

これらの操作により、データセットの構造や内容を把握することができます。

説明変数と目的変数に分割

次に、分析に使用する説明変数と目的変数を選択し、データを分割します。

select_features = ['MedInc']
X = df.loc[:1000, select_features].values
y = df.loc[:1000, 'target'].values

ここでは以下の操作を行っています:

  1. select_featuresに、使用する説明変数(ここではMedIncのみ)を指定します。
  2. Xに説明変数のデータを格納します。ここでは最初の1000行のみを使用しています。
  3. yに目的変数(住宅価格の中央値)のデータを格納します。同じく最初の1000行のみです。

説明のために1000行に制限していますが、実際の分析では全データを使用することが一般的です。

多項式特徴量の生成とモデルの学習

多項式回帰を行うために、まず多項式特徴量を生成し、その後で線形回帰モデルを学習させます。

poly_reg = PolynomialFeatures(degree=3)
x_poly = poly_reg.fit_transform(X)

lin_reg = LinearRegression()
lin_reg.fit(x_poly, y)

ここでは以下の操作を行っています:

  1. PolynomialFeatures(degree=3)で3次の多項式特徴量を生成するインスタンスを作成します。
  2. fit_transform()メソッドを使用して、元の特徴量から多項式特徴量を生成します。
  3. LinearRegression()で線形回帰モデルのインスタンスを作成します。
  4. fit()メソッドを使用して、生成した多項式特徴量(x_poly)と目的変数(y)でモデルを学習させます。

多項式回帰は、実際には多項式特徴量を用いた線形回帰です。そのため、特徴量の変換後は通常の線形回帰モデルを使用します。

新しいデータポイントでの予測

学習したモデルを使って、新しいデータポイントでの予測を行います。

new_data = [[8.0]]
pred_label = lin_reg.predict(poly_reg.fit_transform(new_data))[0]
print(f'予測した{dataset.target_names}の値: {pred_label:.3f}')

出力

予測した['MedHouseVal']の値: 3.865

ここでは、世帯の平均収入(MedInc)が8.0の場合の住宅価格を予測しています。新しいデータポイントも多項式特徴量に変換してから予測を行う必要があります。

テストデータで予測

次に、元のデータセット全体に対して予測を行います。

y_pred = lin_reg.predict(x_poly)

predict()メソッドを使用して、多項式特徴量(x_poly)に対する予測を行い、結果をy_predに格納します。

モデルの性能評価

モデルの性能を評価するために、平均二乗誤差(MSE)とR二乗(R^2)スコアを計算します。

print(f'MSE: {mean_squared_error(y, y_pred):.3f}')
print(f'R^2: {r2_score(y, y_pred):.3f}')

出力

MSE: 0.317
R^2: 0.599
  1. 平均二乗誤差(MSE):予測値と実際の値の差(誤差)の二乗の平均です。0に近いほど良いモデルとされています。
  2. R二乗(R^2)スコア:モデルの当てはまりの良さを示す指標です。1に近いほど良いモデルで、0に近いほど悪いモデルとされています。

これらの指標を用いることで、モデルがどの程度正確に予測できているかを数値的に評価できます。

性能評価の可視化

最後に、モデルの性能を視覚的に評価するためのグラフを描画します。

x_grid = np.arange(min(X), max(X), 0.1)
x_grid = x_grid.reshape((len(x_grid), 1))

plt.scatter(X, y, color='red', label='Data points')
plt.plot(x_grid, lin_reg.predict(poly_reg.fit_transform(x_grid)), color='blue', label='Polynomial Regression')
plt.title('Polynomial Regression')
plt.xlabel(f'{select_features[0]}')
plt.ylabel(f'{dataset.target_names[0]}(Target Value)')

X1_min, X1_max = X.min() - 1, X.max() + 1
X2_min, X2_max = y.min() - 1, y.max() + 1
X1, X2 = np.meshgrid(np.arange(X1_min, X1_max, 0.1), np.arange(X2_min, X2_max, 0.1))

plt.legend()
plt.show()

出力

この部分では、以下の操作を行っています:

  1. 予測線を描画するためのグリッドポイントを生成します。
  2. 実際のデータ点を赤色の散布図でプロットします。
  3. 多項式回帰の予測線を青色でプロットします。
  4. グラフのタイトル、x軸ラベル、y軸ラベルを設定します。
  5. 凡例を追加し、グラフを表示します。

この可視化により、多項式回帰モデルがデータにどのようにフィットしているかを視覚的に確認できます。

まとめ

このチュートリアルでは、カリフォルニア住宅データセットを使用して、多項式回帰分析の基本的な流れを学びました。

多項式回帰は、単純な線形関係では捉えきれない複雑な関係性をモデル化するのに適しています。ただし、過学習(オーバーフィッティング)のリスクがあるため、適切な次数の選択が重要です。

重回帰分析と比較すると、多項式回帰は単一の変数の非線形関係を捉えるのに適しています。一方、重回帰分析は複数の異なる変数間の線形関係を扱います。実際の問題に応じて、適切な手法を選択することが重要です。

このコードを基に、様々なデータセットで実験を行い、多項式の次数を変更するなどして、多項式回帰分析の理解を深めてください。また、正則化を組み合わせることで、過学習を抑制することもできます。

この記事が気に入ったら
フォローしてね!

この記事が参考になった方はシェアしてね!
  • URLをコピーしました!

本コンテンツへの意見や質問

コメントする

目次