线性回归评价指标

本文参考饼干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来作为衡量回归算法好坏的标准。

二、四个指标

2.1 均方误差MSE(Mean Squared Error)

公式: 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/mi=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]

2.2 均方根误差RMSE(Root Mean Squarde Error)

为了解决量纲的问题,引入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/mi=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))

2.3 平均绝对误差MAE(Mean Absolute Error)

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/mi=1mytest(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更好一点。

2.4 R Square( R 2 R^2 R2)

因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=1SSresidual/SStotal=1(ypredict(i)y(i))2/(ymeany(i))2=1MSE(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文件中。

2.5 总结

①、 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,说明模型很糟糕,连’瞎猜’的效果都不如。

附上代码.

你可能感兴趣的:(机器学习,机器学习,算法,python,大数据,数学建模)