python统计分析——线性模型的预测和评估

news/2024/11/28 18:53:55/

参考资料:用python动手学统计学

1、导入库

# 导入库
# 导入数据处理的库
import numpy as np
import pandas as pd
import scipy as sp
from scipy import stats
# 导入绘图的库
from matplotlib import pyplot as plt
import seaborn as sns
sns.set()
# 导入估计统计模型的库
import statsmodels.formula.api as smf
import statsmodels.api as sm

2、数据准备

data=pd.DataFrame({'beer':np.array([45.3, 59.3, 40.4, 38. , 37. , 40.9, 60.2, 63.3, 51.1, 44.9, 47. ,53.2, 43.5, 53.2, 37.4, 59.9, 41.5, 75.1, 55.6, 57.2, 46.5, 35.8,51.9, 38.2, 66. , 55.3, 55.3, 43.3, 70.5, 38.8]),'temp':np.array([20.5, 25. , 10. , 26.9, 15.8,  4.2, 13.5, 26. , 23.3,  8.5, 26.2,19.1, 24.3, 23.3,  8.4, 23.5, 13.9, 35.5, 27.2, 20.5, 10.2, 20.5,21.6,  7.9, 42.2, 23.9, 36.9,  8.9, 36.4,  6.4])
})
data.head()

3、线性模型拟合

# 利用普通最小二乘法(ordinary least squares)拟合线性模型
lm=smf.ols(formula="beer~temp",data=data).fit()
# 查看模型的系数
lm.params

4、预测

当模型拟合完成后,可以用predict函数进行预测。当参数为空时,输出的是训练集对应的拟合值,如下:

在预测时可以指定气温的值,参数为dataframe格式。估计temp为0时的beer值,如下:

也可以用模型估计的系数来直接计算出对应的期望值,如下:

# 用线性模型的系数计算当temp为0时beer的期望值
beta0=lm.params[0]
beta1=lm.params[1]
temp=0
beta0+beta1*temp

5、模型评估——残差

原则上,我们应该在预测之前评估模型。模型的评估以分析残差为主。正态线性模型的残差应该服从均值为0的正态分布,所以我们要检查残差是否满足这个条件。

# 获取残差
resid=lm.resid
resid.head(3)

下面我们按照残差的计算公式获取残差,残差的计算公式为:

residuals=y-\hat{y}

其中,y为实际值,\hat{y}为估计值(拟合值)。

计算过程如下:

# 计算估计值
y_hat=beta0+beta1*data.temp
# 计算残差
res=data.beer-y_hat
res.head(3)

6、模型评估——决定系数

        在summary函数的输出中,R-squared叫作决定系数。决定系数用来评估模型与已知数据的契合度。决定系数的计算式如下:

R^2=\frac{\sum_{i=1}^{N}(\hat{y}-\mu)^2}{\sum_{i=1}^{N}(y-\mu)^2}

其中,y为相应变量的实际值,\hat{y}是模型的估计值(预测值),μ是y的均值。

如果相应变量的估计值(预测值)和实际值相等,则R^2=1。

决定系数的获取方式如下:

# 方法一:直接获取
lm.rsquared
print("lm.rsquared: ",lm.rsquared)
# 方法二:按公式进行计算
mu=np.mean(data.beer)
y=data.beer
y_hat=lm.predict()
R_squared=np.sum((y_hat-mu)**2)/np.sum((y-mu)**2)
print("R_squared: ",R_squared)

下面介绍决定系数的具体含义:由残差的计算公式residuals=y-\hat{y}变形可得y=\hat{y}+residuals。决定系数的计算公式的分母可分解为下式:

\sum_{i=1}^{N}(y-\mu)^2=\sum_{i=1}^{N}(\hat{y}-\mu)^2+\sum_{i=1}^{N}residuals^2

相应变量的差异等于模型可预测的差异加上模型不可预测的残差平方和。因此,模型可以预测的差异在整体中所占的比例就是决定系数。决定系数的表达式也可以表示为:

R^2=1-\frac{\sum_{i=1}^Nresiduals^2}{\sum_{i=1}^N(y-\mu)^2}

当解释变量越多,决定系数越大。决定系数过大会导致过拟合,因此需要对决定系数进行修正(修正决定系数考虑了解释变量过多地惩罚制表,通过自由度修正了决定系数。)修正决定系数的数学公式如下:

R^2=1-\frac{\sum_{i=1}^Nresiduals^2/(N-s-1)}{\sum_{i=1}^N(y-\mu)^2/(N-1)}

其中,s为解释变量的个数。

修正决定系数的获取方式如下:

# 方法一:直接获取
lm.rsquared_adj
print("lm.rsquared_adj: ",lm.rsquared_adj)
# 方法二:按公式进行计算
n=len(data.beer)
s=1
mu=np.mean(data.beer)
y=data.beer
R_squared_adj=1-(np.sum(lm.resid**2)/(n-s-1))/(np.sum((y-mu)**2)/(n-1))
print("R_squared_adj: ",R_squared_adj)

7、模型评估——残差的直方图和散点图

要观察残差的特征,最简单的方法就是绘制出它的直方图。

根据残差的直方图,我们可知残差大致左右对称,形状接近正态分布。

sns.histplot(lm.resid,kde=True)

下面绘制横轴为拟合值、纵轴为残差的散点图,该图看起来是随机的,个数据都不相关也没有出现极端值。

sns.jointplot(x=lm.fittedvalues,y=lm.resid)

8、模型评估——残差的分位图

        分位图是用来比较理论分位数(theoretical quantiles)与实际分位数(sample quantiles)的散点图,也叫Q-Q图。正态分布的百分位数就是理论分位数,通过图形对比理论分位数与真实数据的分位数,可以直观地判断残差是否服从正态分布分布。具体原理可以参考excel统计分析——Q-Q图_excel 画q-q图-CSDN博客

由下图可以看出,残差基本服从正态分布分布。

# 绘制Q-Q图,line=‘s’表示绘制正态分布标准线。
# 如果散点落在线上表示数据服从正态分布。
sm.qqplot(lm.resid,line='s')

9、模型评估——根据summary函数的输出分析残差

利用summary函数查看其输出的第三个表:

Prob(Omnibus) 和 Prob(JB) 是残差的正态性检验结果。p值大于0.05,并不代表残差确实不服从正态分布,此处的检验只能用来判断结果是否存在明显的问题。

要判断残差是否服从正态分布,还要观察skew(偏度)和kurtosis(峰度)的值。有此表可以skew=-0.240,接近0;kurtosis=2.951,接近3,基本服从正态分布分布。具体原理可参考:excel统计分析——偏度、峰度_excel的峰度是减3后的值吗-CSDN博客

Durbin-Watson表示残差的自相关程度,如果它的值在2附近就说明没什么问题。在分析时间序列的数据时必须判断它是否在2附近。如果残差自相关,系数的检验结果便不可信,这个现象叫作伪回归。如果DurbinWatson统计量远大于2,就需要使用广义最小二乘法进一步讨论了。


http://www.ppmy.cn/news/1360304.html

相关文章

Jmeter基础(2) 目录介绍

目录 Jmeter目录介绍bin目录docsextrasliblicensesprintable_docs Jmeter目录介绍 在学习Jmeter之前,需要先对工具的目录有些了解,也会方便后续的学习 bin目录 examplesCSV目录中有CSV样例jmeter.batwindow 启动文件jmeter.shMac/linux的启动文件jmete…

Linux进一步研究权限-----------ACL使用

一、使用情况 1.1、场景: 某个大公司,在一个部门,有一个经理和手下有两个员工,在操控一个Linux项目,项目又分为三期做,然而一期比较重要,经理带着员工做完了,公司就觉得技术难点已经做完攻克了&#xff0…

React Hooks的理解

React 中的状态 React中的数据实现响应式相对于Vue2来说要麻烦一些,Vue2中所有的变量都存放在了data当中,只要定义在data当中的数据,Vue底层就会自动把他们设置为响应式。React中的响应式数据被称作"state",state区别于…

PostgreSQL如何使用UUID

离线安装时,一般有四个包,都安装的话,只需要开启uuid的使用即可,如果工具包(即 postgresql11-contrib)没有安装的话,需要单独安装一次,再进行开启。 开启UUID方法 下面介绍一下如何开启&#…

前端js jsencrypt加密,后端解密

前端引入jsencrypt.min.js 链接:https://blog.csdn.net/CYY941027/article/details/136248779 var encrypt new JSEncrypt();encrypt.setPublicKey(key);//key为公钥,根据下一步操作生成公钥私钥,公钥放入前端加密使用var passwordrsa encr…

C语言知识复习及拓展

复习内容: 指针、数组、关键字、内存布局、堆和栈的区别、队列、链表。 关键字 1、数据类型关键字 A基本数据类型(5个) void: 是用来修饰函数的参数或返回值的,代表函数没有参数或没有返回值。 char:用…

【stm32】hal库学习笔记-UART/USART串口通信(超详细!)

【stm32】hal库学习笔记-UART/USART串口通信 hal库驱动函数 CubeMX图形化配置 导入LCD.ioc RTC设置 时钟树配置 设置LSE为RTC时钟源 USART设置 中断设置 程序编写 编写主函数 /* USER CODE BEGIN 2 */lcd_init();lcd_show_str(10, 10, 16, "Demo12_1:USART1-CH340&q…

六、回归与聚类算法 - K-means算法

目录 1、K-means 聚类步骤 2、API 3、案例 4、性能评估指标 5、总结 线性回归欠拟合与过拟合线性回归的改进 - 岭回归分类算法:逻辑回归模型保存与加载无监督学习:K-means算法 1、K-means 聚类步骤 2、API 3、案例 4、性能评估指标 5、总结