🐙

線形回帰(平均二乗誤差)

2024/10/24に公開

線形回帰によって、単純なデータ群を予測することができる。
まず、予測値を決めてから、正解の値との差を最小値にすることだ。

  1. 二乗誤差 (MSE: Mean Squared Error)
L(y, \hat{y}) = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2
\text{二乗誤差の数式は、単なる関数ではあるが、その関数をどうやって求めるかがポイントだ。} \\ \hat{y}_i = \beta_0 + \beta_1

以下シンプルな数値たちがあるとする。
これが通常なら、部屋数(x)家賃(y)や、勉強時間(x)点数(y)となる。

x y
1 2
2 3
3 4

!画像!

\text{とりあえず、テストデータで、切片と傾きを求める。}予測関数 \hat{y}_i を導くために、 \beta_0と\beta_1 \text{をもとめる}\\ \beta_0 = 切片 \\ \beta_1=傾き \\
\text{グラフの}y軸と交わる点を求める\\ \beta_0 =\bar{y}-\beta_1\bar{x}
\text{しかし切片を求めるには、傾きの情報}\beta_1 \text{が必要だ}
\beta_1 = \frac{\sum_(x_i - \bar{x}) (y_i - \bar{y})}{\sum (x_i - \bar{x})^2}\\ \text{まあここでは、あまり数式の事は気にしないで、傾きはこうやって求めるのかくらいでいいと思う。}
1.平均を求めよう。\\ ・\bar{x}=\frac{1+2+3}{3}=2\\ ・\bar{y}=2+3+4=4\\ 2.\text{傾きを求めよう}\\ \beta_1 = \frac{(1-2)(2-3)+(2-2)(3-3)+(3-2)(4-3)}{(1-2)^2+(2-2)^2+(3-2)^2}=1\\ 3.\text{切片}\\ \beta_0を計算\\ \beta_0 = \bar{y} - \beta_1\bar{x}=3-1×2=1\\ これで決定式が定まった。\\ \bar{y} = 1x + 1
\bar{y}が定まったので、あとは平均二乗誤差の数式に当てはめて関数を導き出し、テストデータのn×特徴量(x)を代入して、目的関数(y)を求める。
\text{与えられた訓練データである{x}と{y}で傾きと切片を求め、} \hat{y}_iを用いて訓練データyを導くということ。 そして最終的に関数を求める場合は、上記の数式を用いる。

全体の流れ

1.テストデータの特徴量(x)と目的関数(y)を用いて \bar{y}を求める 2.平均二乗誤差の関数を求める。 3.2番で求めた関数を用いて、訓練データの特徴量をその関数に代入して答えを求めていく。
  1. 平均絶対誤差 (MAE: Mean Absolute Error)

    L(y, \hat{y}) = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i|

上記の数式も基本的に使いかたは同じだが、chatgptに使い分け方を聞いてみた。

平均二乗誤差 (Mean Squared Error, MSE) と平均絶対誤差 (Mean Absolute Error, MAE) は、回帰モデルの評価指標としてよく使われますが、それぞれ異なる特性を持っています。具体的に、どちらを使うべきかはデータの性質や問題に応じて判断します。以下にそれぞれの違いと使い分けのポイントを説明します。

  1. 平均二乗誤差 (MSE)
L(y, \hat{y}) = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2

特徴:

大きな誤差に敏感:誤差の二乗を取るため、大きな誤差に対して非常に敏感です。少数の大きな誤差が全体のMSEを大きくします。
数学的に扱いやすい:MSEは微分可能なので、最適化アルゴリズム(例えば、勾配降下法)で使用されやすい。
ノイズや外れ値に敏感:データセットに外れ値が含まれている場合、その影響を強く受けます。
使いどころ:

大きな誤差を重視したい場合:大きな誤差に対してペナルティを強く与えたい場合に適しています。たとえば、誤差が大きいことが特に問題になるシステムではMSEを使います。
外れ値が少ない場合:外れ値がほとんどないデータセットではMSEの方が適しています。

2.平均二乗誤差

L(y, \hat{y}) = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i|

特徴:

外れ値に対してロバスト:誤差をそのまま絶対値で扱うため、外れ値の影響を受けにくいです。極端な予測エラーがあってもMAEが極端に大きくなることは少ないです。
直感的な解釈:MAEは、予測値がどれだけ実際の値と離れているかをそのまま示すので、直感的に理解しやすいです。
使いどころ:

外れ値にロバストな評価をしたい場合:外れ値の影響を抑えたい場合に有効です。データがノイズを含む場合や、外れ値が気になる場合にはMAEが適しています。
誤差の大小よりも安定性を重視:誤差の大きさよりも、全体的な傾向や安定性が重要な場合にはMAEが適しています。

指標 特徴 使いどころ
MSE 大きな誤差に敏感。外れ値やノイズに影響されやすい。 大きな誤差を特に避けたい場合。外れ値が少ない場合。
MAE 外れ値にロバスト。直感的に誤差の大きさが理解しやすい。 外れ値やノイズが多いデータセットに適している。

以下平均二乗誤差を用いたpythonコードを掲載

import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt

# 乱数のシードを設定(再現性のため)
np.random.seed(42)

# ダミーデータの作成
# 勉強時間: 1-10時間
study_hours = np.random.uniform(1, 10, 50)  # 50人分のデータ

# スコア: 勉強時間に比例 + ランダムなノイズ
# 例: スコア = 勉強時間 × 8 + 40 + ノイズ
scores = study_hours * 8 + 40 + np.random.normal(0, 5, 50)

# データフレームの作成
df = pd.DataFrame({
    '勉強時間': study_hours,
    'スコア': scores
})

# 線形回帰モデルの作成と学習
model = LinearRegression()
X = df[['勉強時間']]
y = df['スコア']
model.fit(X, y)

# 結果の表示
print(f"傾き(係数): {model.coef_[0]:.2f}")
print(f"切片: {model.intercept_:.2f}")

# 予測
X_test = np.array([[5]])  # 5時間勉強した場合の予測
prediction = model.predict(X_test)
print(f"\n5時間勉強した場合の予測スコア: {prediction[0]:.2f}")

# グラフの描画
plt.figure(figsize=(10, 6))
plt.scatter(study_hours, scores, color='blue', alpha=0.5, label='実データ')
plt.plot(study_hours, model.predict(X), color='red', label='回帰直線')
plt.xlabel('勉強時間(時間)')
plt.ylabel('スコア')
plt.title('勉強時間とスコアの関係')
plt.legend()
plt.grid(True)
plt.show()

# モデルの評価(決定係数 R²)
r2_score = model.score(X, y)
print(f"\nモデルの決定係数(R²): {r2_score:.3f}")

# いくつかの時間でスコアを予測してみる
test_hours = np.array([[2], [4], [6], [8]])
predictions = model.predict(test_hours)

print("\n予測結果:")
for hour, pred in zip(test_hours, predictions):
    print(f"{hour[0]}時間勉強した場合: {pred:.2f}点")

Discussion