機械学習の旅へようこそ!🎉 このステップでは、教師あり学習の中でも基本的な回帰モデルである「線形回帰」とその拡張である「重回帰分析」について学びます。これらのモデルは、様々な予測問題の基礎となる重要な考え方です。
1. 線形回帰とは? 🤔
線形回帰は、1つの説明変数(特徴量) を使って、1つの目的変数(予測したい値) の値を予測する手法です。イメージとしては、データ点の分布に最もよく当てはまる直線を引くようなものです。
例えば、「家の広さ(説明変数)」から「家の価格(目的変数)」を予測したい場合などに使われます。家の広さが広くなるほど、価格も高くなる、といった直線的な関係をモデル化します。
数式で表すと以下のようになります:
y = ax + b
y
: 予測したい目的変数 (例: 家の価格)x
: 説明変数 (例: 家の広さ)a
: 係数 (coefficient) または 傾き (slope)。xが1単位増加したときにyがどれだけ変化するかを表します。b
: 切片 (intercept)。xが0のときのyの予測値です。
機械学習では、手元のデータ(訓練データ)を使って、この直線(つまり係数 a
と切片 b
)を最もよくデータにフィットするように決定します。この決定方法としてよく使われるのが最小二乗法です。これは、実際の値と直線による予測値との差(誤差)の二乗和が最小になるように a
と b
を求める方法です。
2. 重回帰分析とは? 🧐
線形回帰では説明変数が1つでしたが、実際の予測では複数の要因が絡み合っていることがほとんどです。例えば、家の価格は「広さ」だけでなく、「駅からの距離」、「築年数」、「部屋数」など、様々な要因によって決まりますよね。
このように、複数の説明変数 を使って目的変数を予測するのが重回帰分析です。基本的な考え方は線形回帰と同じで、データに最もよく当てはまる「超平面」(2次元なら平面、3次元以上なら超平面)を見つけます。
数式で表すと以下のようになります (説明変数がn個の場合):
y = a1*x1 + a2*x2 + ... + an*xn + b
y
: 目的変数x1, x2, ..., xn
: n個の説明変数 (例: 広さ, 駅からの距離, 築年数…)a1, a2, ..., an
: 各説明変数に対応する係数b
: 切片
重回帰分析でも、最小二乗法などを使って、訓練データから最適な係数と切片を求めます。
3. Python (scikit-learn) での実装 💻
それでは、Pythonの機械学習ライブラリである scikit-learn
を使って線形回帰モデルを実装してみましょう。ここでは簡単な例として、説明変数が1つの単回帰を実装します。(重回帰の場合も、説明変数の列を増やすだけで同様に実装できます)
ステップ1: ライブラリのインポート
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
# サンプルデータ生成のため (実際の分析では不要な場合が多い)
np.random.seed(0)
ステップ2: サンプルデータの準備
ここでは、簡単な直線関係にノイズが加わったようなデータを作成します。
# 説明変数 X (例: 学習時間)
X = 2 * np.random.rand(100, 1)
# 目的変数 y (例: テストの点数) - y = 4 + 3x + ノイズ という関係を想定
y = 4 + 3 * X + np.random.randn(100, 1)
# データを訓練用とテスト用に分割 (80%を訓練用、20%をテスト用)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# データの可視化 (任意)
plt.figure(figsize=(8, 6))
plt.scatter(X_train, y_train, color='blue', label='訓練データ')
plt.scatter(X_test, y_test, color='red', label='テストデータ')
plt.xlabel("説明変数 X (学習時間)")
plt.ylabel("目的変数 y (テストの点数)")
plt.title("サンプルデータ")
plt.legend()
plt.grid(True)
# plt.show() # 必要に応じてコメントアウトを外して表示
ステップ3: モデルの選択と学習
scikit-learn
の LinearRegression
クラスを使います。
# 線形回帰モデルのインスタンスを作成
model = LinearRegression()
# 訓練データを使ってモデルを学習 (fitメソッド)
model.fit(X_train, y_train)
# 学習結果 (係数と切片) を確認
print(f"学習後の係数 (a): {model.coef_[0][0]:.4f}") # coef_ は配列で返るのでインデックス指定
print(f"学習後の切片 (b): {model.intercept_[0]:.4f}") # intercept_ も配列で返る
ステップ4: モデルを使った予測
学習済みモデルを使って、テストデータに対する予測を行います。
# テストデータを使って予測 (predictメソッド)
y_pred = model.predict(X_test)
ステップ5: モデルの評価
モデルがどの程度うまく予測できているかを評価します。回帰モデルの評価指標としては、平均二乗誤差 (MSE) や決定係数 (R2スコア) がよく使われます。
- 平均二乗誤差 (Mean Squared Error, MSE): 実際の値と予測値の差(誤差)の二乗の平均。小さいほど良いモデルです。
- 決定係数 (R-squared, R2 score): モデルがデータの変動をどれだけ説明できているかを示す指標 (0から1の値)。1に近いほど良いモデルです。
# 平均二乗誤差 (MSE) の計算
mse = mean_squared_error(y_test, y_pred)
print(f"平均二乗誤差 (MSE): {mse:.4f}")
# 決定係数 (R2スコア) の計算
r2 = r2_score(y_test, y_pred)
# または model.score(X_test, y_test) でも計算可能
# r2_by_score = model.score(X_test, y_test)
print(f"決定係数 (R2): {r2:.4f}")
ステップ6: 予測結果の可視化 (任意)
予測結果と実際の値を比較するために、グラフにプロットしてみましょう。
# テストデータと予測結果をプロット
plt.figure(figsize=(8, 6))
plt.scatter(X_test, y_test, color='red', label='実際の値 (テストデータ)')
plt.plot(X_test, y_pred, color='blue', linewidth=3, label='予測値 (回帰直線)')
plt.xlabel("説明変数 X")
plt.ylabel("目的変数 y")
plt.title("線形回帰による予測結果")
plt.legend()
plt.grid(True)
# plt.show() # 必要に応じてコメントアウトを外して表示
4. まとめと次のステップ 🚀
今回は、機械学習の基本的な回帰手法である線形回帰と重回帰分析について学びました。
- 線形回帰: 1つの説明変数から目的変数を予測する直線モデル。
- 重回帰分析: 複数の説明変数から目的変数を予測するモデル。
scikit-learn
を使うことで、比較的簡単にモデルの実装、学習、予測、評価ができる。- モデルの評価にはMSEや決定係数などが用いられる。
線形回帰はシンプルながらも強力で、多くの応用分野で使われています。また、より複雑なモデルを理解するための基礎となります。
次のステップでは、分類問題でよく使われるロジスティック回帰について学んでいきましょう! 💪
次は「ロジスティック回帰」へ進む →(※ このリンクはダミーです。実際の学習サイトでは次のページへのリンクを設定してください。)