python数据分析——模型诊断

news2024/10/7 10:21:24

参考资料:活用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.coloradmin.cn/o/1792201.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学Python,看一篇就够

学Python,看一篇就够 python基础注释变量标识符命名规则使用变量认识bugDebug工具打断点 数据类型输出转义字符输入输入语法输入的特点 转换数据类型pycharm交互运算符的分类赋值运算符复合赋值运算符比较运算符逻辑运算符拓展 条件语句单分支语法多分支语法拓展 if…

JavaScript 学习笔记 总结

回顾: Web页面标准 页面结构:HTML4、HTML5页面外观和布局:CSS页面行为:JavaScript强调三者的分离前后端分离开发模式 响应式设计Bootstrap框架入门 Bootstrap总结 基础 下载和使用基础样式:文本样式、图片样式、表格…

模式识别涉及的常用算法

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

SpringBoot定时任务+Quartz 动态调度

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

Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:美团小袋自动配送车

大型电商公司美团已选用NVIDIA Jetson AGX Xavier 平台,作为无人配送机器人核心AI算力。 美团点评是全球大型的按需食品配送公司,结合了Uber Eats、Yelp和Groupon的商业模式,与超过40万家本地企业开展合作。他们推出了小袋自动配送车&#…

Hive3.1.2分区与排序(内置函数)

Hive3.1.2分区与排序(内置函数) 1、Hive分区(十分重要!!) 分区的目的:避免全表扫描,加快查询速度! 在大数据中,最常见的一种思想就是分治,我们可以把大的文件切割划分成…

【InternLM实战营第二期笔记】05:LMDeploy 量化部署 LLM 实践

文章目录 课程背景常见部署方法LMDeploy安装、部署、量化量化默认比例 KV cachecache-max-entry-count0.5cache-max-entry-count0.014bit 量化 Serve a model启动服务链接 API 服务器网页客户端访问服务器 API 代码集成Python 代码运行 1.8B 模型向 TurboMind 后端传递参数 拓展…

AOP案例

黑马程序员JavaWeb开发教程 文章目录 一、案例1.1 案例1.2 步骤1.2.1 准备1.2.2 编码 一、案例 1.1 案例 将之前案例中增、删、改相关节后的操作日志记录到数据库表中。 操作日志:日志信息包含:操作人、操作时间、执行方法的全类名、执行方法名、方法…

苍穹外卖笔记-02-借助小乌龟创建gitee仓库,apifox代替YApi,Swagger

TOC 1 借助小乌龟创建gitee苍穹外卖仓库 这里建议看视频bilibili比特鹏哥视频 使用软件 git TortoiseGit https://git-scm.com/downloads https://tortoisegit.org/ 使用代码托管平台gitee,git的使用和gitee的账号创建需要查询其他资料 在一个从未克隆仓库的…

yolov8-obb 旋转目标检测 瑞芯微RKNN芯片部署、地平线Horizon芯片部署、TensorRT部署

特别说明:参考官方开源的yolov8代码、瑞芯微官方文档、地平线的官方文档,如有侵权告知删,谢谢。 模型和完整仿真测试代码,放在github上参考链接 模型和代码。 折腾旋转目标检测的小伙伴们看过来,yolov8旋转目标检测部署…

ShowDoc item_id 未授权SQL注入漏洞复现

0x01 产品简介 ShowDoc 是一个开源的在线文档协作平台,它支持Markdown、图片等多种格式,方便团队成员共同编辑和分享文档。企业常见使用场景是使用其进行接口文档、内部知识库管理。 0x02 漏洞概述 2024年6月,ShowDoc官方发布新版本修复了一个SQL注入漏洞。鉴于该漏洞无前…

速通数据挖掘课程

速通 数据挖掘课程 大的分类 标签预测(分类) 和 数值预测(预测呀) 监督 非监督 是否 需要预先训练模型 然后预测 聚类:拿一个比一个,看看相似否,然后归一类 数据四种类型 数据属性有四种&…

C++实现,简单的命令行交互框架

目录 背景背景 在实际开发中,经常需要有对端测试程序,配合自己的程序,验证功能、逻辑等。面对繁杂、多变的需求,如果对端程序设计得不够灵活,则无法提升工作效率,如果能够与对端程序交互,通过命令行输入命令的方式完成测试验证,将大大提升工作效率,下面的示例程序是一…

weak的底层原理

weak 引用在 iOS 中通过维护一个全局的弱引用表来实现。当弱引用的对象被释放时,所有指向它的弱引用会被自动置为 nil,从而防止悬挂指针。 弱引用表(Weak Table)的键和值 理解弱引用表的键和值对于理解 weak 引用的底层机制非常重…

酱菜产业:传承美味,点亮生活

酱菜,这道深受人们喜爱的传统美食,以其独特的风味和营养价值,点亮了我们的日常生活。酱菜产业作为美食文化的重要组成部分,正以其独特的魅力,吸引着越来越多的消费者。 酱菜产业的赵总说:酱菜的制作过程&am…

Nginx网站服务【☆☆☆】

市面上常用Linux的web服务器:apache、Nginx。 apache与nginx的区别? 最核心的区别在于NGINX采用异步非阻塞机制,多个连接可以对应一个进程;apache采用的是同步阻塞多进程/线程模型,一个连接对应一个进程。apache美国…

【C语言】一节课拿捏---动态内存分配

谢谢观看!希望以下内容帮助到了你,对你起到作用的话,可以一键三连加关注!你们的支持是我更新地动力。 因作者水平有限,有错误还请指出,多多包涵,谢谢! 目录 一、 为什么要有动态内存…

关于IDEA创建Maven一直爆红无法下载的问题

你能看到这我就知道你肯定已经试过了网上的很多方法了,我之前也是,试过了很多一直无法正常下载,我也是找人给 线下看了看解决了,我总结一下从头到尾排除问题,试到最后要是还解决不了你直接私信我,我给你看看…

vue3+uniapp

1.页面滚动 2.图片懒加载 3.安全区域 4.返回顶部,刷新页面 5.grid布局 place-self: center; 6.模糊效果 7.缩放 8.微信小程序联系客服 9.拨打电话 10.穿透 11.盒子宽度 12.一般文字以及盒子阴影 13.选中文字 14.顶部安全距离 15.onLoad周期函数在setup语法糖执行后…

微信小程序-案例:本地生活-首页(不使用网络数据请求)

一、 1.页面效果: 二、 1.新建项目并添加页面 在app.json文件中: "pages": ["pages/home/home","pages/message/message","pages/contact/contact"] 2.配置导航栏效果 在app.json文件中: &quo…