python数据分析——模型诊断

参考资料:活用pandas库

        创建模型是持续性活动。当向模型中添加或删除变量时,需要设法比较模型,并需要统一的方法衡量模型的性能。

1、残差

        模型的残差指实际观测值与模型估计值之差。

# 导入pandas库
import pandas as pd
# 读取数据集
housing=pd.read_csv(r"...\data\housing_renamed.csv")
# 展示数据
print(housing.head())
# 拟合一个多元线性回归模型
import statsmodels
import statsmodels.api as sm
import statsmodels.formula.api as smf
house1=smf.glm("value_per_sq_ft~ units+ sq_ft + boro",data=housing).fit()
print(house1.summary())
# 绘制模型残差
import seaborn as sns
import matplotlib.pyplot as plt
fig,ax=plt.subplots()
ax=sns.regplot(x=house1.fittedvalues,y=house1.resid_deviance,fit_reg=False)

(1)绘制残差散点图 

# 通过boro变量为图着色。
res_df=pd.DataFrame({'fittedvalues':house1.fittedvalues,'resid_deviance':house1.resid_deviance,'boro':housing['boro']
})
fig=sns.lmplot(x='fittedvalues',y='resid_deviance',hue='boro',data=res_df,fit_reg=False)

        通过上图可见,当通过boro为点着色时,图中点簇收到了变量值的极大影响。

(2)Q-Q图

        Q-Q图用于判断数据是否符合某个参考分布。许多模型都假设数据是正态分布的,因此Q-Q图常用于检验数据是否来自正态分布。

        如果Q-Q图上的点在红线上,就表示数据符合参考分布,否则要转换数据。

from scipy import stats
resid=house1.resid_deviance.copy()
resid_std=stats.zscore(resid)
fig=statsmodels.graphics.gofplots.qqplot(resid,line='r')

(3)残差直方图

        通过绘制残差直方图,观察数据是否呈正态分布。

fig,ax=plt.subplots()
ax=sns.histplot(resid_std,kde=True)

2、比较多个模型

        有时需要比较多个模型,以便从中选出“最佳”模型。

(1)比较线性模型

        首先拟合5个模型。请注意有些模型使用“+”运算符向模型中添加协变量,有些模型则使用“*”运算符进行添加。当在模型中指定交互时应使用“*”操作符,这意味着交互变量的行为不是彼此独立的,他们的值相互影响,而不是简单地相加。

# 原始住房数据集包含class列
# 使用“class”这个词会引发错误,因为class是python的关键字
# 把列重命名为type
f1="value_per_sq_ft ~ units + sq_ft + boro"
f2="value_per_sq_ft ~ units * sq_ft + boro"
f3="value_per_sq_ft ~ units + sq_ft * boro + type"
f4="value_per_sq_ft ~ units + sq_ft * boro + sq_ft * type"
f5="value_per_sq_ft ~ boro + type"
house1=smf.ols(f1,data=housing).fit()
house2=smf.ols(f2,data=housing).fit()
house3=smf.ols(f3,data=housing).fit()
house4=smf.ols(f4,data=housing).fit()
house5=smf.ols(f5,data=housing).fit()
model_results=pd.concat([house1.params,house2.params,house3.params,house4.params,house5.params],axis=1).\
rename(columns=lambda x: "house"+str(x+1)).\
reset_index().\
rename(columns={"index":"params"}).\
melt(id_vars='params',var_name='model',value_name='estimate')
print(model_results.head())

        查看大量值意义不大,可以把系数绘制出来,直观展现模型是如何估计彼此的相关参数的。

fig,ax=plt.subplots()
ax=sns.pointplot(x='estimate',y='params',hue="model",data=model_results,dodge=True,join=False)
plt.tight_layout()

        下面使用方差分析(ANOVA)方法来比较它们。方差分析会给出残差平方和(SSR),可以通过它来评估模型的性能(残差平方和越小,模型的拟合效果越好。)

model_names=['house1','house2','house3','house4','house5']
house_anova=statsmodels.stats.anova.anova_lm(
house1,house2,house3,house4,house5)
house_anova.index=model_names
print(house_anova)

        评估模型性能的另一种方法是使用赤池信息量准测(AIC)和贝叶斯信息准备(BIC)。这些方法均引入了与模型参数个数相关的惩罚项。因此,应尽量在模型的性能和简洁性之间做好平衡(简单优于复杂)。

(2)比较GLM

        可以采用同样的方法评估和诊断GLM。不过,方差分析只评估模型的偏差。

def anova_deviance_table(*models):return pd.DataFrame({'df_residuals':[i.df_resid for i in models],'resid_stddev':[i.deviance for i in models],'df':[i.df_model for i in models],'deviance':[i.deviance for i in models]})
f1="value_per_sq_ft ~ units + sq_ft + boro"
f2="value_per_sq_ft ~ units * sq_ft + boro"
f3="value_per_sq_ft ~ units + sq_ft * boro + type"
f4="value_per_sq_ft ~ units + sq_ft * boro + sq_ft * type"
f5="value_per_sq_ft ~ boro + type"
glm1=smf.glm(f1,data=housing).fit()
glm2=smf.glm(f2,data=housing).fit()
glm3=smf.glm(f3,data=housing).fit()
glm4=smf.glm(f4,data=housing).fit()
glm5=smf.glm(f5,data=housing).fit()
glm_anova=anova_deviance_table(glm1,glm2,glm3,glm4,glm5)
print(glm_anova)

(3)k折交叉验证

        较差验证是另一种模型比较方法。它可以解释模型在新数据上的表现。这种方法会把数据分成k个部分,把其中一个部分用作测试集,把其余部分用作训练集来拟合模型。模型拟合好之后,使用测试集进行测试,并计算误差。不断重复这个过程,直到k个部分都测试过。

        k通常取值介于 5和10之间。请注意,k值越大,所需要计算的时间越长,请根据实际情况选择合适的k值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/341880.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[next.js]pwa缓存

配置Next.js (v14 App Router模式) 使其支持PWA缓存,配置server worker和mainfest.json,让项目支持离线访问和可安装。 安装依赖next-pwa npm i next-pwa配置next.config.js const path require(path);const withPWAInit require(next-pwa);// 判断…

Nodejs 第七十四章(微服务)

什么是微服务? micro servers 微服务和微前端是类似的,微前端就是借鉴了微服务的理念去实现的,那么微服务指的就是,将应用程序拆分成为一系列小型、独立的服务,每个服务都是专注于执行特定的业务,比如文章…

微软云计算[3]之Windows Azure AppFabric

Windows Azure AppFabric AppFabric概述AppFabric关键技术服务总线访问控制高速缓存 AppFabric概述 AppFabric为本地应用和云中应用提供了分布式的基础架构服务 用户本地应用与云应用之间进行安全联接和信息传递 云应用和现有应用或服务之间的连接及跨语言、跨平台、跨不同标…

13- Redis 中的 压缩列表 数据结构

压缩列表的最大特点,就是它被设计成一种内存紧凑型的数据结构,占用 一块连续的内存空间,不仅可以利用 CPU 缓存,而且会针对不同长度的数据,进行相应编码,这种方法可以有效的节省内存开销。 但是&#xff0…

C#开源实用的工具类库,集成超过1000多种扩展方法

前言 今天大姚给大家分享一个C#开源(MIT License)、免费、实用且强大的工具类库,集成超过1000多种扩展方法增强 .NET Framework 和 .NET Core的使用效率:Z.ExtensionMethods。 直接项目引入类库使用 在你的对应项目中NuGet包管…

【办公类-04-02】华为助手导出照片读取拍摄时间分类导出,视频不行)

背景需求 今天我用QQ相册导出照片,但是始终在转圈,手机上无法跳出“连结“”的提示,换了台式和笔记本都无法传输。(明明5月14日还可以导出的) 最后我只能用华为传输助手,把照片快速提取出来了。 使用原来…

模式识别涉及的常用算法

一、线性回归 1.算法执行流程: 算法的执行流程可以简述如下: 导入必要的库: 导入NumPy库,用于数值计算。导入Matplotlib库,用于数据可视化。导入Pandas库,用于数据处理(尽管在这个例子中&#…

C语言基础学习之位运算

枚举类型 enum 枚举名 { 枚举常量 //名字 }; 注意: 1.c语言中 对于枚举类型 实际上是 当作整型处理的 2.提高代码可读性, 写成枚举,可以做语法检查 3.枚举常量,之间用逗号隔开 4.枚举常量,可以给初值,给了初值之后&…

Renesas MCU之SCI_SPI接口驱动LCD

目录 概述 1 软硬件介绍 1.1 软件版本信息 1.2 ST7796-LCD 1.3 MCU IO与LCD PIN对应关系 2 FSP配置项目 2.1 配置项目参数 2.2 生成项目框架 3 代码实现 3.1 SPI的库函数 3.1.1 R_SCI_SPI_Open() 3.1.2 R_SCI_SPI_Read() 3.1.3 R_SCI_SPI_Write() 3.2 应用函数…

CSS函数:scale、scale3d函数的使用

CSS函数scale()主要是为了实现元素的放大和缩小效果,使用的是元素的变换效果。使用的是元素的转换属性:transform的,该函数可以实现指定X轴和Y轴的放大、缩小效果。除此之外,我们还可以通过如下两种方式实现指定方向的转换&#x…

优化你的WordPress网站:内链建设与Link Whisper Pro插件的利用

文章目录 内链的重要性WordPress SEO插件:Link Whisper Pro主要功能使用指南下载与安装 结语 在数字营销和网站管理领域,SEO内部优化是提升网站排名、增加流量和提高用户参与度的核心策略。在众多SEO技巧中,内链建设是构建良好网站结构和提升…

SpringBoot定时任务+Quartz 动态调度

1、分部解释 2、完整代码 3、SpringBoot定时任务Quartz 1、动态定时任务: 动态定时任务,即定时任务的动态调度,可根据需求自由的进行任务的生成、暂停、恢复、删除和更新操作。Quartz本身没有提供动态调度的功能,需要自己根据相关的API开发。…

PostgreSQL专家(pcp51)--王丁丁

#PostgreSQL培训 #postgresql认证 #postgreSQL考试 #PG考试 #PG培训

【Linux】Linux工具——gdb

1. gdb 概述 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能…

记忆化搜索汇总

记忆化搜索简介 记忆化搜索(Memoization Search):是一种通过存储已经遍历过的状态信息,从而避免对同一状态重复遍历的搜索算法。 记忆化搜索是动态规划的一种实现方式。在记忆化搜索中,当算法需要计算某个子问题的结果…

面试题------>MySQL!!!

一、连接查询 ①:左连接left join (小表在左,大表在右) ②:右连接right join(小表在右,大表在左) 二、聚合函数 SQL 中提供的聚合函数可以用来统计、求和、求最值等等 COUNT&…

Docker配置 之 本地仓库web访问

介绍 Docker是一种开源的应用容器引擎。 Docker可以让开发者打包应用以及依赖包到一个可移植的容器中,然后发布到任何安装了Docker引擎的服务器上(包括Linux机器、Windows机器),也可以实现虚拟化。容器是完全使用沙箱机制&#…

【javaEE初阶】

🌈🌈🌈关于java ⚡⚡⚡java的由来 我们这篇文章主要是来介绍javaEE,一般称为java企业版,实际上java的历史可以追溯到上个世纪90年代,当时主要的语言主流的还是C语言和C,但是在那个时期嵌入式初…

js 一维数组转多维数组

效果图: //源数组const arrList [{"id": 1,"code": "001","name": "第一个","parentCode": "",},{"id": 2,"code": "00101","name": "第一…

使用gradio库实现Web应用,允许用户上传图像,并使用YOLOv8模型对图像进行目标检测。

一、Gradio Gradio 详细介绍 Gradio 是一个用于构建和分享机器学习模型和数据科学应用的开源Python库。它简化了创建交互式Web界面的过程,让开发者可以快速搭建原型并与他人分享。 主要特性 易用性: 无需前端开发经验:只需几行Python代码就…