欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

线性回归(模型的评估)

程序员文章站 2024-02-02 11:25:28
...

1 前言

前面两篇文章笔者介绍了如何建模线性回归(包括多变量与多项式回归)、如何通过sklearn搭建模型并求解。但是对于一个求解出来的模型我们应该怎样来对其进行评估呢?换句话说,你这个模型到底怎么样?

线性回归(模型的评估)

以最开始的房价预测为例,现在假设你求解得到了图中所示的两个模型h1(x)h_1(x)h2(x)h_2(x),那么应该选哪一个呢?亦或是在不能可视化的情况下,应该来如何评估模型的好与坏呢?

2 评估指标

在回归任务(对连续值的预测)中,常见的评估指标(Metric)有:平均绝对误差(Mean Absolute Error,MAE)、均方误差(Mean Square Error,MSE)、均方根误差(Root Mean Square Error,RMSE)和平均绝对百分比误差(Mean Absolute Percentage Error,MAPE),其中用得最为广泛的就是MAE和MSE。下面依次来进行一个大致的介绍,同时对于下面所有的计算公式:nn均表示样本数量、yiy_i均表示第ii个样本的真实值、y^i\hat{y}_i均表示第ii个样本的预测值。

2.1 常见指标

  • 平均绝对误差(MAE)

    MAE用来衡量预测值与真实值之间的平均绝对误差,MAE越小表示模型越好,其定义如下:

MAE=1ni=1nyiy^i,    [0,+)      (1) \large{MAE=\frac{1}{n} \sum_{i=1}^n |y_i - \hat{y}_i|},\;\;\in[0,+\infty)\;\;\;(1)

def MAE(y, y_pre):
    return np.mean(np.abs(y - y_pre))
  • 均方误差(MSE)

    MSE也许是回归中最普通的评价指标,MSE越小表示模型越好,其定义如下:

MSE=1ni=1n(yiy^i)2,    [0,+)      (2) \large{MSE=\frac{1}{n} \sum_{i=1}^n (y_i - \hat{y}_i)^2,\;\;\in[0,+\infty)}\;\;\;(2)

​ 看到,有人肯定会说这不是线性回归的目标函数吗?不错,公式(2)既可以作为目标函数也可以用作评 估指标。

def MSE(y, y_pre):
    return np.mean((y - y_pre) ** 2)
  • 均方根误差(RMSE)

    RMSE是在MSE的基础之上开根号而来,RMSE越小表示模型越好,其定义如下:

RMSE=1ni=1n(yiy^i)2,    [0,+)      (3) \large{RMSE=\sqrt{\frac{1}{n} \sum_{i=1}^n (y_i - \hat{y}_i)^2},\;\;\in[0,+\infty)}\;\;\;(3)

def RMSE(y, y_pre):
    return np.sqrt(MSE(y, y_pre))
  • 平均绝对百分比误差(MAPE)

    MAPE和MAE类似,只是在MAE的基础上做了标准化处理,MAPE越小表示模型越好,其定义如下:

MAPE=100%ni=1nyiy^iyi,    [0,+)      (4) \large{MAPE=\frac{100\%}{n} \sum_{i=1}^n \left|\frac{y_i - \hat{y}_i}{y_i}\right|},\;\;\in[0,+\infty)\;\;\;(4)

def MAPE(y, y_pre):
    return np.mean(np.abs((y - y_pre) / y))
  • R2R^2评价指标

    尽管如此,但是sklearn在实现线性回归时默认采用了R2R^2指标,R2R^2越大表示模型越好,其定义如下:
    R2=1i=1n(yiy^i)2i=1n(yiy)2[0,1]      (5) R^2=1-\frac{\sum_{i=1}^n(y_i-\hat{y}_i)^2}{\sum_{i=1}^n(y_i-\overline{y})^2}\in[0,1]\;\;\;(5)
    其中y\overline{y}表示真实值的平均值。可能R2R^2的好处在于其结果进行了归一化,更容易看出模型间的差距。

def R2(y, y_pre):
    u = np.sum((y - y_pre) ** 2)
    v = np.sum((y - np.mean(y_pre)) ** 2)
    return 1 - (u / v)

2.2 代码示例

def load_data():
    data = load_boston()
    x = data.data
    y = data.target
    return x, y

def train(x, y):
    model = LinearRegression()
    model.fit(x, y)
    y_pre = model.predict(x)
    print("model score: ", model.score(x, y))
    print("MAE: ", MAE(y, y_pre))
    print("MSE: ", MSE(y, y_pre))
    print("MAPE: ", MAPE(y, y_pre))
    print("R^2: ", R2(y, y_pre))

if __name__ == '__main__':
    x, y = load_data()
    train(x, y)
    
#结果:
#model score:  0.7406426641094094
#MAE:  3.270862810900317
#MSE:  21.894831181729206
#MAPE:  0.16417298806489977
#R^2:  0.7406426641094093

3 总结

通过上面两个小节,笔者详细的介绍了如何评价一个回归模型的好坏,以及一些常用的评估指标和实现方式。最后,笔者还通过了一个房价预测示例来展示了评价指标的用法。下一篇文章笔者将继续介绍如何通过梯度下降算法来求解目标函数,以及这个目标函数的由来。本次内容就到此结束,感谢阅读!

若有任何疑问,请发邮件至aaa@qq.com并附上文章链接,青山不改,绿水长流,月来客栈见!

引用

  • 示例代码与练习: https://github.com/moon-hotel/MachineLearningWithMe

  • 吴恩达机器学习

更多内容欢迎扫码关注公众号月来客栈!
线性回归(模型的评估)