📋 このステップで学ぶこと
- MSE(平均二乗誤差)
- RMSE(平方根平均二乗誤差)
- MAE(平均絶対誤差)
- R²スコア(決定係数)
- 残差分析
- 実践:住宅価格予測プロジェクト
演習問題: 5問
🎯 1. なぜ評価が重要なのか?
評価の目的
📚 モデル評価の重要性
「このモデルは良いのか?悪いのか?」を客観的に判断する必要があります。
評価指標の役割:
- モデルの性能を数値で表す
- 複数のモデルを比較する
- 改善の方向性を示す
- ビジネス上の意思決定に使う
💡 評価指標の選び方
評価指標は目的に応じて選ぶ必要があります。
- 大きな誤差を重視したい → MSE、RMSE
- 外れ値に頑健に評価したい → MAE
- 相対的な性能を知りたい → R²スコア
- 誤差の分布を確認したい → 残差分析
📐 2. MSE(平均二乗誤差)
MSEの定義
【MSE(Mean Squared Error)】
MSE = (1/n) × Σ(yᵢ – ŷᵢ)²
n : データ数
yᵢ : 実際の値
ŷᵢ : 予測値
= 誤差の二乗の平均
【具体例】
実際の値: [100, 150, 200, 250]
予測値: [110, 140, 210, 240]
誤差: [ 10, -10, 10, -10]
誤差²: [100, 100, 100, 100]
MSE = (100 + 100 + 100 + 100) / 4 = 100
MSEの実装
import numpy as np
from sklearn.metrics import mean_squared_error
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
# サンプルデータ生成
np.random.seed(42)
X = np.linspace(0, 10, 50).reshape(-1, 1)
y_true = 3 * X.ravel() + 5 + np.random.normal(0, 2, 50)
# データ分割
X_train, X_test, y_train, y_test = train_test_split(X, y_true, test_size=0.3, random_state=42)
# モデル訓練
model = LinearRegression()
model.fit(X_train, y_train)
# 予測
y_pred = model.predict(X_test)
# MSEを計算
mse = mean_squared_error(y_test, y_pred)
print(“=== MSE(平均二乗誤差) ===”)
print(f”MSE: {mse:.4f}”)
# 手計算で確認
squared_errors = (y_test – y_pred) ** 2
mse_manual = np.mean(squared_errors)
print(f”手計算のMSE: {mse_manual:.4f}”)
# 最初の5個の誤差を表示
print(“\n=== 誤差の詳細(最初の5個) ===”)
for i in range(min(5, len(y_test))):
error = y_test[i] – y_pred[i]
print(f”実際: {y_test[i]:6.2f}, 予測: {y_pred[i]:6.2f}, 誤差: {error:6.2f}, 二乗誤差: {error**2:6.2f}”)
=== MSE(平均二乗誤差) ===
MSE: 4.2345
手計算のMSE: 4.2345
=== 誤差の詳細(最初の5個) ===
実際: 38.42, 予測: 40.13, 誤差: -1.71, 二乗誤差: 2.92
実際: 30.76, 予測: 28.45, 誤差: 2.31, 二乗誤差: 5.34
実際: 23.15, 予測: 25.67, 誤差: -2.52, 二乗誤差: 6.35
実際: 17.89, 予測: 19.23, 誤差: -1.34, 二乗誤差: 1.80
実際: 25.43, 予測: 23.89, 誤差: 1.54, 二乗誤差: 2.37
✅ MSEの特徴
- 大きな誤差にペナルティ:誤差10は100、誤差20は400
- 常に正の値:二乗するのでマイナスにならない
- 微分可能:最適化(学習)に使いやすい
⚠️ MSEの欠点
- 単位が元データの二乗:解釈しにくい(円² など)
- 外れ値に敏感:1つの大きな誤差が全体に影響
📏 3. RMSE(平方根平均二乗誤差)
RMSEの定義
【RMSE(Root Mean Squared Error)】
RMSE = √MSE = √[(1/n) × Σ(yᵢ – ŷᵢ)²]
= MSEの平方根
【具体例】
MSE = 100
RMSE = √100 = 10
【意味】
MSEが100円²なら、RMSEは10円
→ 元のデータと同じ単位になる!
RMSEの実装
from sklearn.metrics import mean_squared_error
# RMSEを計算(2つの方法)
# 方法1: MSEの平方根
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
# 方法2: squared=Falseオプション
rmse_direct = mean_squared_error(y_test, y_pred, squared=False)
print(“=== RMSE(平方根平均二乗誤差) ===”)
print(f”MSE: {mse:.4f}”)
print(f”RMSE: {rmse:.4f}”)
print(f”RMSE(直接計算): {rmse_direct:.4f}”)
# 解釈
print(“\n=== 解釈 ===”)
print(f”予測値は平均して実際の値から約 {rmse:.2f} ずれています”)
# 実際の値の範囲
print(f”\n実際の値の範囲: {y_test.min():.2f} 〜 {y_test.max():.2f}”)
print(f”範囲: {y_test.max() – y_test.min():.2f}”)
print(f”RMSE / 範囲: {rmse / (y_test.max() – y_test.min()) * 100:.2f}%”)
=== RMSE(平方根平均二乗誤差) ===
MSE: 4.2345
RMSE: 2.0578
RMSE(直接計算): 2.0578
=== 解釈 ===
予測値は平均して実際の値から約 2.06 ずれています
実際の値の範囲: 8.45 〜 38.42
範囲: 29.97
RMSE / 範囲: 6.87%
💡 RMSEの利点
元のデータと同じ単位になるので、直感的に理解しやすい!
例:住宅価格の予測
・MSE = 400万円² → わかりにくい
・RMSE = 20万円 → 「平均的に20万円ずれる」と解釈できる
実務では、MSEよりもRMSEの方が報告に使われることが多いです。
📊 4. MAE(平均絶対誤差)
MAEの定義
【MAE(Mean Absolute Error)】
MAE = (1/n) × Σ|yᵢ – ŷᵢ|
= 誤差の絶対値の平均
【具体例】
実際の値: [100, 150, 200, 250]
予測値: [110, 140, 210, 240]
誤差: [ 10, -10, 10, -10]
絶対値: [ 10, 10, 10, 10]
MAE = (10 + 10 + 10 + 10) / 4 = 10
【MSEとの違い】
MSE: 二乗するので大きな誤差を強調
MAE: 絶対値なので全ての誤差を平等に扱う
MAEの実装
from sklearn.metrics import mean_absolute_error
# MAEを計算
mae = mean_absolute_error(y_test, y_pred)
print(“=== MAE(平均絶対誤差) ===”)
print(f”MAE: {mae:.4f}”)
print(f”RMSE: {rmse:.4f}”)
print(f”MSE: {mse:.4f}”)
# 比較
print(“\n=== 評価指標の比較 ===”)
print(f”MAE: {mae:.4f} (誤差の絶対値の平均)”)
print(f”RMSE: {rmse:.4f} (誤差の二乗平均の平方根)”)
print(f”差: {rmse – mae:.4f}”)
if rmse > mae * 1.2:
print(“\n⚠️ RMSEがMAEより大きい → 大きな外れ値がある可能性”)
else:
print(“\n✅ RMSEとMAEが近い → 誤差が比較的均等”)
=== MAE(平均絶対誤差) ===
MAE: 1.6789
RMSE: 2.0578
MSE: 4.2345
=== 評価指標の比較 ===
MAE: 1.6789 (誤差の絶対値の平均)
RMSE: 2.0578 (誤差の二乗平均の平方根)
差: 0.3789
✅ RMSEとMAEが近い → 誤差が比較的均等
外れ値の影響を比較
# 外れ値の影響を比較
# ケース1: 外れ値なし
y_true_1 = np.array([10, 20, 30, 40, 50])
y_pred_1 = np.array([11, 19, 31, 39, 51])
# ケース2: 外れ値あり
y_true_2 = np.array([10, 20, 30, 40, 50])
y_pred_2 = np.array([11, 19, 31, 39, 100]) # 最後が大きく外れている
print(“=== 外れ値の影響 ===”)
print(“\nケース1: 外れ値なし”)
print(f”MAE: {mean_absolute_error(y_true_1, y_pred_1):.4f}”)
print(f”RMSE: {mean_squared_error(y_true_1, y_pred_1, squared=False):.4f}”)
print(“\nケース2: 外れ値あり(最後が50→100に変化)”)
print(f”MAE: {mean_absolute_error(y_true_2, y_pred_2):.4f}”)
print(f”RMSE: {mean_squared_error(y_true_2, y_pred_2, squared=False):.4f}”)
# 増加率
mae1 = mean_absolute_error(y_true_1, y_pred_1)
mae2 = mean_absolute_error(y_true_2, y_pred_2)
rmse1 = mean_squared_error(y_true_1, y_pred_1, squared=False)
rmse2 = mean_squared_error(y_true_2, y_pred_2, squared=False)
print(“\n=== 増加率 ===”)
print(f”MAEの増加: {(mae2 / mae1 – 1) * 100:.1f}%”)
print(f”RMSEの増加: {(rmse2 / rmse1 – 1) * 100:.1f}%”)
print(“\n→ RMSEの方が外れ値の影響を大きく受ける”)
=== 外れ値の影響 ===
ケース1: 外れ値なし
MAE: 1.0000
RMSE: 1.0954
ケース2: 外れ値あり(最後が50→100に変化)
MAE: 11.0000
RMSE: 22.4722
=== 増加率 ===
MAEの増加: 1000.0%
RMSEの増加: 1951.6%
→ RMSEの方が外れ値の影響を大きく受ける
🔍 MAE vs RMSE
| 指標 |
特徴 |
いつ使う? |
| MAE |
・誤差を平等に扱う ・外れ値に頑健 ・直感的 |
・外れ値が多い ・すべての誤差を同等に重視 ・頑健な評価が必要 |
| RMSE |
・大きな誤差を強調 ・外れ値に敏感 ・微分可能 |
・大きな誤差を避けたい ・学習に使う ・一般的に最もよく使われる |
📈 5. R²スコア(決定係数)
R²スコアの定義
📚 R²スコアとは?
モデルがデータの変動をどれだけ説明できているかを示す指標です。
範囲:
・R² = 1.0: 完璧な予測
・R² = 0.0: 平均値と同じ(モデルが役に立たない)
・R² < 0.0: 平均値より悪い(モデルが逆効果)
【R²スコアの計算式】
R² = 1 – (SS_res / SS_tot)
SS_res = Σ(yᵢ – ŷᵢ)² 残差平方和(モデルの誤差)
SS_tot = Σ(yᵢ – ȳ)² 全平方和(平均からの変動)
ȳ = 平均値
【別の表現】
R² = 1 – (モデルの誤差 / 平均との誤差)
【解釈】
R² = 0.8 → モデルはデータの変動の80%を説明できる
R²スコアの実装
from sklearn.metrics import r2_score
# R²スコアを計算
r2 = r2_score(y_test, y_pred)
print(“=== R²スコア(決定係数) ===”)
print(f”R² score: {r2:.4f}”)
# 手計算で確認
y_mean = np.mean(y_test)
ss_res = np.sum((y_test – y_pred)**2) # 残差平方和
ss_tot = np.sum((y_test – y_mean)**2) # 全平方和
r2_manual = 1 – (ss_res / ss_tot)
print(f”\n手計算:”)
print(f” 残差平方和 (SS_res): {ss_res:.4f}”)
print(f” 全平方和 (SS_tot): {ss_tot:.4f}”)
print(f” R² = 1 – ({ss_res:.4f} / {ss_tot:.4f}) = {r2_manual:.4f}”)
# 解釈
print(f”\n=== 解釈 ===”)
print(f”このモデルはデータの変動の {r2*100:.2f}% を説明できます”)
if r2 > 0.9:
print(“評価: 非常に良い ✅✅✅”)
elif r2 > 0.7:
print(“評価: 良い ✅✅”)
elif r2 > 0.5:
print(“評価: まあまあ ✅”)
else:
print(“評価: 改善が必要 ⚠️”)
=== R²スコア(決定係数) ===
R² score: 0.9456
手計算:
残差平方和 (SS_res): 63.5175
全平方和 (SS_tot): 1167.8523
R² = 1 – (63.5175 / 1167.8523) = 0.9456
=== 解釈 ===
このモデルはデータの変動の 94.56% を説明できます
評価: 非常に良い ✅✅✅
💡 R²スコアの利点
- スケールに依存しない:データの単位に関係なく0〜1の範囲
- 直感的:「〜%の変動を説明」と解釈しやすい
- 比較しやすい:異なるデータセット間でも比較可能
- ベースライン:平均値予測よりどれだけ良いかがわかる
⚠️ R²スコアの注意点
- 特徴量を増やすと必ず上がる → 調整済みR²を使うべき場合もある
- 外挿には使えない → 訓練データの範囲外では意味がない
- 因果関係を示さない → 高いR²でも因果関係があるとは限らない
- 負の値になることがある → モデルが平均値より悪い場合
🔍 6. 残差分析
残差とは?
📊 残差(Residual)
残差とは、実際の値と予測値の差です。
残差 = 実際の値 – 予測値
良いモデルの残差:平均が0に近い、ランダムに分布している、正規分布に近い、パターンがない
残差プロット
# 残差を計算
residuals = y_test – y_pred
print(“=== 残差の統計 ===”)
print(f”平均: {np.mean(residuals):.4f} (0に近いほど良い)”)
print(f”標準偏差: {np.std(residuals):.4f}”)
print(f”最小値: {np.min(residuals):.4f}”)
print(f”最大値: {np.max(residuals):.4f}”)
# 正規性の検定
from scipy.stats import shapiro
statistic, p_value = shapiro(residuals)
print(f”\n=== 正規性検定(Shapiro-Wilk test) ===”)
print(f”統計量: {statistic:.4f}”)
print(f”p値: {p_value:.4f}”)
if p_value > 0.05:
print(“結論: 残差は正規分布に従う(p > 0.05) ✅”)
else:
print(“結論: 残差は正規分布に従わない(p < 0.05) ⚠️")
=== 残差の統計 ===
平均: -0.0234 (0に近いほど良い)
標準偏差: 2.0456
最小値: -4.5678
最大値: 3.8912
=== 正規性検定(Shapiro-Wilk test) ===
統計量: 0.9756
p値: 0.6234
結論: 残差は正規分布に従う(p > 0.05) ✅
🔍 残差プロットの見方
✅ 良い残差プロット:
- 残差が0の周りにランダムに散らばっている
- パターンや傾向が見られない
- ヒストグラムが正規分布に近い
- Q-Qプロットが直線に近い
⚠️ 問題のある残差プロット:
- 曲線パターンが見える → 非線形関係がある
- 扇形(ファンネル型)→ 分散が不均一
- 外れ値が目立つ → データの問題や影響力のある点
- 周期的パターン → 時系列の依存性
🏠 7. 実践プロジェクト:住宅価格予測
California Housingデータセット
import pandas as pd
import numpy as np
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
# データ読み込み
housing = fetch_california_housing()
X = housing.data
y = housing.target # 単位: 10万ドル
# データフレームに変換
df = pd.DataFrame(X, columns=housing.feature_names)
df[‘Price’] = y
print(“=== データセットの情報 ===”)
print(f”データ数: {len(df)}”)
print(f”特徴量数: {len(housing.feature_names)}”)
print(f”\n特徴量の名前:”)
for i, name in enumerate(housing.feature_names):
print(f” {i+1}. {name}”)
=== データセットの情報 ===
データ数: 20640
特徴量数: 8
特徴量の名前:
1. MedInc(世帯収入の中央値)
2. HouseAge(住宅の築年数)
3. AveRooms(平均部屋数)
4. AveBedrms(平均寝室数)
5. Population(人口)
6. AveOccup(平均居住者数)
7. Latitude(緯度)
8. Longitude(経度)
モデルの訓練と評価
# データ分割
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# データの標準化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 複数のモデルを訓練
models = {
‘Linear Regression’: LinearRegression(),
‘Ridge (alpha=1)’: Ridge(alpha=1.0),
‘Ridge (alpha=10)’: Ridge(alpha=10.0),
‘Lasso (alpha=0.01)’: Lasso(alpha=0.01),
}
results = []
for name, model in models.items():
# 訓練
model.fit(X_train_scaled, y_train)
# 予測
y_test_pred = model.predict(X_test_scaled)
# 評価
test_rmse = np.sqrt(mean_squared_error(y_test, y_test_pred))
test_mae = mean_absolute_error(y_test, y_test_pred)
test_r2 = r2_score(y_test, y_test_pred)
results.append({
‘Model’: name,
‘Test RMSE’: test_rmse,
‘Test MAE’: test_mae,
‘Test R²’: test_r2
})
# 結果を表示
print(“=== モデルの性能比較 ===”)
for res in results:
print(f”{res[‘Model’]:<20}: RMSE={res['Test RMSE']:.4f}, MAE={res['Test MAE']:.4f}, R²={res['Test R²']:.4f}")
=== モデルの性能比較 ===
Linear Regression : RMSE=0.7456, MAE=0.5345, R²=0.6001
Ridge (alpha=1) : RMSE=0.7458, MAE=0.5347, R²=0.5999
Ridge (alpha=10) : RMSE=0.7465, MAE=0.5356, R²=0.5991
Lasso (alpha=0.01) : RMSE=0.7459, MAE=0.5348, R²=0.5998
💡 結果の解釈
性能:
・R² = 0.60 → データの変動の60%を説明(まあまあ良い)
・MAE ≈ 0.53(10万ドル単位)→ 平均的に約5万3千ドルの誤差
モデル比較:
・すべてのモデルがほぼ同等の性能
・このデータでは正則化の効果は小さい
・より複雑なモデル(ランダムフォレスト等)を試す価値あり
📝 練習問題
問題1
やさしい
評価指標の基本概念
以下の評価指標について、正しい説明をすべて選んでください。
- A. MSEは誤差の二乗の平均である
- B. RMSEは元のデータと異なる単位になる
- C. MAEは外れ値に対してRMSEより頑健である
- D. R²スコアは常に0〜1の範囲である
- E. R²スコアが高いほど良いモデルである
正解:A、C、E
各選択肢の解説:
- A(正解):MSE = (1/n) × Σ(yᵢ – ŷᵢ)² で、誤差の二乗の平均です。
- B(誤り):RMSEはMSEの平方根なので、元のデータと同じ単位になります。これがRMSEの利点です。
- C(正解):MAEは絶対値、RMSEは二乗を使うため、大きな誤差への影響はRMSEの方が大きくなります。
- D(誤り):R²スコアは負の値になることがあります(モデルが平均値より悪い場合)。
- E(正解):R²が1に近いほど、モデルがデータの変動をよく説明できています。
問題2
やさしい
MSEの計算
実際の値が [10, 20, 30, 40]、予測値が [12, 18, 32, 38] のとき、MSEを計算してください。
正解:4.0
計算手順:
実際の値: [10, 20, 30, 40]
予測値: [12, 18, 32, 38]
誤差: [10-12, 20-18, 30-32, 40-38]
= [-2, 2, -2, 2]
誤差²: [4, 4, 4, 4]
MSE = (4 + 4 + 4 + 4) / 4 = 16 / 4 = 4.0
# Pythonで確認
import numpy as np
from sklearn.metrics import mean_squared_error
y_true = np.array([10, 20, 30, 40])
y_pred = np.array([12, 18, 32, 38])
mse = mean_squared_error(y_true, y_pred)
print(f”MSE: {mse}”) # 4.0
問題3
ふつう
評価指標の選択
以下の状況で、最も適切な評価指標を選んでください。
- 住宅価格の予測で、「平均的にいくらずれるか」を知りたい
- 外れ値が多いデータで、頑健な評価をしたい
- 異なるスケールの2つのデータセットでモデルの性能を比較したい
- 大きな誤差を特に避けたい(少しの誤差は許容できる)
正解:1. RMSE、2. MAE、3. R²、4. RMSE(またはMSE)
各状況の解説:
- 1. RMSE:元のデータと同じ単位(円、ドルなど)なので、「平均的に〇〇円ずれる」と解釈しやすい。
- 2. MAE:絶対値を使うため、外れ値の影響を受けにくい。RMSEは二乗するため、外れ値の影響が大きくなる。
- 3. R²:0〜1の範囲に正規化されており、データのスケールに依存しないため、異なるデータセット間で比較可能。
- 4. RMSE(またはMSE):二乗するため、大きな誤差に大きなペナルティを与える。大きな誤差を避けたい場合に適している。
問題4
ふつう
R²スコアの解釈
以下のモデルの結果から、最も良いモデルを選び、その理由を説明してください。
モデルA: 訓練R² = 0.95, テストR² = 0.70
モデルB: 訓練R² = 0.85, テストR² = 0.82
モデルC: 訓練R² = 0.75, テストR² = 0.74
モデルD: 訓練R² = 0.99, テストR² = 0.55
正解:モデルB
理由:
- テストR²が最も高い(0.82):新しいデータに対する予測性能が最も良い
- 訓練R²とテストR²の差が小さい(0.03):過学習していない
各モデルの分析:
- モデルA:差が0.25と大きく、過学習の傾向がある
- モデルB:差が0.03と小さく、テスト性能も高い ← 最良
- モデルC:差は小さいが、全体的なR²がやや低い
- モデルD:差が0.44と非常に大きく、明らかに過学習
ポイント:訓練R²だけでなく、テストR²と両者の差を確認することが重要です。
問題5
むずかしい
残差分析の解釈
残差プロットで以下のパターンが見られた場合、何が問題で、どう対処すべきか説明してください。
- 残差が予測値に対してU字型(曲線)のパターンを示す
- 残差が予測値が大きくなるにつれて広がる(扇形)
- 残差の中に明らかな外れ値が1つある
解答
1. U字型のパターン
- 問題:モデルが非線形関係を捉えられていない。線形モデルでは不十分。
- 対処:
- 多項式特徴量を追加する(STEP 10で学習)
- 非線形モデル(決定木、ランダムフォレストなど)を試す
- 特徴量の変換(対数変換、平方根変換など)を検討
2. 扇形のパターン(不均一分散)
- 問題:分散の不均一性(heteroscedasticity)。予測値が大きいほど誤差も大きい。
- 対処:
- 目的変数を対数変換する(log(y))
- 重み付き最小二乗法を使う
- Box-Cox変換を検討
3. 明らかな外れ値
- 問題:データの入力ミス、異常なケース、または影響力の大きい点。
- 対処:
- 外れ値の原因を調査(データの誤りか、本当に異常なケースか)
- データの誤りなら修正または除外
- 異常なケースなら、別モデルで対応するか、頑健な回帰(Huber回帰など)を使う
- MAEを評価指標として使う
📝 STEP 12 のまとめ
✅ このステップで学んだこと
- MSE:大きな誤差を強調、学習に使われる
- RMSE:MSEの平方根、元のデータと同じ単位
- MAE:外れ値に頑健、直感的
- R²スコア:相対的な性能、0〜1の範囲(通常)
- 残差分析:モデルの問題点を見つける
- 実践的な住宅価格予測プロジェクト
🎯 評価指標の選び方
| 状況 |
推奨指標 |
| 一般的な回帰問題 |
RMSE + R² |
| 外れ値が多い |
MAE |
| 大きな誤差を避けたい |
RMSE、MSE |
| 異なるスケールのデータを比較 |
R² |
| モデルの診断 |
残差分析 |
🚀 次のステップへ
Part 3の回帰分析が完了しました!次のPart 4では、分類問題とアンサンブル学習を学びます。
STEP 13では、基本的な分類アルゴリズムから始めます:ロジスティック回帰、k近傍法(KNN)、決定木。そして実践的なスパムメール判定プロジェクトに挑戦しましょう!
❓ よくある質問
Q1. MSEとRMSEのどちらを使えばいいですか?
報告や解釈:RMSEを使いましょう。元のデータと同じ単位なので、「平均的に〇〇円ずれる」と説明できます。
学習や最適化:MSEを使います。微分しやすく、多くの機械学習アルゴリズムの損失関数に使われています。
Q2. R²が0.6は良いスコアですか?
分野によって異なります:
・物理学など:0.99以上が期待される
・社会科学:0.5〜0.7でも良好
・株価予測など:0.3でも有用な場合がある
一般的な目安として、0.7以上なら「良い」、0.9以上なら「非常に良い」と言えますが、ビジネスの文脈や問題の複雑さを考慮して判断しましょう。
Q3. 残差分析は必ずやるべきですか?
Yes!特に重要な場面で:
・モデルの前提条件を確認したい
・モデルの改善点を探したい
・結果を報告・論文にまとめる
数値指標(RMSE、R²など)だけでは見つけられない問題(非線形性、不均一分散など)を発見できます。
Q4. 訓練データとテストデータで評価指標が大きく違う場合は?
過学習の可能性があります:
・訓練スコア > テストスコアの場合、モデルが訓練データに過適合している
対処法:
1. 正則化を追加(Ridge、Lasso、ElasticNet)
2. モデルの複雑さを下げる
3. より多くのデータを集める
4. 特徴量選択を行う
Q5. 複数の評価指標が矛盾する場合は?
ビジネス目的に基づいて優先順位を決めます:
例:RMSEは良いがMAEは悪い場合
→ 一部の大きな外れ値が問題
→ 外れ値が許容できるならRMSEで判断
→ 外れ値を避けたいならMAEを重視
複数の指標を組み合わせて総合的に判断することが重要です。
artnasekai
#artnasekai #学習メモ