JavaScriptを有効にしてください

回帰モデルの評価指標

 ·   4 min read

はじめに

回帰モデルの評価指標としてよく用いられるMAE, RMSE, MAPE, RMSPEについて解説します。各指標の正式名称を以下に示します。

  • MAE(Mean Absolute Error, 平均絶対誤差)
  • RMSE(Root Mean Squared Error, 平方根平均二乗誤差)
  • MAPE(Mean Absolute Percentage Error, 平均絶対パーセント誤差)
  • RMSPE(Root Mean Squared Percentage Error, 平均二乗パーセント誤差)

MAEとRMSEの単位は、予測値と同じ単位になります。そのため、直感的に理解しやすいですが、予測値に桁が大きく異なる値が含まれる場合には向いていません。一方、MAPEとRMSPEの単位は無次元量(パーセント)となり、予測値の桁が大きく異なる場合にも向いています。

この記事ではPythonとScikit-learnによるサンプルコードも示します。実行環境は以下の通りです。

  • Python: 3.9.7
  • NumPy: 1.20.3
  • sklearn: 0.24.2

MAE

MAEは各データに対する予測誤差の絶対値を取り、さらに平均をとった値です。

$$ \mathrm{MAE} = \frac{1}{M} \sum_{i=1}^{M} \left| \hat{y}_i - y_i \right|$$

ここで、$M$はデータ数であり、$\hat{y}_i$と$y_i$はそれぞれ$i$番目のデータに対する予測値と正解値です。MAEはRMSEと比較して、データの外れ値が多い場合に向いています。

RMSE

RMSEは各データに対する予測誤差を二乗して平均を取り、さらに平方根をとった値です。

$$ \mathrm{RMSE} = \sqrt{ \frac{1}{M} \sum_{i=1}^{M} \left( \hat{y}_i - y_i \right)^2 } $$

RMSEはMAEよりも一般的な指標です。一方、RMSEでは誤差の二乗を取るため、データに外れ値が多い場合、RMSEの値は大きく変動してしまいます。このような場合にはMAEが向いています。

MAPE

MAPEは各データに対する相対予測誤差の絶対値を取り、さらに平均をとった値です。

$$ \mathrm{MAPE} = \frac{1}{M} \sum_{i=1}^{M} \left| \frac{ \hat{y}_i - y_i }{y_i} \right|$$

上記の式の値を100倍すると、単位はパーセントになります。

RMSPE

RMSPEは各データに対する相対予測誤差の二乗平均を計算し、さらに平方根をとった値です。

$$ \mathrm{RMSPE} = \sqrt{ \frac{1}{M} \sum_{i=1}^{M} \left( \frac{ \hat{y}_i - y_i }{y_i} \right)^2 } $$

上記の式の値を100倍すると、単位はパーセントになります。

MAPE, RMSPEでは相対的な誤差の大きさを評価するため、各予測値のスケールが大きく異なる場合でも評価できます。一方、正解値に0が含まれる場合、ゼロ割になってしまうため、適用できません。また、正解値が0に近いデータを含む場合でも、MAPE, RMSPEは極端な値になってしまうため用いることができません。

scikit-learnによる回帰モデルの評価

MAE, RMSE, MAPEはscikit-learnに実装されています(RMSPEは実装されていないため、自分で作成する必要があります)。

MAE

MAEを計算するには、sklearn.metrics.mean_absolute_error関数を使用します。最初の引数y_trueは正しい目的変数、2番目の引数y_predは予測値です。

1
2
3
4
5
from sklearn.metrics import mean_absolute_error
y_true = [10, 8.5, 12.1, 9.8]
y_pred = [9.8, 8.0, 11, 9.5]
mae = mean_absolute_error(y_true, y_pred,)
print(mae)

実行結果

MAEは約0.525となります。

1
0.5249999999999999

RMSE

RMSEを計算するには、sklearn.metrics.mean_squared_error関数を使用します。最初の引数y_trueは正しい目的変数、2番目の引数y_predは予測値です。また、RMSEを計算するため、引数squaredFalseとします。直感的ではありませんが、squaredTrue(デフォルト値)の場合、平方根をとらないMSEが計算されます。もしくはMSEを計算して平方根とることで、RMSEを求められます。

1
2
3
4
5
6
7
8
9
import numpy as np
from sklearn.metrics import mean_squared_error
y_true = [10, 8.5, 12.1, 9.8]
y_pred = [9.8, 8.0, 11, 9.5]
rmse = mean_squared_error(y_true, y_pred, squared=False)
print(rmse)

rmse2 = np.sqrt(mean_squared_error(y_true, y_pred))
print(rmse2)

実行結果

RMSEは約0.630となります。

1
2
3
4
5
# rmse
0.6304760106459245

# rmse2
0.6304760106459245

MAPE

MAPEを計算するには、sklearn.metrics.mean_absolute_percentage_error関数を使用します。最初の引数y_trueは正しい目的変数、2番目の引数y_predは予測値です。

1
2
3
4
5
from sklearn.metrics import mean_absolute_percentage_error
y_true = [10, 8.5, 12.1, 9.8]
y_pred = [9.8, 8.0, 11, 9.5]
mape = mean_absolute_percentage_error(y_true, y_pred,)
print(mape)

実行結果

MAPEは約0.050 (5.0%) となります。

1
0.05008621630470369

RMSPE

NumPyを使用してRMSPEを計算する例を示します。y_trueは正しい目的変数、y_predは予測値です。

1
2
3
4
5
import numpy as np
y_true = np.array([10, 8.5, 12.1, 9.8])
y_pred = np.array([9.8, 8.0, 11, 9.5])

rmspe = np.sqrt((((y_pred-y_true)/y_true)**2).mean())

実行結果

RMSPEは約0.057 (5.7%) となります。

1
0.0571440722211559

参考

シェアする

Helve
WRITTEN BY
Helve
関西在住、電機メーカ勤務のエンジニア。X(旧Twitter)で新着記事を配信中です

サイト内検索