0. 假设
真实值:
y
=
{
y
1
,
y
2
,
.
.
.
,
y
n
}
y=\lbrace y_1,y_2,...,y_n\rbrace
y={y1,y2,...,yn}
预测值:
y
^
=
{
y
1
^
,
y
2
^
,
.
.
.
,
y
n
^
}
\hat{y}=\lbrace\hat{y_1},\hat{y_2},...,\hat{y_n}\rbrace
y^={y1^,y2^,...,yn^}
1. MSE: Mean Square Error 均方误差
M S E = 1 n ∑ i = 1 n ( y i ^ − y i ) 2 MSE = \frac{1}{n}\sum_{i=1}^n(\hat{y_i}-{y_i})^2 MSE=n1i=1∑n(yi^−yi)2
- M S E ≥ 0 MSE\geq0 MSE≥0
- 当预测值与真实值完全吻合时等于0,即完美模型
- 误差越大,该值越大
RMSE:Root Mean Square Error 均方根误差
- MSE加上根号
R M S E = M S E = 1 n ∑ i = 1 n ( y i ^ − y i ) 2 RMSE =\sqrt{MSE}= \sqrt{\frac{1}{n}\sum_{i=1}^n(\hat{y_i}-{y_i})^2} RMSE=MSE=n1i=1∑n(yi^−yi)2 - 数量级上比较直观,比如RMSE=10,可以认为回归效果相比真实值平均相差10。
- R M S E ≥ 0 RMSE\geq0 RMSE≥0
- 当预测值与真实值完全吻合时等于0,即完美模型
- 误差越大,该值越大
NRMSE:Normalized RMSE 归一化均方根误差
N R M S E = R M S E y ˉ = 1 n ∑ i = 1 n ( y i ^ − y i ) 2 y ˉ NRMSE =\frac{RMSE}{\bar{y}}=\frac{ \sqrt{\frac{1}{n}\sum_{i=1}^n(\hat{y_i}-{y_i})^2}}{\bar{y}} NRMSE=yˉRMSE=yˉn1∑i=1n(yi^−yi)2
MAE:Mean Absolute Error 平均绝对误差
M A E = 1 n ∑ i = 1 n ∣ y i ^ − y i ∣ MAE=\frac{1}{n}\sum_{i=1}^n|\hat{y_i}-{y_i}| MAE=n1i=1∑n∣yi^−yi∣
- M A E ≥ 0 MAE\geq0 MAE≥0
- 当预测值与真实值完全吻合时等于0,即完美模型
- 误差越大,该值越大
MAPE:Mean Absolute Percentage Error 平均绝对百分比误差
M A P E = 1 n ∑ i = 1 n ∣ y i ^ − y i y i ∣ × 100 % MAPE=\frac{1}{n}\sum_{i=1}^n|\frac{\hat{y_i}-{y_i}}{y_i}|\times100\% MAPE=n1i=1∑n∣yiyi^−yi∣×100%
- MAPE跟MAE很像,就是多了个分母
- M A P E ≥ 0 MAPE\geq0 MAPE≥0
- 当预测值与真实值完全吻合时等于0 % \% %,即完美模型
- MAPE 大于 100 %则表示劣质模型
- 误差越大,该值越大
- 当真实值有数据等于0时,存在分母0除问题,该公式不可用
SMAPE:Symmetric Mean Absolute Percentage Error 对称平均绝对百分比误差
S M A P E = 1 n ∑ i = 1 n ∣ ∣ y i ^ − y i ∣ ( ∣ y i ^ ∣ + ∣ y i ∣ ) / 2 ∣ × 100 % SMAPE=\frac{1}{n}\sum_{i=1}^n|\frac{|\hat{y_i}-{y_i}|}{(|\hat{y_i}|+|y_i|)/2}|\times100\% SMAPE=n1i=1∑n∣(∣yi^∣+∣yi∣)/2∣yi^−yi∣∣×100%
- 当预测值与真实值完全吻合时等于0 % \% %,即完美模型
- SMAPE 大于 100 %则表示劣质模型
- 误差越大,该值越大
- 当真实值有数据等于0时,存在分母0除问题,该公式不可用
MSE/RMSE/MAE/MAPE/SMAPE实现Python代码
# coding=utf-8
import numpy as np
from sklearn import metrics
# MAPE和SMAPE需要自己实现
def mape(y_true, y_pred):
return np.mean(np.abs((y_pred - y_true) / y_true)) * 100
def smape(y_true, y_pred):
return 2.0 * np.mean(np.abs(y_pred - y_true) / (np.abs(y_pred) + np.abs(y_true))) * 100
y_true = np.array([1.0, 5.0, 4.0, 3.0, 2.0, 5.0, -3.0])
y_pred = np.array([1.0, 4.5, 3.5, 5.0, 8.0, 4.5, 1.0])
# MSE
print(metrics.mean_squared_error(y_true, y_pred)) # 8.107142857142858
# RMSE
print(np.sqrt(metrics.mean_squared_error(y_true, y_pred))) # 2.847304489713536
# MAE
print(metrics.mean_absolute_error(y_true, y_pred)) # 1.9285714285714286
# MAPE
print(mape(y_true, y_pred)) # 76.07142857142858,即76%
# SMAPE
print(smape(y_true, y_pred)) # 57.76942355889724,即58%
决定系数(determinationcoefficient) R 2 R^2 R2
R 2 = S S R S S T = ∑ i = 1 N ( y ^ i − y ˉ ) 2 ∑ i = 1 N ( y i − y ˉ ) 2 R^2 = \frac{SSR}{SST}=\frac{\sum_{i=1}^{N}(\hat y_i-\bar y)^2}{\sum_{i=1}^{N}( y_i-\bar y)^2} R2=SSTSSR=∑i=1N(yi−yˉ)2∑i=1N(y^i−yˉ)2
- 1 ≥ R 2 ≥ 0 1 \geq R^2 \geq0 1≥R2≥0
- 这个值越大,预测性能越好