衡量线性回归法的指标 MSE,RMS,MAE以及评价回归算法 R Square

衡量线性回归法的指标

对于分类问题来说,我们将原始数据分成了训练数据集和测试数据集两部分,我们使用训练数据集得到模型以后使用测试数据集进行测试然后和测试数据集自带的真实的标签进行对比,那么这样一来,我们就得到了我们的分类准确度,使用这种分类准确度来衡量机器学习模型的好坏

那么对于线性回归算法的好坏应该用什么来衡量呢

以简单线性回归算法来说,我们就是为了使损失函数尽可能的小,那么我们在使用的时候,实际上也是分成两部分的,我们的尽可能小是对于训练数据集来说的,实际上就是训练集和预测出的结果的差值的平方的和

当训练过程结束以后,我们将x_test带入,可以得到每个所相应的预测值

很显然,衡量标准可以是

不过,有个问题,在我们汇报这个标准的时候,这个衡量标准是个m相关的,在没有确定测试数据集的整体一致时,这个标准是没法说明的,因此我们需要对其进行一个1/m的,相当于使这个标准和样本数是无关的

我们一般称其为均方误差MSE

但是这里又有一个问题,就是量纲的问题,使y的单位变成了平方,有的时候会带来麻烦,这个时候我们就可以对上面的式子进行一个平方根处理

我们一般称其为均方根误差RMSE

这两个区别在于对于量纲是否敏感,如果使用同样量纲的话,RMSE的误差会更加的明显

还有一个就是平均绝对误差MAE,很直接,其直接得出每组数据的距离,然后加在一起,在对总数进行平均,就得到了相应的误差

那么在notebook中实现一下衡量回归标准的好坏

那么调用真实的数据,加载好相应的库

  import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

使用波士顿的房价,将数据存放在Boston中

  boston = datasets.load_boston()

可以使用print来看看其中的内容是什么

  print(boston.DESCR)

因为我么只使用简单的线性回归,所以只取一个特征

  boston.feature_names

可知rm是第五个属性,那么我们可以只是用第五列的数值,即只用房间数量这个特征

  x = boston.data[:,5]

使x和y对应起来

  x.shape

  y = boston.target
y.shape

然后进行绘制,看看大概长什么样

  plt.scatter(x,y)

数据如下所示

从图中可以看出来,在50的地方分布了一些点,这些点是一个上限点,即数据中的最大值,比如大于50的全部属于50,对于这些点,显然有可能不是真实的点

确认一下最大值是否为50

  np.max(y)

可知确实为50,那么我们将其范围改成小于50

  x = x[y < 50.0]
y = y[y < 50.0]

然后绘制看看有什么差异

  plt.scatter(x,y)

图像如下

使用简单线性回归算法

首先进行引用,并将其分成四个值,种子设置为666

  from model_selection import train_test_split

  x_train,x_test,y_train,y_test = train_test_split(x,y,seed=666)

其中我们通过shape可以知道其样本数量

  x_train.shape
x_test.shape

然后我们使用向量化运算的方式

  from SimpleLinearRegression import SimpleLinearRegression2

确定以后进行实例化,在进行fit操作进行训练

  reg = SimpleLinearRegression2()
reg.fit(x_train,y_train)

可以看看得到的a和b

  reg.a_
reg.b_

简单的绘制一下结果

  plt.scatter(x,y)
plt.plot(x_train,reg.predict(x_train),color='r')

图像如下

然后我们可以开始进行预测,使用predict这个函数将x_test引入,结果放入

  y_predict
y_predict = reg.predict(x_test)

指标部分:

MSE

对差距进行的平方的和再除以样本总数对于test来说

  mse_test = np.sum((y_predict - y_test) ** 2) / len(y_test)
mse_test

RMSE

对MSE进行一个平方根运算

  from math import sqrt

  rmse_test = sqrt(mse_test)
rmse_test

MAE

实际预测出来的结果和真实值的差值的绝对值并求和再取平均

  mae_test = np.sum(np.absolute(y_predict - y_test)) / len(y_test)
mae_test

我们写入一个metrics.py文件,将对应的操作对应的函数写在其中,三个函数的实现过程和notebook中是一样的

代码如下

  import numpy as np
from math import sqrt def accuracy_score(y_true, y_predict):
"""计算y_true和y_predict间的准确率"""
assert y_true.shape[0] == y_predict.shape[0], \
"the size of y_true must be equal to the size of y_predict" return sum(y_true == y_predict) / len(y_true) def mean_squared_error(y_true, y_predict):
"""计算y_true和y_predict间的MSE"""
assert len(y_true) == len(y_predict), \
"the size of y_true must be equal to the size of y_predict" return np.sum((y_true - y_predict) ** 2) / len(y_true) def root_mean_squared_error(y_true, y_predict):
"""计算y_true和y_predict间的RMSE""" return sqrt(mean_squared_error(y_true, y_predict)) def mean_absolute_error(y_true, y_predict):
"""计算y_true和y_predict间的MAE"""
assert len(y_true) == len(y_predict), \
"the size of y_true must be equal to the size of y_predict" return np.sum(np.absolute(y_true - y_predict)) / len(y_true) def r2_score(y_ture, y_predict):
"""计算y_true和y_predict间的R Square""" return 1 - mean_squared_error(y_ture, y_predict) / np.var(y_ture)

我们封装好属于我们自己的标准之后,我们也可以调用自己的标准

  from metrics import mean_squared_error
from metrics import root_mean_squared_error
from metrics import mean_absolute_error

MSE

  mean_squared_error(y_test,y_predict)

RMSE

  root_mean_squared_error(y_test,y_predict)

MAE

  mean_absolute_error(y_test,y_predict)

sklearn中的MSE,MAE

在sklearn中没有RMSE的方法的

因此只能使用其他两个,包装方式相同

  from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error

对其使用

MSE

  mean_squared_error(y_test,y_predict)

MAE

  mean_absolute_error(y_test,y_predict)

RSME和MAE的比较

他们的量纲是一样的,都对应着原始数据,但是大部分情况下,RMSE比MAE大,从公式可以发现,RMSE是有一个放大差距的一个趋势,因此,从某种程度上,是MSE小更好一些

从我个人来看,若是数据基本相同,从公式可以发现RMSE是除以的根号下的m,而MAE是除以m,这个地方就已经导致差距不小了,不知道这种理解对还是不对

评价回归算法 R Square

上面介绍了三种指标,但是这些还是有问题的,像是分类的准确度,1最好,0最坏,很直观,但是上面的指标就没法很直观的判断,种类不同,没法直接对比,这算是一个局限性

解决方法,使用R Square

简单来说,就是让1减去预测结果减去真值的差距的平方的和再除以均值减去真值的平方的和

这个R²的意义是什么呢

对于分子来说,这样的操作可以使用我们的模型预测产生的错误,对于分母来说,是使用y=y*(y的均值)预测产生的错误,这也可以当成一个模型,其与x是无关的,是一个很朴素的预测结果,称其为Baseline Model

基于此,我们可以认为,我们使用自己的模型和基础的模型来预测产生的错误,在用1减去两者相除以后,相当于衡量了我们的模型拟合住的数据的地方,即衡量了我们的式子没有产生错误的指标

这样下来,我们可以确定

1.R²是小于等于1的

2.R²越大越好。当我们的预测模型不犯任何错误的时候,R²会得到最大值1

3.当我们的模型等于基准模型的时候,R²为0

4.和准确度不一样,存在小于0的情况,如果R²小于0,这就说明我们学习到的模型还不如一个基准模型,这个时候,很可能是我们的模型不存在任何的线性关系,这个时候可能需要换别的非线性的算法了

我们可以发现式子是可以变化成

这就可以变成

这样计算会更加的方便直观

上式可以书写成

  1 - mean_squared_error(y_test,y_predict) / np.var(y_test)

在metrics.py中已经写好了R Square,我们直接引用使用即可

  from metrics import r2_score

直接就可以调用这个函数,就可以得出结果

  r2_score(y_test,y_predict)

在sklearn中一样有R Square,使用方法是一样的

  from sklearn.metrics import r2_score
r2_score(y_test,y_predict)

我们可以在其中直接添加上计算准确度的函数score

在SimpleLinearRegression中添加上

  from metrics import r2_score

  def r2_score(y_ture, y_predict):
"""计算y_true和y_predict间的R Square""" return 1 - mean_squared_error(y_ture, y_predict) / np.var(y_ture)

直接使用即可

  reg.score(x_test,y_test)

【笔记】衡量线性回归法的指标 MSE,RMS,MAE以及评价回归算法 R Square的更多相关文章

  1. 衡量线性回归法的指标MSE, RMSE,MAE和R Square

    衡量线性回归法的指标:MSE, RMSE和MAE 举个栗子: 对于简单线性回归,目标是找到a,b 使得尽可能小 其实相当于是对训练数据集而言的,即 当我们找到a,b后,对于测试数据集而言 ,理所当然, ...

  2. 机器学习:衡量线性回归法的指标(MSE、RMSE、MAE、R Squared)

    一.MSE.RMSE.MAE 思路:测试数据集中的点,距离模型的平均距离越小,该模型越精确 # 注:使用平均距离,而不是所有测试样本的距离和,因为距离和受样本数量的影响 1)公式: MSE:均方误差 ...

  3. 《Python编程从0到1》笔记3——欧几里得算法

    本节以欧几里得算法(这是人类历史上最早记载的算法)为示例,向读者展示注释.文档字符串(docstring).变量.循环.递归.缩进以及函数定义等Python语法要素.    欧几里得算法:“在数学中, ...

  4. Lasso回归算法: 坐标轴下降法与最小角回归法小结

    前面的文章对线性回归做了一个小结,文章在这: 线性回归原理小结.里面对线程回归的正则化也做了一个初步的介绍.提到了线程回归的L2正则化-Ridge回归,以及线程回归的L1正则化-Lasso回归.但是对 ...

  5. Spark MLlib回归算法------线性回归、逻辑回归、SVM和ALS

    Spark MLlib回归算法------线性回归.逻辑回归.SVM和ALS 1.线性回归: (1)模型的建立: 回归正则化方法(Lasso,Ridge和ElasticNet)在高维和数据集变量之间多 ...

  6. STL笔记(6)标准库:标准库中的排序算法

    STL笔记(6)标准库:标准库中的排序算法 标准库:标准库中的排序算法The Standard Librarian: Sorting in the Standard Library Matthew A ...

  7. 回归算法比较(线性回归,Ridge回归,Lasso回归)

    代码: # -*- coding: utf-8 -*- """ Created on Mon Jul 16 09:08:09 2018 @author: zhen &qu ...

  8. 可决系数R^2和MSE,MAE,SMSE

    波士顿房价预测 首先这个问题非常好其实要完整的回答这个问题很有难度,我也没有找到一个完整叙述这个东西的资料,所以下面主要是结合我自己的理解和一些资料谈一下r^2,mean square error 和 ...

  9. 第3章 衡量线性回归的指标:MSE,RMSE,MAE

    , , ,, , ,  , 

随机推荐

  1. RabbitMQ重试机制

    消费端在处理消息过程中可能会报错,此时该如何重新处理消息呢?解决方案有以下两种. 在redis或者数据库中记录重试次数,达到最大重试次数以后消息进入死信队列或者其他队列,再单独针对这些消息进行处理: ...

  2. Java进阶 | IO流核心模块与基本原理

    一.IO流与系统 IO技术在JDK中算是极其复杂的模块,其复杂的一个关键原因就是IO操作和系统内核的关联性,另外网络编程,文件管理都依赖IO技术,而且都是编程的难点,想要整体理解IO流,先从Linux ...

  3. spring 5 webflux异常处理

    序 本文主要研究一下spring 5 webflux的异常处理 maven <dependency> <groupId>org.springframework.boot< ...

  4. 文末送书四本 | 这篇Java反射机制太经典!不看后悔!

    先看再点赞,给自己一点思考的时间,如果对自己有帮助,微信搜索[程序职场]关注这个执着的职场程序员. 价值:Java技能,面试经验指导,简历优化,职场规划指导,技能提升方法,讲不完的职场故事,个人成长经 ...

  5. Java核心基础第4篇-Java数组的常规操作

    Java数组 一.数组简介 数组是多个相同类型数据的组合,实现对这些数据的统一管理 数组属引用类型,数组型数据是对象(Object) 数组中的元素可以是任何数据类型,包括基本类型和引用类型 数组类型是 ...

  6. WPF技巧:通过代码片段管理器编写自己常用的代码模板提示效率

    在写自定义控件的时候,有一部分功能是当内部的值发生变化时,需要通知控件的使用者,而当我在写依赖项属性的时候,我可以通过popdp对应的代码模板来完成对应的代码,但是当我来写属性更改回调的时候,却发现没 ...

  7. Grafana、Prometheus-监控平台

    一:Grafana 简介与部署 安利一个生产环境正在使用的监控和告警平台:grafana,它是一个开源的可对指标和日志进行查询.可视化和告警的平台. docker 安装官方文档:https://gra ...

  8. lxml的使用(节点与xpath爬取数据)

    lxml安装 lxml是python下功能很丰富的XML和HTML解析库,性能非常的好,是对libxml3和libxlst的封装.在Windows下载这个库直接使用 pip install lxml ...

  9. [刘阳Java]_纯CSS代码实现内容过滤效果

    继续我们技术专题课,我们今天给大家带来的是一个比较酷炫的"纯CSS代码实现内容过滤效果",没有加入任何JS的效果.全部都是应用CSS3的新增选择器来实现的.先看效果截图 实现思路 ...

  10. 【LeetCode】389.找不同

    389.找不同 知识点:哈希表.抵消思想: 题目描述 给定两个字符串 s 和 t,它们只包含小写字母. 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母. 请找出在 t 中被添加的字母. ...