※記事内に商品プロモーションを含むことがあります。
はじめに
回帰モデルの評価指標としてよく用いられる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
は予測値です。
|
|
実行結果
MAEは約0.525となります。
|
|
RMSE
RMSEを計算するには、sklearn.metrics.mean_squared_error
関数を使用します。最初の引数y_true
は正しい目的変数、2番目の引数y_pred
は予測値です。また、RMSEを計算するため、引数squared
をFalse
とします。直感的ではありませんが、squared
がTrue
(デフォルト値)の場合、平方根をとらないMSEが計算されます。もしくはMSEを計算して平方根とることで、RMSEを求められます。
|
|
実行結果
RMSEは約0.630となります。
|
|
MAPE
MAPEを計算するには、sklearn.metrics.mean_absolute_percentage_error
関数を使用します。最初の引数y_true
は正しい目的変数、2番目の引数y_pred
は予測値です。
|
|
実行結果
MAPEは約0.050 (5.0%) となります。
|
|
RMSPE
NumPyを使用してRMSPEを計算する例を示します。y_true
は正しい目的変数、y_pred
は予測値です。
|
|
実行結果
RMSPEは約0.057 (5.7%) となります。
|
|