本文参考饼干Japson《模型之母:线性回归的评价指标》编写
今天,我们学习线性回归算法的评价指标——MSE、RMSE、MAE、R Square。
引用饼干Japson的话。已知训练数据样本x、y,找到a和b的值,使 ∑ i = 1 n ( y ( i ) − a x ( i ) − b ) 2 \sum_{i=1}^{n} (y^{(i)}-ax^{(i)}-b)^2 ∑i=1n(y(i)−ax(i)−b)2尽可能小 。
实际上是找到训练数据集中 ∑ i = 1 n ( y ( i ) − y p r e d i c t ( i ) ) 2 \sum_{i=1}^{n} (y^{(i)}-y_{predict }^{(i)})^2 ∑i=1n(y(i)−ypredict(i))2最小。
衡量标准是看在测试数据集中y的真实值与预测值之间的差距。
因此我们可以使用下面公式作为衡量标准:
∑ i = 1 n ( y ( i ) − y p r e d i c t ( i ) ) 2 \sum_{i=1}^{n} (y^{(i)}-y_{predict }^{(i)})^2 ∑i=1n(y(i)−ypredict(i))2
但是这里有一个问题,这个衡量标准是和m相关的。在具体衡量时,测试数据集不同将会导致误差的累积量不同。
首先我们从“使损失函数尽量小”这个思路出发:
对于训练数据集合来说,使 ∑ i = 1 n ( y t r a i n ( i ) − a x t r a i n ( i ) − b ) 2 \sum_{i=1}^{n} (y_{train}^{(i)}-ax_{train }^{(i)}- b)^2 ∑i=1n(ytrain(i)−axtrain(i)−b)2尽可能小
在得到a和b之后将 x t e s t x_{test} xtest代入a、b中。可以使用 ∑ i = 1 n ( y t e s t ( i ) − y t e s t p r e d i c t ( i ) ) 2 \sum_{i=1}^{n} (y_{test}^{(i)}-y_{test predict }^{(i)})^2 ∑i=1n(ytest(i)−ytestpredict(i))2来作为衡量回归算法好坏的标准。
公式: 1 / m ∑ i = 1 m ( y t e s t ( i ) − y t e s t p r e d i c t ( i ) ) 2 1/m \sum_{i=1}^{m}(y_{test}^{(i)}-y_{test predict }^{(i)})^2 1/m∑i=1m(ytest(i)−ytestpredict(i))2
代码:
def mean_squared_error(y_true,y_predict):
"""计算y_true和y_predict之间的MSE"""
assert y_true.shape[0]==y_predict.shape[0],\
"the size of y_true must be equal to the size of y_predict"
return np.sum((y_true-y_predict)**2)/y_true.shape[0]
为了解决量纲的问题,引入RMSE,公式: 1 / m ∑ i = 1 m ( y t e s t ( i ) − y t e s t p r e d i c t ( i ) ) 2 = M S E t e s t \sqrt{1/m \sum_{i=1}^{m}(y_{test}^{(i)}-y_{test predict }^{(i)})^2} =\sqrt{MSE_{test}} 1/m∑i=1m(ytest(i)−ytestpredict(i))2=MSEtest
代码:
def root_mean_squared_error(y_true,y_predict):
"""计算y_true和y_predict之间的RMSE"""
return sqrt(mean_squared_error(y_true,y_predict))
MAE是非常朴素评测标准,公式: 1 / m ∑ i = 1 m ∣ y t e s t ( i ) − y t e s t p r e d i c t ( i ) ∣ 1/m \sum_{i=1}^{m}|y_{test}^{(i)}-y_{test predict }^{(i)}| 1/m∑i=1m∣ytest(i)−ytestpredict(i)∣
代码:
def mean_absolute_error(y_true, y_predict):
"""计算y_true和y_predict之间的MAE"""
assert y_true.shape[0]==y_predict.shape[0],\
"the size of y_true must be equal to the size of y_predict"
return np.sum(np.absolute(y_true-y_predict))/y_true.shape[0]
从数学角度来分析,RMSE和MAE的量纲相同,但RMSE的结果较大,这是因为RMSE是将错误值平方,平方操作会放大样本中预测结果和真实结果较大的差距。MAE没有放大。而我们就是要解决目标函数最大差距,因为选RMSE更好一点。
因RMSE和MAE受量纲的局限性影响,无法对不同量纲的模型评价好坏,于是,引入 R 2 R^2 R2指标。公式: R 2 = 1 − S S r e s i d u a l / S S t o t a l = 1 − ∑ ( y p r e d i c t ( i ) − y ( i ) ) 2 / ∑ ( y m e a n − y ( i ) ) 2 = 1 − M S E ( y p r e d i c t ( i ) , y ) / V a r ( y ) R^2=1- SS_{residual}/SS_{total} =1-\sum (y_{predict }^{(i)}-y^{(i)})^2 /\sum (y_{mean}-y^{(i)})^2 =1-MSE(y_{predict }^{(i)},y)/Var(y) R2=1−SSresidual/SStotal=1−∑(ypredict(i)−y(i))2/∑(ymean−y(i))2=1−MSE(ypredict(i),y)/Var(y)
R 2 R^2 R2的好处:
①、对于分子来说,预测值和真实值之差的平方和,即使用我们的模型预测产生的错误。
②、对于分母来说,是均值和真实值之差的平方和,即认为“预测值=样本均值”这个模型(Baseline Model)所产生的错误。
③、我们使用Baseline模型产生的错误较多,我们使用自己的模型错误较少。因此用1减去较少的错误除以较多的错误,实际上是衡量了我们的模型拟合住数据的地方,即没有产生错误的相应指标。
代码:
/def r2_score(y_true,y_predict):
"""计算简单线性回归准确度(R方)"""
return 1- mean_squared_error(y_true,y_predict)/np.var(y_true)
以上代码我们封装在metrics.py文件中。
①、 R 2 R^2 R2 小于等于1,可能取负数。
②、 R 2 R^2 R2越大模型拟合度越高。值在[0.5,0.7)区间说明模型很好,值在[0.7,0.96)区间说明模型非常好,值大于等于0.96需要考虑模型是否过拟合。
③、 R 2 R^2 R2小于0,说明模型很糟糕,连’瞎猜’的效果都不如。
附上代码.