線形回帰(平均二乗誤差)
線形回帰によって、単純なデータ群を予測することができる。
まず、予測値を決めてから、正解の値との差を最小値にすることだ。
- 二乗誤差 (MSE: Mean Squared Error)
以下シンプルな数値たちがあるとする。
これが通常なら、部屋数(x)家賃(y)や、勉強時間(x)点数(y)となる。
x | y |
---|---|
1 | 2 |
2 | 3 |
3 | 4 |
!画像!
全体の流れ
-
平均絶対誤差 (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) は、回帰モデルの評価指標としてよく使われますが、それぞれ異なる特性を持っています。具体的に、どちらを使うべきかはデータの性質や問題に応じて判断します。以下にそれぞれの違いと使い分けのポイントを説明します。
- 平均二乗誤差 (MSE)
特徴:
大きな誤差に敏感:誤差の二乗を取るため、大きな誤差に対して非常に敏感です。少数の大きな誤差が全体のMSEを大きくします。
数学的に扱いやすい:MSEは微分可能なので、最適化アルゴリズム(例えば、勾配降下法)で使用されやすい。
ノイズや外れ値に敏感:データセットに外れ値が含まれている場合、その影響を強く受けます。
使いどころ:
大きな誤差を重視したい場合:大きな誤差に対してペナルティを強く与えたい場合に適しています。たとえば、誤差が大きいことが特に問題になるシステムではMSEを使います。
外れ値が少ない場合:外れ値がほとんどないデータセットではMSEの方が適しています。
2.平均二乗誤差
特徴:
外れ値に対してロバスト:誤差をそのまま絶対値で扱うため、外れ値の影響を受けにくいです。極端な予測エラーがあっても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