3.8 回归模型评估指标#
在3.1节到3.4节内容中,我们介绍了如何建模线性回归(包括多变量与多项式回归)及如何通过PyTorch来快速搭建模型并求解,但是对于一个创建出来的模型应该怎样来对其进行评估呢?换句话说,这个模型到底怎么样呢?
以最开始的房价预测为例,现在假设求解得到了图3-33所示的两个模型$h_1(x)$与$h_2(x)$,那么应该选哪一个呢?抑或在不能可视化的情况下,应该如何评估模型的好与坏呢?

在回归任务中,常见的评估指标(Metric)有平均绝对误差(Mean Absolute Error, MAE)、均方误差(Mean Square Error, MSE)、均方根误差(Root Mean Square Error, RMSE)、平均绝对百分比误差(Mean Absolute Percentage Error, MAPE)和决定系数(Coefficient of Determination)等,其中用得最为广泛的是MAE和MSE。下面我们依次来对这些指标进行介绍,同时在所有的计算公式中,$m$均表示样本数量、$y^{(i)}$均表示第$i$个样本的真实值、$\hat{y}^{(i)}$均表示第$i$个样本的预测值。
3.8.1 常见回归评估指标#
1.平均绝对误差(MAE)
MAE用来衡量预测值与真实值之间的平均绝对误差,定义如下:
$$ \text{MAE}=\frac{1}{m}\sum\limits_{i=1}^{m}{|}{{y}^{(i)}}-{{\hat{y}}^{(i)}}|\tag{3-69} $$其中$\text{MAE}\in [0,+\infty )$,其值越小表示模型越好,实现代码如下:
1 def MAE(y, y_pre):
2 return np.mean(np.abs(y - y_pre))2. 均方误差(MSE)
MSE用来衡量预测值与真实值之间的误差平方,定义如下:
$$ \text{MSE}=\frac{1}{m}\sum\limits_{i=1}^{m}{{{({{y}^{(i)}}-{{{\hat{y}}}^{(i)}})}^{2}}}\tag{3-70} $$其中$\text{MSE}\in [0,+\infty )$,其值越小表示模型越好,实现代码如下:
1 def MSE(y, y_pre):
2 return np.mean((y - y_pre) ** 2)3. 均方根误差(RMSE)
RMSE是在MSE的基础之上取算术平方根而来,其定义如下:
$$ \text{RMSE}=\sqrt{\frac{1}{m}\sum\limits_{i=1}^{m}{{{({{y}^{(i)}}-{{{\hat{y}}}^{(i)}})}^{2}}}}\tag{3-71} $$其中$\text{RMSE}\in [0,+\infty )$,其值越小表示模型越好,实现代码如下:
1 def RMSE(y, y_pre):
2 return np.sqrt(MSE(y, y_pre))4. 平均绝对百分比误差(MAPE)
MAPE和MAE类似,只是在MAE的基础上做了标准化处理,其定义如下:
$$ \text{MAPE}=\frac{100\%}{m}\sum\limits_{i=1}^{m}{\left| \frac{{{y}^{(i)}}-{{{\hat{y}}}^{(i)}}}{{{y}^{(i)}}} \right|}\tag{3-72} $$其中$\text{MAPE}\in [0,+\infty )$,其值越小表示模型越好,实现代码如下:
1 def MAPE(y, y_pre):
2 return np.mean(np.abs((y - y_pre) / y)) 5. R2评价指标
决定系数R2是线性回归模型中sklearn默认采用的评价指标,其定义如下:
$$ {{R}^{2}}=1-\frac{\sum\limits_{i=1}^{m}{{{({{y}^{(i)}}-{{{\hat{y}}}^{(i)}})}^{2}}}}{\sum\limits_{i=1}^{m}{{{({{y}^{(i)}}-\bar{y})}^{2}}}}\tag{3-73} $$其中${{R}^{2}}\in (-\infty ,1]$,其值越大表示模型越好,$\overline{y}$表示真实值的平均值,实现代码如下:
1 def R2(y, y_pre):
2 u = np.sum((y - y_pre) ** 2)
3 v = np.sum((y - np.mean(y)) ** 2)
4 return 1 - (u / v)3.8.2 回归指标示例代码#
有了这些评估指标后,在对模型训练时就可以选择其中的一些指标对模型的精度进行评估了,示例代码如下所示:
1 if __name__ == '__main__':
2 y_true = 2 * np.random.randn(200) + 1
3 y_pred = np.random.randn(200) + y_true
4 print(f"MAE: {MAE(y_true, y_pred)}\n"
5 f"MSE: {MSE(y_true, y_pred)}\n"
6 f"RMSE: {RMSE(y_true, y_pred)}\n"
7 f"MAPE: {MAPE(y_true, y_pred)}\n"
8 f"R2: {R2(y_true, y_pred)}\n")在上述代码中,第2~3行用来生成模拟的真实标签与预测值。第4~8行则是不同指标下的评价结果。最后,上述代码运行结束后的输出结果如下所示:
1 MAE: 0.7395229164418393
2 MSE: 0.8560928033277224
3 RMSE: 0.9252528321100792
4 MAPE: 2.2088106952308864
5 R2: -0.22456632063674673.8.3 小结#
在本节中,我们首先通过一个示例介绍了为什么我们需要引入评估指标,即如何评价一个回归模型的优与劣;然后详细地逐一介绍了5种常用的评估指标和实现方法;最后,我们还逐一展示了评价指标的示例用法。