ななぶろ

-お役立ち情報を気楽に紹介するブログ-

機械学習プログラム例:回帰分析の基礎と実践

www.amazon.co.jp

はじめに

機械学習は、データからパターンを学習し、予測を行う技術です。その中でも「回帰」は、入力変数(特徴量)に基づいて連続的な数値変数を予測する手法として広く利用されています。例えば、住宅価格の予測、株価の予測、気温の予測など、様々な分野で活用されています。

本記事では、機械学習プログラム例を通して、回帰分析の基礎から実践までを解説します。読者の方々が、回帰分析の基本的な概念を理解し、実際にコードを動かして体験できるよう、具体的な例を用いて丁寧に説明していきます。

1. 回帰分析とは?

回帰分析は、変数間の関係性をモデル化し、ある変数の値を他の変数の値に基づいて予測することを目的とします。具体的には、入力変数(特徴量)と出力変数(ターゲット変数)の関係を数学的な式で表現することで、未知の入力変数に対する出力変数の値を推定します。

例:

  • 住宅価格 (ターゲット変数) を、広さ、築年数、最寄りの駅からの距離などの情報 (特徴量) から予測する
  • 株価 (ターゲット変数) を、過去の株価、取引量、金利などの情報 (特徴量) から予測する

回帰分析の種類:

回帰分析には様々な種類がありますが、代表的なものを以下に示します。

  • 線形回帰: 入力変数と出力変数の関係を直線で表現する最も基本的な回帰手法です。
  • 多項式回帰: 入力変数と出力変数の関係を多項式曲線で表現することで、非線形の関係も捉えることができます。
  • ロジスティック回帰: 出力変数が二値分類の場合に使用される回帰手法です。(厳密には分類問題ですが、回帰分析の枠組みで扱われることがあります)
  • サポートベクター回帰 (SVR): サポートベクターマシンを回帰に応用した手法で、高次元空間での非線形関係も捉えることができます。
  • 決定木回帰: 決定木を用いて回帰問題を解決する手法です。
  • ランダムフォレスト回帰: 複数の決定木を組み合わせて、より精度の高い予測を行う手法です。

2. 回帰分析のステップ

回帰分析は、一般的に以下のステップで進められます。

  1. データ収集と準備: 分析対象となるデータを収集し、欠損値処理や外れ値除去などの前処理を行います。
  2. 特徴量エンジニアリング: 既存の特徴量を加工したり、新たな特徴量を作成することで、モデルの精度向上を目指します。
  3. モデル選択: 問題に適した回帰モデルを選択します。
  4. 学習: 収集したデータを用いて、選択したモデルを学習させます。
  5. 評価: 学習済みモデルの性能を評価指標(例:平均二乗誤差 (MSE)、決定係数 (R2))を用いて評価します。
  6. チューニング: モデルのパラメータを調整することで、性能向上を目指します。
  7. 予測: 新しいデータに対して、学習済みモデルを用いて予測を行います。

3. Pythonによる線形回帰の実践例

ここでは、Pythonのライブラリであるscikit-learnを使って、線形回帰の実践例を紹介します。

準備:

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

pip install numpy scikit-learn matplotlib pandas

コード:

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib.pyplot as plt

# 1. データ収集と準備
# サンプルデータを作成 (例: 広さと価格の関係)
data = pd.DataFrame({
    '広さ': [50, 75, 100, 125, 150],
    '価格': [200, 300, 400, 500, 600]
})

# Pandas DataFrameをNumPy配列に変換
X = data[['広さ']].values  # 特徴量 (広さ)
y = data['価格'].values    # ターゲット変数 (価格)

# 2. 学習データとテストデータへの分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 80%を学習、20%をテスト

# 3. モデルの選択と学習
model = LinearRegression()  # 線形回帰モデルを選択
model.fit(X_train, y_train)   # 学習データでモデルを学習

# 4. 予測
y_pred = model.predict(X_test) # テストデータを用いて予測

# 5. 評価
mse = mean_squared_error(y_test, y_pred)  # 平均二乗誤差
r2 = r2_score(y_test, y_pred)             # 決定係数

print("平均二乗誤差 (MSE):", mse)
print("決定係数 (R^2):", r2)

# 6. 結果の可視化
plt.scatter(X_test, y_test, label='実際の値')
plt.plot(X_test, y_pred, color='red', label='予測値')
plt.xlabel('広さ (平方メートル)')
plt.ylabel('価格 (万円)')
plt.title('線形回帰の予測結果')
plt.legend()
plt.show()

# 7. 回帰係数と切片の表示
print("回帰係数:", model.coef_[0])
print("切片:", model.intercept_)

コードの説明:

  1. データ収集と準備: 広さと価格の関係を表すサンプルデータを作成し、NumPy配列に変換します。
  2. 学習データとテストデータへの分割: データを学習用とテスト用に分割します。これにより、モデルの汎化性能を評価できます。train_test_split関数は、データをランダムに分割してくれます。random_stateを指定することで、毎回同じ分割結果を得ることができます。
  3. モデルの選択と学習: 線形回帰モデルを選択し、学習データを用いてモデルを学習させます。fitメソッドが学習を行います。
  4. 予測: テストデータを用いて、学習済みモデルで価格を予測します。predictメソッドが予測を行います。
  5. 評価: 平均二乗誤差 (MSE) と決定係数 (R2) を計算し、モデルの性能を評価します。
    • 平均二乗誤差 (MSE): 実際の値と予測値との差の二乗の平均です。値が小さいほど、モデルの精度が高いことを意味します。
    • 決定係数 (R2): モデルがターゲット変数の変動をどれだけ説明できるかを示す指標です。0から1の値を取り、1に近いほど、モデルの説明力が高いことを意味します。
  6. 結果の可視化: 実際の値と予測値を散布図にプロットし、回帰直線を重ねて表示することで、モデルの性能を視覚的に確認できます。
  7. 回帰係数と切片の表示: 回帰式 y = ax + b における傾き (a) と切片 (b) を表示します。

4. より複雑な例:多項式回帰

線形回帰は、入力変数と出力変数の関係が直線的である場合に有効ですが、非線形の関係がある場合は、多項式回帰などの手法を用いる必要があります。

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

# 1. データ収集と準備
# サンプルデータを作成 (例: 広さと価格の関係、非線形)
data = pd.DataFrame({
    '広さ': [50, 75, 100, 125, 150],
    '価格': [200, 300, 600, 800, 1000]  # 非線形な関係
})

X = data[['広さ']].values
y = data['価格'].values

# 2. 学習データとテストデータへの分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 3. 特徴量エンジニアリング: 多項式特徴量の作成
poly = PolynomialFeatures(degree=2)  # 2次多項式を作成
X_train_poly = poly.fit_transform(X_train)
X_test_poly = poly.transform(X_test)

# 4. モデルの選択と学習
model = LinearRegression()
model.fit(X_train_poly, y_train)

# 5. 予測
y_pred = model.predict(X_test_poly)

# 6. 評価
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print("平均二乗誤差 (MSE):", mse)
print("決定係数 (R^2):", r2)

# 7. 結果の可視化
plt.scatter(X_test, y_test, label='実際の値')
plt.plot(X_test, y_pred, color='red', label='予測値')
plt.xlabel('広さ (平方メートル)')
plt.ylabel('価格 (万円)')
plt.title('多項式回帰の予測結果')
plt.legend()
plt.show()

変更点:

  • PolynomialFeatures を使用して、広さの2乗(広さ2)という新たな特徴量を作成しています。これにより、モデルは非線形の関係を捉えることができるようになります。
  • 学習データとテストデータの多項式特徴量を変換するために、fit_transformtransform メソッドを使用します。

5. まとめ

本記事では、機械学習における回帰分析の基礎から実践までを解説しました。線形回帰と多項式回帰の実践例を通して、データ収集・準備、モデル選択・学習、評価といった一連の流れを体験できたかと思います。

回帰分析は、様々な分野で活用できる強力なツールです。本記事で紹介した内容を参考に、ぜひご自身のデータに適用して、予測の精度向上を目指してみてください。

今後の学習:

  • より高度な回帰モデル(SVR, 決定木回帰, ランダムフォレスト回帰など)について学ぶ
  • 特徴量エンジニアリングのテクニックを習得する
  • 正則化などの過学習を防ぐための手法を学ぶ
  • ハイパーパラメータチューニングによって、モデルの性能を最適化する

参照先:

このブログ記事が、読者の皆様の機械学習における回帰分析への理解を深める一助となれば幸いです。