python 线性回归分析模型检验标准--拟合优度详解


Posted in Python onFebruary 24, 2020

建立完回归模型后,还需要验证咱们建立的模型是否合适,换句话说,就是咱们建立的模型是否真的能代表现有的因变量与自变量关系,这个验证标准一般就选用拟合优度。

拟合优度是指回归方程对观测值的拟合程度。度量拟合优度的统计量是判定系数R^2。R^2的取值范围是[0,1]。R^2的值越接近1,说明回归方程对观测值的拟合程度越好;反之,R^2的值越接近0,说明回归方程对观测值的拟合程度越差。

拟合优度问题目前还没有找到统一的标准说大于多少就代表模型准确,一般默认大于0.8即可

拟合优度的公式:R^2 = 1 - RSS/TSS

注: RSS 离差平方和 ; TSS 总体平方和

理解拟合优度的公式前,需要先了解清楚几个概念:总体平方和、离差平方和、回归平方和。

一、总体平方和、离差平方和、回归平方和

回归平方和 ESS,残差平方和 RSS,总体平方和 TSS

TSS(Total Sum of Squares)表示实际值与期望值的离差平方和,代表变量的总变动程度

ESS(Explained Sum of Squares)表示预测值与期望值的离差平方和,代表预测模型拥有的变量变动程度

RSS(Residual Sum of Squares)表示实际值与预测值的离差平方和,代表变量的未知变动程度

各个平方和的计算公式如下:

python 线性回归分析模型检验标准--拟合优度详解

二、拟合优度

接上一节内容可知,我们拿实际值与期望值的离差平方和作为整体变量的总变动程度,这个变动程度就是我们建模型的目的,我们建立模型就是为了模拟这个变动程度。

建立模型后,整体变量的总变动程度(TSS)可以划分为两部分:模型模拟的变动程度(ESS)和未知的变动程度(RSS)

通常来说,预测模型拥有的变量变动程度在总变动程度中的占比越高,代表模型越准确,当RSS=0时,表示模型能完全模拟变量的总变动。

回到文章开头的拟合优度公式:R^2 = 1 - RSS/TSS 。是不是很好理解了!

假设R^2 = 0.8,意味着咱们建立的模型拥有的变动程度能模拟80%的总变动程度,剩下20%为未知变动。

三、例子

对于学生而言,现在要探索一下学生的学习成绩与单一的学习时间是否有关系,给出两组数据如下:

'学习时间':[0.50,0.75,1.00,1.25,1.50,1.75,1.75, 2.00,2.25,2.50,2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50],

'分数':[10,22,13,43,20,22,33,50,62,48,55,75,62,73,81,76,64,82,90,93]

常识理解,学习时间越长,分数一般都会越高,两者是正比关系,因为就一个自变量,直接用sklearn,算出截距和斜率即可

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pandas import DataFrame,Series
from sklearn.cross_validation import train_test_split
from sklearn.linear_model import LinearRegression
 
#创建数据集
examDict = {'学习时间':[0.50,0.75,1.00,1.25,1.50,1.75,1.75,
           2.00,2.25,2.50,2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50],
       '分数':[10,22,13,43,20,22,33,50,62,
          48,55,75,62,73,81,76,64,82,90,93]}
 
#转换为DataFrame的数据格式
examDf = DataFrame(examDict)
#examDf
#绘制散点图
plt.scatter(examDf.分数,examDf.学习时间,color = 'b',label = "Exam Data")
 
#添加图的标签(x轴,y轴)
plt.xlabel("Hours")
plt.ylabel("Score")
#显示图像
plt.show()
 
#将原数据集拆分训练集和测试集
exam_X = examDf.学习时间
exam_Y = examDf.分数
X_train,X_test,Y_train,Y_test = train_test_split(exam_X,exam_Y,train_size=0.8)
#X_train为训练数据标签,X_test为测试数据标签,exam_X为样本特征,exam_y为样本标签,train_size 训练数据占比
 
print("原始数据特征:",exam_X.shape,
   ",训练数据特征:",X_train.shape,
   ",测试数据特征:",X_test.shape)
 
print("原始数据标签:",exam_Y.shape,
   ",训练数据标签:",Y_train.shape,
   ",测试数据标签:",Y_test.shape)
 
model = LinearRegression()
 
#对于模型错误我们需要把我们的训练集进行reshape操作来达到函数所需要的要求
# model.fit(X_train,Y_train)
 
#reshape如果行数=-1的话可以使我们的数组所改的列数自动按照数组的大小形成新的数组
#因为model需要二维的数组来进行拟合但是这里只有一个特征所以需要reshape来转换为二维数组
X_train = X_train.values.reshape(-1,1)
X_test = X_test.values.reshape(-1,1)
 
model.fit(X_train,Y_train)
a = model.intercept_#截距
b = model.coef_#回归系数
print("最佳拟合线:截距",a,",回归系数:",b)

接下来算出拟合优度看看 ,拟合优度0.83,符合要求

# 用训练集进行拟合优度,验证回归方程是否合理
def get_lr_stats(x, y, model):
  message0 = '一元线性回归方程为: '+'\ty' + '=' + str(model.intercept_)+' + ' +str(model.coef_[0]) + '*x'
  from scipy import stats
  n = len(x)
  y_prd = model.predict(x)
  Regression = sum((y_prd - np.mean(y))**2) # 回归平方和
  Residual  = sum((y - y_prd)**2)     # 残差平方和
  total = sum((y-np.mean(y))**2) #总体平方和
  R_square  = 1-Residual / total # 相关性系数R^2
  message1 = ('相关系数(R^2): ' + str(R_square) + ';' + '\n'+ '总体平方和(TSS): ' + str(total) + ';' + '\n')
  message2 = ('回归平方和(RSS): ' + str(Regression) + ';' + '\n残差平方和(ESS): ' + str(Residual) + ';' + '\n')
  return print(message0 +'\n' +message1 + message2 )
 
get_lr_stats(X_train,Y_train,model)

python 线性回归分析模型检验标准--拟合优度详解

如果需要,可以把所有点和回归直线画出来,直观感受一下

#训练数据的预测值
y_train_pred = model.predict(X_train)
#绘制最佳拟合线:标签用的是训练数据集中的极值预测值
X_train_pred = [min(X_train),max(X_train)]
y_train_pred = [a+b*min(X_train),a+b*max(X_train)]
plt.plot(X_train_pred, y_train_pred, color='green', linewidth=3, label="best line")
 
#测试数据散点图
plt.scatter(X_test, Y_test, color='red', label="test data")
plt.scatter(X_train, Y_train, color="blue", label="train data")
 
#添加图标标签
plt.legend(loc=2)
plt.xlabel("Hours")
plt.ylabel("Score")
#显示图像
plt.savefig("lines.jpg")
plt.show()
#计算拟合优度
score = model.score(X_test,Y_test)
print(score)

python 线性回归分析模型检验标准--拟合优度详解

以上这篇python 线性回归分析模型检验标准--拟合优度详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python Socket编程入门教程
Jul 11 Python
浅谈python中scipy.misc.logsumexp函数的运用场景
Jun 23 Python
放弃 Python 转向 Go语言有人给出了 9 大理由
Oct 20 Python
Python实现多进程共享数据的方法分析
Dec 04 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
Oct 01 Python
python单向循环链表原理与实现方法示例
Dec 03 Python
Python 解码Base64 得到码流格式文本实例
Jan 09 Python
django 文件上传功能的相关实例代码(简单易懂)
Jan 22 Python
pytorch梯度剪裁方式
Feb 04 Python
Python CSS选择器爬取京东网商品信息过程解析
Jun 01 Python
如何用Python 加密文件
Sep 10 Python
Python实现智慧校园自动评教全新版
Jun 18 Python
最小二乘法及其python实现详解
Feb 24 #Python
在Python 的线程中运行协程的方法
Feb 24 #Python
Python 爬取必应壁纸的实例讲解
Feb 24 #Python
Python unittest工作原理和使用过程解析
Feb 24 #Python
Python 剪绳子的多种思路实现(动态规划和贪心)
Feb 24 #Python
用python介绍4种常用的单链表翻转的方法小结
Feb 24 #Python
关于多元线性回归分析——Python&SPSS
Feb 24 #Python
You might like
php简单实现批量上传图片的方法
2016/05/09 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
2017/11/24 PHP
php和asp语法上的区别总结
2019/05/12 PHP
SyntaxHighlighter语法高亮插件使用说明
2011/08/14 Javascript
jquery ajax中使用jsonp的限制解决方法
2013/11/22 Javascript
javascript去除字符串左右两端的空格
2015/02/05 Javascript
jQuery随机密码生成的方法
2015/03/09 Javascript
javascript中关于&& 和 || 表达式的小技巧分享
2015/04/10 Javascript
个人总结的一些JavaScript技巧、实用函数、简洁方法、编程细节
2015/06/10 Javascript
最丑的时钟效果!js canvas时钟制作方法
2016/08/15 Javascript
JavaScript中日常收集常见的10种错误(推荐)
2017/01/08 Javascript
分享Bootstrap简单表格、表单、登录页面
2017/08/04 Javascript
详解jQuery中的isPlainObject()使用方法
2018/02/27 jQuery
通过函数作用域和块级作用域看javascript的作用域链
2018/08/05 Javascript
vue.js使用v-model实现父子组件间的双向通信示例
2020/02/05 Javascript
基于原生js实现九宫格算法代码实例
2020/07/03 Javascript
教你用Python脚本快速为iOS10生成图标和截屏
2016/09/22 Python
Python基于Matplotlib库简单绘制折线图的方法示例
2017/08/14 Python
详解python tkinter教程-事件绑定
2019/03/28 Python
pytorch 准备、训练和测试自己的图片数据的方法
2020/01/10 Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
2020/03/10 Python
Amaze UI 文件选择域的示例代码
2020/08/26 HTML / CSS
美国著名的品牌折扣店:Burlington
2017/06/08 全球购物
一组SQL面试题
2016/02/15 面试题
银行营业厅大堂经理岗位职责
2014/01/06 职场文书
乌鸦喝水教学反思
2014/02/07 职场文书
办公室打字员岗位职责
2014/04/16 职场文书
公司承诺书怎么写
2014/05/24 职场文书
党的群众路线教育实践活动个人整改方案
2014/09/21 职场文书
营销与策划实训报告
2014/11/05 职场文书
会议欢迎词范文
2015/01/27 职场文书
学术会议通知范文
2015/04/15 职场文书
歌剧魅影观后感
2015/06/05 职场文书
python ConfigParser库的使用及遇到的坑
2022/02/12 Python
spring注解 @PropertySource配置数据源全流程
2022/03/25 Java/Android
避坑之 JavaScript 中的toFixed()和正则表达式
2022/04/19 Javascript