回帰モデルの実装

scikit-learn の基礎

日付:2025年3月2日

scikit-learnを使った回帰モデルの実装について解説。線形回帰、リッジ回帰、ランダムフォレスト回帰を例に、データの準備からモデルの学習、評価方法までを詳しく説明する。random_stateの役割についても解説し、再現性の重要性に触れる。

目 次

はじめに

機械学習における回帰(regression) は、数値を予測するタスクです。
例えば、住宅価格の予測や気温の予測など、連続値を出力する問題に適用されます。

本記事では、scikit-learn を使って基本的な回帰モデルを実装し、その評価方法について詳しく解説します。

1. 回帰とは?

回帰分析は、ある入力変数(特徴量)から**目的変数(ターゲット)**の数値を予測する手法です。
主な回帰モデルには以下のようなものがあります。

  • 線形回帰(Linear Regression): 単純な線形関係を仮定したモデル
  • リッジ回帰(Ridge Regression): 過学習を抑えるための正則化を含む線形回帰
  • ランダムフォレスト回帰(Random Forest Regressor): 決定木を組み合わせた非線形回帰
  • サポートベクターマシン回帰(SVR): サポートベクターマシンを用いた回帰手法
  • k 近傍回帰(k-Nearest Neighbors Regressor): 近いデータの平均値を予測するシンプルな手法

2. データの準備

まず、scikit-learn の make_regression を使って回帰用のデータを作成します。

PYTHON
from sklearn.datasets import make_regression import pandas as pd # サンプルデータの作成 X, y = make_regression(n_samples=500, n_features=3, noise=15, random_state=42)

random_state=42 とは?

random_state乱数の種を固定するためのパラメータです。
同じ値(例えば 42)を指定すると、毎回同じデータが生成され、結果が再現可能になります。
特に、モデルの比較や検証を行う際に有用です。

PYTHON
# データの確認 df = pd.DataFrame(X, columns=[f'Feature_{i}' for i in range(1, 4)]) df['Target'] = y print(df.head())

出力結果:

Feature_1 Feature_2 Feature_3 Target 0 -0.0744 -0.8327 0.8295 -12.4693 1 1.1712 -0.2751 -0.0900 63.1729 2 -0.2507 -0.8982 1.2566 -32.1441 3 1.7946 -1.4154 -1.1460 112.7965 4 0.0514 1.3101 1.1367 47.0288

3. データの分割

学習データとテストデータに分割します。

PYTHON
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) print(f"訓練データ: {X_train.shape}, テストデータ: {X_test.shape}")

出力結果:

訓練データ: (400, 3), テストデータ: (100, 3)

4. 線形回帰モデルの実装

まず、最も基本的な線形回帰を使ってみましょう。

PYTHON
from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score # モデルの作成と学習 model = LinearRegression() model.fit(X_train, y_train) # 予測と評価 y_pred = model.predict(X_test) mse = mean_squared_error(y_test, y_pred) r2 = r2_score(y_test, y_pred) print(f"Mean Squared Error: {mse:.2f}") print(f"R² Score: {r2:.2f}")

出力結果:

Mean Squared Error: 226.47 R² Score: 0.89

線形回帰はシンプルながらも多くの回帰問題で有効な手法です。

5. リッジ回帰(Ridge Regression)

リッジ回帰は、正則化項を加えて過学習を防ぐ回帰手法です。

PYTHON
from sklearn.linear_model import Ridge # モデルの作成と学習 model = Ridge(alpha=1.0) model.fit(X_train, y_train) # 予測と評価 y_pred = model.predict(X_test) mse = mean_squared_error(y_test, y_pred) r2 = r2_score(y_test, y_pred) print(f"Mean Squared Error: {mse:.2f}") print(f"R² Score: {r2:.2f}")

出力結果:

Mean Squared Error: 224.13 R² Score: 0.90

リッジ回帰を使うことで、汎化性能を向上させることができます。

6. ランダムフォレスト回帰(Random Forest Regressor)

決定木を多数組み合わせたランダムフォレスト回帰を試してみます。

PYTHON
from sklearn.ensemble import RandomForestRegressor # モデルの作成と学習 model = RandomForestRegressor(n_estimators=100, random_state=42) model.fit(X_train, y_train) # 予測と評価 y_pred = model.predict(X_test) mse = mean_squared_error(y_test, y_pred) r2 = r2_score(y_test, y_pred) print(f"Mean Squared Error: {mse:.2f}") print(f"R² Score: {r2:.2f}")

出力結果:

Mean Squared Error: 175.32 R² Score: 0.93

ランダムフォレスト回帰は非線形データにも適用しやすく、高精度な予測が可能です。

7. まとめ

本記事では、scikit-learn を使って基本的な回帰モデルを実装しました。

  • 線形回帰: シンプルな回帰手法
  • リッジ回帰: 正則化により過学習を防ぐ
  • ランダムフォレスト回帰: 汎用的で高精度な非線形回帰

回帰問題を解く際には、データの特性に応じて適切なモデルを選択することが重要です。