线性回归评价指标

本文参考饼干Japson《模型之母:线性回归的评价指标》编写
今天,我们学习线性回归算法的评价指标——MSE、RMSE、MAE、R Square。

一、了解线性回归算法的衡量标准

引用饼干Japson的话。已知训练数据样本x、y,找到a和b的值,使i=1n(y(i)ax(i)b)2\sum_{i=1}^{n} (y^{(i)}-ax^{(i)}-b)^2尽可能小 。
实际上是找到训练数据集中i=1n(y(i)ypredict(i))2\sum_{i=1}^{n} (y^{(i)}-y_{predict }^{(i)})^2最小。
衡量标准是看在测试数据集中y的真实值与预测值之间的差距。
因此我们可以使用下面公式作为衡量标准:
i=1n(y(i)ypredict(i))2\sum_{i=1}^{n} (y^{(i)}-y_{predict }^{(i)})^2
但是这里有一个问题,这个衡量标准是和m相关的。在具体衡量时,测试数据集不同将会导致误差的累积量不同。
首先我们从“使损失函数尽量小”这个思路出发:
对于训练数据集合来说,使i=1n(ytrain(i)axtrain(i)b)2\sum_{i=1}^{n} (y_{train}^{(i)}-ax_{train }^{(i)}- b)^2尽可能小
在得到a和b之后将xtestx_{test}代入a、b中。可以使用i=1n(ytest(i)ytestpredict(i))2\sum_{i=1}^{n} (y_{test}^{(i)}-y_{test predict }^{(i)})^2来作为衡量回归算法好坏的标准。

二、四个指标

2.1 均方误差MSE(Mean Squared Error)

公式:1/mi=1m(ytest(i)ytestpredict(i))21/m \sum_{i=1}^{m}(y_{test}^{(i)}-y_{test predict }^{(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/mi=1m(ytest(i)ytestpredict(i))2=MSEtest\sqrt{1/m \sum_{i=1}^{m}(y_{test}^{(i)}-y_{test predict }^{(i)})^2} =\sqrt{MSE_{test}}
代码:

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/mi=1mytest(i)ytestpredict(i)1/m \sum_{i=1}^{m}|y_{test}^{(i)}-y_{test predict }^{(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(R2R^2)

因RMSE和MAE受量纲的局限性影响,无法对不同量纲的模型评价好坏,于是,引入R2R^2指标。公式:R2=1SSresidual/SStotal=1(ypredict(i)y(i))2/(ymeany(i))2=1MSE(ypredict(i),y)/Var(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)

R2R^2的好处:
①、对于分子来说,预测值和真实值之差的平方和,即使用我们的模型预测产生的错误。
②、对于分母来说,是均值和真实值之差的平方和,即认为“预测值=样本均值”这个模型(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 总结

①、R2R^2 小于等于1,可能取负数。
②、R2R^2越大模型拟合度越高。值在[0.5,0.7)区间说明模型很好,值在[0.7,0.96)区间说明模型非常好,值大于等于0.96需要考虑模型是否过拟合。
③、R2R^2小于0,说明模型很糟糕,连’瞎猜’的效果都不如。

附上代码.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章