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自动化工具日志查询分析脚本代码实现
Nov 26 Python
零基础学Python(一)Python环境安装
Aug 20 Python
Python写的服务监控程序实例
Jan 31 Python
python调用fortran模块
Apr 08 Python
使用Python爬取最好大学网大学排名
Feb 24 Python
Python读取excel中的图片完美解决方法
Jul 27 Python
Python3内置模块pprint让打印比print更美观详解
Jun 02 Python
python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例
Feb 28 Python
python matplotlib imshow热图坐标替换/映射实例
Mar 14 Python
TensorFlow2.X结合OpenCV 实现手势识别功能
Apr 08 Python
利用PyTorch实现VGG16教程
Jun 24 Python
如何用Matplotlib 画三维图的示例代码
Jul 28 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及Zend Engine的线程安全模型分析
2011/11/10 PHP
php实现分页工具类分享
2014/01/09 PHP
php中print(),print_r(),echo()的区别详解
2014/12/01 PHP
php实现的递归提成方案实例
2015/11/14 PHP
详解php几行代码实现CSV格式文件输出
2017/07/01 PHP
PHP工厂模式、单例模式与注册树模式实例详解
2019/06/03 PHP
javascript学习网址备忘
2007/05/29 Javascript
jquery的Theme和Theme Switcher使用小结
2010/09/08 Javascript
jquery获取html元素的绝对位置和相对位置的方法
2014/06/20 Javascript
jQuery中unwrap()方法用法实例
2015/01/16 Javascript
js实现简单div拖拽功能实例
2015/05/12 Javascript
javascript制作幻灯片(360度全景图片)
2015/07/28 Javascript
angularjs实现上拉加载和下拉刷新数据功能
2017/06/12 Javascript
Angular 2父子组件数据传递之@ViewChild获取子组件详解
2017/07/04 Javascript
JS实现仿UC浏览器前进后退效果的实例代码
2017/07/17 Javascript
使用Node.js实现RESTful API的示例
2017/08/01 Javascript
vue使用keep-alive实现数据缓存不刷新
2017/10/21 Javascript
微信小程序实现倒计时调用相机自动拍照功能
2018/06/10 Javascript
JS实现无限轮播无倒退效果
2020/09/21 Javascript
Python sys.argv用法实例
2015/05/28 Python
Django ManyToManyField 跨越中间表查询的方法
2018/12/18 Python
用python拟合等角螺线的实现示例
2019/12/27 Python
python用pip install时安装失败的一系列问题及解决方法
2020/02/24 Python
基于python图像处理API的使用示例
2020/04/03 Python
Python嵌入C/C++进行开发详解
2020/06/09 Python
python中round函数如何使用
2020/06/19 Python
Python实现JS解密并爬取某音漫客网站
2020/10/23 Python
写好求职信第一句话的技巧
2013/10/26 职场文书
国际贸易专业个人求职信格式
2014/02/02 职场文书
2015年党员公开承诺书范文
2015/01/22 职场文书
学生会辞职信
2015/03/02 职场文书
培训通知
2015/04/17 职场文书
回复函范文
2015/07/14 职场文书
公司环境卫生管理制度
2015/08/05 职场文书
使用python如何删除同一文件夹下相似的图片
2021/05/07 Python
电脑只能进入安全模式无法正常启动的解决办法
2022/04/08 数码科技