はじめに #
回帰モデルの評価指標としてよく用いられる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
は予測値です。
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となります。
0.5249999999999999
RMSE #
RMSEを計算するには、sklearn.metrics.mean_squared_error
関数を使用します。最初の引数y_true
は正しい目的変数、2番目の引数y_pred
は予測値です。また、RMSEを計算するため、引数squared
をFalse
とします。直感的ではありませんが、squared
がTrue
(デフォルト値)の場合、平方根をとらないMSEが計算されます。もしくはMSEを計算して平方根とることで、RMSEを求められます。
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となります。
# rmse
0.6304760106459245
# rmse2
0.6304760106459245
MAPE #
MAPEを計算するには、sklearn.metrics.mean_absolute_percentage_error
関数を使用します。最初の引数y_true
は正しい目的変数、2番目の引数y_pred
は予測値です。
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%) となります。
0.05008621630470369
RMSPE #
NumPyを使用してRMSPEを計算する例を示します。y_true
は正しい目的変数、y_pred
は予測値です。
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%) となります。
0.0571440722211559