回帰分析の誤差評価指標

本記事では、回帰モデルの誤差評価指標について、pythonによる計算方法とともに解説します。

はじめに

回帰モデルの性能評価には、予測値と正解値との誤差を定量化する指標が数多く存在します。評価指標はモデルの用途やデータの特性に合わせて使い分けることが重要です。ここでは、代表的な評価指標として以下を取り上げます。

  • 平均絶対誤差(MAE, Mean Absolute Error)

  • 平均二乗誤差(MSE, Mean Squared Error)

  • 二乗平均平方根誤差(RMSE, Root Mean Squared Error)

  • 平均対数二乗誤差(MSLE, Mean Squared Log Error)/RMSLE (Root Mean Squared Log Error)

  • 中央絶対誤差(MedAE, Median Absolute Error)

  • 平均絶対百分率誤差(MAPE, Mean Absolute Percentage Error)/対称平均絶対百分率誤差(sMAPE)

  • 決定係数(R² score)および調整済み R²

  • 説明分散スコア(Explained Variance Score)

  • その他、分位点ロス(Quantile Loss)など

それぞれについて具体的な意味と Python の実装例を示します。

平均絶対誤差 (MAE: Mean Absolute Error)

意味・用途

  • 予測と実際の値の差の絶対値の平均値を算出します。

  • 外れ値の影響が比較的小さいため、実用上分かりやすく解釈しやすいです。

python実装例

from sklearn.metrics import mean_absolute_error
import numpy as np

# 実際の値と予測値の例
y_true = np.array([3.0, -0.5, 2.0, 7.0])
y_pred = np.array([2.5, 0.0, 2.1, 7.8])

mae = mean_absolute_error(y_true, y_pred)
print("Mean Absolute Error:", mae)

# 出力
# Mean Absolute Error: 0.475

平均二乗誤差 (MSE: Mean Squared Error)

意味・用途

  • 誤差の二乗平均。大きな誤差に対してペナルティが大きいため、外れ値がある場合には影響が強く出ます。

python実装例

from sklearn.metrics import mean_squared_error

# 実際の値と予測値の例
y_true = np.array([3.0, -0.5, 2.0, 7.0])
y_pred = np.array([2.5, 0.0, 2.1, 7.8])

mse = mean_squared_error(y_true, y_pred)
print("Mean Squared Error:", mse)

# 出力
# Mean Squared Error: 0.2874999999999999

二乗平均平方根誤差 (RMSE: Root Mean Squared Error)

意味・用途

  • MSEの平方根をとったものです。元の単位に戻るため、解釈しやすくなります。

Python 実装例

from sklearn.metrics import root_mean_squared_error

# 実際の値と予測値の例
y_true = np.array([3.0, -0.5, 2.0, 7.0])
y_pred = np.array([2.5, 0.0, 2.1, 7.8])
rmse = root_mean_squared_error(y_true, y_pred)
print("Root Mean Squared Error:", rmse)
# 出力
# Root Mean Squared Error: 0.5366560317733502

平均二乗対数誤差 (MSLE / RMSLE)

意味・用途

  • 予測値と実測値の対数差の二乗平均(またはその平方根)です。データのスケールが大きく、値が0に近い場合の相対誤差を評価するのに向いています。

Python 実装例

from sklearn.metrics import mean_squared_log_error

# 実測値・予測値が非負である必要があります
y_true_nonneg = np.array([3, 5, 2.5, 7])
y_pred_nonneg = np.array([2.5, 5, 4, 8])
msle = mean_squared_log_error(y_true_nonneg, y_pred_nonneg)
rmsle = np.sqrt(msle)
print("Mean Squared Log Error:", msle)
print("Root Mean Squared Log Error:", rmsle)
# 出力
# Mean Squared Log Error: 0.03973012298459379
# Root Mean Squared Log Error: 0.19932416558108

中央絶対誤差 (MedAE: Median Absolute Error)

意味・用途

  • 誤差の中央値を計算する指標です。極端な外れ値に影響されにくいため、頑健な評価として用いられます。

Python 実装例

from sklearn.metrics import median_absolute_error

# 実際の値と予測値の例
y_true = np.array([3.0, -0.5, 2.0, 7.0])
y_pred = np.array([2.5, 0.0, 2.1, 7.8])

medae = median_absolute_error(y_true, y_pred)
print("Median Absolute Error:", medae)

# 出力
# Median Absolute Error: 0.5

平均絶対百分率誤差 (MAPE: Mean Absolute Percentage Error)

意味・用途

  • 各誤差の相対誤差(実測値に対しての割合)の平均です。パーセンテージで誤差の大きさを評価できますが、実測値がゼロに近いと値が不安定になる点に注意が必要です。

Python 実装例

def mean_absolute_percentage_error(y_true, y_pred):
    # ゼロ除算を避けるため、実測値に小さな値を加えるか注意が必要
    return np.mean(np.abs((y_true - y_pred) / (y_true + 1e-8))) * 100

# 実際の値と予測値の例
y_true = np.array([3.0, -0.5, 2.0, 7.0])
y_pred = np.array([2.5, 0.0, 2.1, 7.8])

mape = mean_absolute_percentage_error(y_true_nonneg, y_pred_nonneg)
print("Mean Absolute Percentage Error:", mape)

# 出力
# Mean Absolute Percentage Error: 22.73809515910431

対称平均絶対百分率誤差(sMAPE: Symmetric Mean Absolute Percentage Error)

意味・用途

  • 通常のMAPEは、真の値がゼロに近いときに大きな誤差となる問題がありますが、sMAPEは分子・分母ともに平均を取ることで対称性を持たせ、両者の絶対値の和で割るため、この問題を和らげます。

sMAPEは次の式で定義されます。

sMAPE=100ni=1n2yiy^iyi+y^i\text{sMAPE} = \frac{100}{n} \sum_{i=1}^{n}\frac{2|y_i – \hat{y}_i|}{|y_i|+|\hat{y}_i|}

 

python実装例

import numpy as np

def smape(y_true, y_pred):
    # 分母がゼロになるのを防ぐために非常に小さい値(例:1e-8)を加えています
    return 100 * np.mean(2 * np.abs(y_true - y_pred) / (np.abs(y_true) + np.abs(y_pred) + 1e-8))

# 実際の値と予測値の例
y_true = np.array([3.0, -0.5, 2.0, 7.0])
y_pred = np.array([2.5, 0.0, 2.1, 7.8])

sMAPE_value = smape(y_true, y_pred)
print("sMAPE:", sMAPE_value)

# 出力
# sMAPE: 58.46766843021418

決定係数 (R² Score) および調整済み R²

意味・用途

  • R²は、予測値が実測値の分散をどれだけ説明しているかの割合(0〜1の値)を表します。1に近いほどモデルの説明力が高いとされます。

  • 調整済み R² は、説明変数の数を考慮してモデルの過学習を防ぐために補正された値です。

Python 実装例

from sklearn.metrics import r2_score

# 実際の値と予測値の例
y_true = np.array([3.0, -0.5, 2.0, 7.0])
y_pred = np.array([2.5, 0.0, 2.1, 7.8])

r2 = r2_score(y_true, y_pred)
print("R^2 Score:", r2)

# statsmodels を用いて調整済み R² を計算する例
import statsmodels.api as sm

X = np.column_stack((np.ones(len(y_true)), y_pred)) # 定数項を付加
model = sm.OLS(y_true, X).fit()
print("Adjusted R^2:", model.rsquared_adj)

# 出力
# R^2 Score: 0.9605995717344754
# Adjusted R^2: 0.9603349176307823

説明分散スコア (Explained Variance Score)

意味・用途

  • 予測が実際の分散をどれだけ捉えているかを評価します。R²と似ていますが、負の値を取ることがなく、0以上で評価されます。

Python 実装例

from sklearn.metrics import explained_variance_score

# 実際の値と予測値の例
y_true = np.array([3.0, -0.5, 2.0, 7.0])
y_pred = np.array([2.5, 0.0, 2.1, 7.8])

evs = explained_variance_score(y_true, y_pred)
print("Explained Variance Score:", evs)

# 出力
# Explained Variance Score: 0.9675374732334047

分位点ロス(Quantile Loss)

意味・用途

  • 分位点回帰などで用いられる評価指標で、特定の分位数(例えば中央値)を重視した損失を計算します。回帰問題において分布のばらつきを評価するのに有用です。

Python 実装例

def quantile_loss(y_true, y_pred, tau=0.5):
    diff = y_true - y_pred
    return np.mean(np.maximum(tau * diff, (tau - 1) * diff))

# 実際の値と予測値の例
y_true = np.array([3.0, -0.5, 2.0, 7.0])
y_pred = np.array([2.5, 0.0, 2.1, 7.8])

ql = quantile_loss(y_true, y_pred, tau=0.5)
print("Quantile Loss (tau=0.5):", ql)

# 出力
# Quantile Loss (tau=0.5): 0.2375

まとめ

回帰モデルの評価指標は、各指標が捉える誤差の特徴やモデルの説明力の違いよって適切に使い分ける必要があります。

  • MAE, MSE, RMSE:一般的な誤差の評価(RMSEは二乗誤差が大きな値にペナルティを与えるため、外れ値の影響を受けやすい)

  • MSLE / RMSLE:対数変換を行うことで、スケールの広いデータでも相対的な誤差が評価可能

  • MedAE:中央値を用いることで、頑健性を強調

  • MAPE(sMAPE):相対的な誤差をパーセンテージで示す

  • R², 調整済み R², Explained Variance:モデルが説明できる分散の割合の評価

  • Quantile Loss:分位点を重視した評価

本記事では、回帰モデルの誤差評価指標について、pythonによる計算方法とともに解説しました。

ぜひ、様々なデータに対して誤差計算を試してみてください。