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中的并发编程实例
Jul 07 Python
Python(TensorFlow框架)实现手写数字识别系统的方法
May 29 Python
Python+OpenCV目标跟踪实现基本的运动检测
Jul 10 Python
Python使用pymysql从MySQL数据库中读出数据的方法
Jul 25 Python
selenium3+python3环境搭建教程图解
Dec 07 Python
pyqt5中QThread在使用时出现重复emit的实例
Jun 21 Python
简单了解django orm中介模型
Jul 30 Python
使用Python将图片转正方形的两种方法实例代码详解
Apr 29 Python
基于python+selenium自动健康打卡的实现代码
Jan 13 Python
python字符串的多行输出的实例详解
Jun 08 Python
baselines示例程序train_cartpole.py的ImportError
May 20 Python
Python 操作pdf pdfplumber读取PDF写入Exce
Aug 14 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分页显示制作详细讲解
2006/12/05 PHP
php中explode的负数limit用法分析
2015/02/27 PHP
PHP自毁程序(慎用)
2015/07/09 PHP
zend framework重定向方法小结
2016/05/28 PHP
PHP的微信支付接口使用方法讲解
2019/03/08 PHP
eval与window.eval的差别分析
2011/03/17 Javascript
常见JS效果之图片减速度滚动实现代码
2011/12/08 Javascript
根据经纬度计算地球上两点之间的距离js实现代码
2013/03/05 Javascript
原始的js代码和jquery对比体会
2013/09/10 Javascript
javascript实现表格排序 编辑 拖拽 缩放
2015/01/02 Javascript
JavaScript的设计模式经典之建造者模式
2016/02/24 Javascript
关于JS中的apply,call,bind的深入解析
2016/04/05 Javascript
一些实用性较高的js方法
2016/04/19 Javascript
javascript实现延时显示提示框特效代码
2016/04/27 Javascript
VUE JS 使用组件实现双向绑定的示例代码
2017/01/10 Javascript
angular使用bootstrap方法手动启动的实例代码
2017/07/18 Javascript
jquery 一键复制到剪切板的实例
2017/09/20 jQuery
深入了解JavaScript 私有化
2019/05/30 Javascript
vue实现pdf文档在线预览功能
2019/11/26 Javascript
python压缩文件夹内所有文件为zip文件的方法
2015/06/20 Python
Python+matplotlib实现计算两个信号的交叉谱密度实例
2018/01/08 Python
Python使用matplotlib和pandas实现的画图操作【经典示例】
2018/06/13 Python
Python函数装饰器实现方法详解
2018/12/22 Python
Django模板标签{% for %}循环,获取制定条数据实例
2020/05/14 Python
使用python实现时间序列白噪声检验方式
2020/06/03 Python
Python闭包装饰器使用方法汇总
2020/06/29 Python
意大利奢侈品网站:Italist
2016/08/23 全球购物
美国宠物商店:Wag.com
2016/10/25 全球购物
Tea Collection官网:一家位于旧金山的童装公司
2020/08/07 全球购物
JSF界面控制层技术
2013/06/17 面试题
大学本科毕业生求职信范文
2013/12/18 职场文书
无子女夫妻离婚协议书(4篇)
2014/10/20 职场文书
幼儿园毕业致辞
2015/07/29 职场文书
JavaScript如何利用Promise控制并发请求个数
2021/05/14 Javascript
IDEA 链接Mysql数据库并执行查询操作的完整代码
2021/05/20 MySQL
Golang并发工具Singleflight
2022/05/06 Golang