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

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

拟合优度是指回归方程对观测值的拟合程度。度量拟合优度的统计量是判定系数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)表示实际值与预测值的离差平方和,代表变量的未知变动程度

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

二、拟合优度

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

建立模型后,整体变量的总变动程度(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)

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

#训练数据的预测值
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 线性回归分析模型检验标准--拟合优度详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • sklearn+python:线性回归案例

    使用一阶线性方程预测波士顿房价 载入的数据是随sklearn一起发布的,来自boston 1993年之前收集的506个房屋的数据和价格.load_boston()用于载入数据. from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split import time from sklearn.linear_model import LinearRegression bosto

  • 关于多元线性回归分析——Python&SPSS

    原始数据在这里 1.观察数据 首先,用Pandas打开数据,并进行观察. import numpy import pandas as pd import matplotlib.pyplot as plt %matplotlib inline data = pd.read_csv('Folds5x2_pp.csv') data.head() 会看到数据如下所示: 这份数据代表了一个循环发电厂,每个数据有5列,分别是:AT(温度), V(压力), AP(湿度), RH(压强), PE(输出电力).我

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

    建立完回归模型后,还需要验证咱们建立的模型是否合适,换句话说,就是咱们建立的模型是否真的能代表现有的因变量与自变量关系,这个验证标准一般就选用拟合优度. 拟合优度是指回归方程对观测值的拟合程度.度量拟合优度的统计量是判定系数R^2.R^2的取值范围是[0,1].R^2的值越接近1,说明回归方程对观测值的拟合程度越好:反之,R^2的值越接近0,说明回归方程对观测值的拟合程度越差. 拟合优度问题目前还没有找到统一的标准说大于多少就代表模型准确,一般默认大于0.8即可 拟合优度的公式:R^2 = 1

  • Python 线性回归分析以及评价指标详解

    废话不多说,直接上代码吧! """ # 利用 diabetes数据集来学习线性回归 # diabetes 是一个关于糖尿病的数据集, 该数据集包括442个病人的生理数据及一年以后的病情发展情况. # 数据集中的特征值总共10项, 如下: # 年龄 # 性别 #体质指数 #血压 #s1,s2,s3,s4,s4,s6 (六种血清的化验数据) #但请注意,以上的数据是经过特殊处理, 10个数据中的每个都做了均值中心化处理,然后又用标准差乘以个体数量调整了数值范围. #验证就会发现任

  • Python Pandas数据处理高频操作详解

    目录 引入依赖 算法相关依赖 获取数据 生成df 重命名列 增加列 缺失值处理 独热编码 替换值 删除列 数据筛选 差值计算 数据修改 时间格式转换 设置索引列 折线图 散点图 柱状图 热力图 66个最常用的pandas数据分析函数 从各种不同的来源和格式导入数据 导出数据 创建测试对象 查看.检查数据 数据选取 数据清理 筛选,排序和分组依据 数据合并 数据统计 16个函数,用于数据清洗 1.cat函数 2.contains 3.startswith/endswith 4.count 5.ge

  • Python探索之ModelForm代码详解

    这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来,对,你没猜错,相信自己的英语水平. 先来一个简单的例子来看一下这个东西怎么用: 比如我们的数据库中有这样一张学生表,字段有姓名,年龄,爱好,邮箱,电话,住址,注册时间等等一大堆信息,现在让你写一个创建学生的页面,你的后台应该怎么写呢? 首先我们会在前端一个一个罗列出这些字段,让用户去填写,然后我们从后天一个一个接收用户的输入,创建一个新的学生对象,保存 其实,重点不是这些,而是合法性验证,我们需要在前端

  • python装饰器实例大详解

    一.作用域 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我们要理解两点: a.在全局不能访问到局部定义的变量 b.在局部能够访问到全局定义的变量,但是不能修改全局定义的变量(当然有方法可以修改) 下面我们来看看下面实例: x = 1 def funx(): x = 10 print(x) # 打印出10 funx() print(x) # 打印出1 如果局部没有定义变量x,那么函数内部会从内往

  • python中 logging的使用详解

    日志是用来记录程序在运行过程中发生的状况,在程序开发过程中添加日志模块能够帮助我们了解程序运行过程中发生了哪些事件,这些事件也有轻重之分. 根据事件的轻重可分为以下几个级别: DEBUG: 详细信息,通常仅在诊断问题时才受到关注.整数level=10 INFO: 确认程序按预期工作.整数level=20 WARNING:出现了异常,但是不影响正常工作.整数level=30 ERROR:由于某些原因,程序 不能执行某些功能.整数level=40 CRITICAL:严重的错误,导致程序不能运行.整数

  • python的mysqldb安装步骤详解

    python的mysqldb安装步骤详解 安装MySQLdb: 一. 什么是MySQLdb? 解释:MySQLdb是Python操作MySQL的一个接口包.这里要理解一个概念,python操作数据库,都是需要一个类似MySQLdb这样的中间层,这些中间层抽象了具体的实现,提供了统一的API供开发者使用. 二. 如何安装MySQLdb? python2环境下: sudo pip install MySQL-python. MySQL-python目前暂时还不支持python3,有些小问题,可以安装

  • python模块之re正则表达式详解

    一.简单介绍 正则表达式是一种小型的.高度专业化的编程语言,并不是python中特有的,是许多编程语言中基础而又重要的一部分.在python中,主要通过re模块来实现. 正则表达式模式被编译成一系列的字节码,然后由用c编写的匹配引擎执行.那么正则表达式通常有哪些使用场景呢? 比如为想要匹配的相应字符串集指定规则: 该字符串集可以是包含e-mail地址.Internet地址.电话号码,或是根据需求自定义的一些字符串集: 当然也可以去判断一个字符串集是否符合我们定义的匹配规则: 找到字符串中匹配该规

  • python魔法方法-自定义序列详解

    自定义序列的相关魔法方法允许我们自己创建的类拥有序列的特性,让其使用起来就像 python 的内置序列(dict,tuple,list,string等). 如果要实现这个功能,就要遵循 python 的相关的协议.所谓的协议就是一些约定内容.例如,如果要将一个类要实现迭代,就必须实现两个魔法方法:__iter__.next(python3.x中为__new__).__iter__应该返回一个对象,这个对象必须实现 next 方法,通常返回的是 self 本身.而 next 方法必须在每次调用的时

  • python logging日志模块的详解

    python logging日志模块的详解 日志级别 日志一共分成5个等级,从低到高分别是:DEBUG INFO WARNING ERROR CRITICAL. DEBUG:详细的信息,通常只出现在诊断问题上 INFO:确认一切按预期运行 WARNING:一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如.磁盘空间低").这个软件还能按预期工作. ERROR:更严重的问题,软件没能执行一些功能 CRITICAL:一个严重的错误,这表明程序本身可能无法继续运行 这5个等级,也

随机推荐