线性模型拟合非线性数据中,如何找到最优的【分箱】数

       具体的数据可以回看上一条博客。我们先来始化三个空列表,用于存储后续计算的预测得分、交叉验证得分的平均值和交叉验证得分的方差。

pred,score,var = [], [], []

2. 再定义一个列表,包含了我们想要尝试的分箱数量。

binsrange = [2,5,10,15,20,30]

3. 设置一个for循环,对`binsrange`列表中的每个元素(即每个分箱数量)进行一次迭代。

for i in binsrange:
    #实例化分箱类
    enc = KBinsDiscretizer(n_bins=i,encode="onehot")
    #转换数据
    X_binned = enc.fit_transform(X)
    line_binned = enc.transform(line)
    #建立模型
    LinearR_ = LinearRegression()
    #全数据集上的交叉验证
    cvresult = CVS(LinearR_,X_binned,y,cv=5)
    score.append(cvresult.mean())
    var.append(cvresult.var())
    #测试数据集上的打分结果
    pred.append(LinearR_.fit(X_binned,y).score(line_binned,np.sin(line)))

再来画图:

#绘制图像
plt.figure(figsize=(6,5))
plt.plot(binsrange,pred,c="orange",label="test")
plt.plot(binsrange,score,c="k",label="full data")
plt.plot(binsrange,score+np.array(var)*0.5,c="red",linestyle="--",label = "var")
plt.plot(binsrange,score-np.array(var)*0.5,c="red",linestyle="--")
plt.legend()
plt.show()

每一行的具体注释如下:

GitHub Copilot: 这段代码的主要目的是通过改变分箱的数量,来观察线性回归模型的性能如何变化。下面是对每行代码的详细解释:
'''1. `pred,score,var = [], [], []`: 这行代码初始化了三个空列表,用于存储后续计算的预测得分、交叉验证得分的平均值和交叉验证得分的方差。

2. `binsrange = [2,5,10,15,20,30]`: 这行代码定义了一个列表,包含了我们想要尝试的分箱数量。

3. `for i in binsrange:`: 这行代码开始了一个循环,对`binsrange`列表中的每个元素(即每个分箱数量)进行一次迭代。

4. `enc = KBinsDiscretizer(n_bins=i,encode="onehot")`: 这行代码创建了一个`KBinsDiscretizer`对象,用于将连续的特征值转换为离散的"箱子"。`n_bins=i`表示分箱的数量,`encode="onehot"`表示使用one-hot编码。

5. `X_binned = enc.fit_transform(X)`: 这行代码对训练数据`X`进行分箱操作,并将结果保存在`X_binned`中。

6. `line_binned = enc.transform(line)`: 这行代码对测试数据`line`进行相同的分箱操作,并将结果保存在`line_binned`中。

7. `LinearR_ = LinearRegression()`: 这行代码创建了一个线性回归模型。

8. `cvresult = CVS(LinearR_,X_binned,y,cv=5)`: 这行代码对线性回归模型进行5折交叉验证,并将结果保存在`cvresult`中。

9. `score.append(cvresult.mean())`: 这行代码计算交叉验证得分的平均值,并将结果添加到`score`列表中。

10. `var.append(cvresult.var())`: 这行代码计算交叉验证得分的方差,并将结果添加到`var`列表中。

11. `pred.append(LinearR_.fit(X_binned,y).score(line_binned,np.sin(line)))`: 这行代码首先在分箱后的训练数据上训练线性回归模型,然后计算模型在分箱后的测试数据上的得分,并将结果添加到`pred`列表中。

12. `plt.figure(figsize=(6,5))`: 这行代码创建了一个新的图形,大小为6x5。

13. `plt.plot(binsrange,pred,c="orange",label="test")`: 这行代码绘制了测试得分随着分箱数量变化的曲线。

14. `plt.plot(binsrange,score,c="k",label="full data")`: 这行代码绘制了交叉验证得分的平均值随着分箱数量变化的曲线。

15. `plt.plot(binsrange,score+np.array(var)*0.5,c="red",linestyle="--",label = "var")`: 这行代码绘制了交叉验证得分的平均值加上方差的一半随着分箱数量变化的曲线。

16. `plt.plot(binsrange,score-np.array(var)*0.5,c="red",linestyle="--")`: 这行代码绘制了交叉验证得分的平均值减去方差的一半随着分箱数量变化的曲线。

17. `plt.legend()`: 这行代码添加了图例。

18. `plt.show()`: 这行代码显示了图形。'''

可以看到,箱子数为20时,拟合效果最好。score表示模型的预测得分的均值,而var表示这些得分的方差。通过绘制`score+np.array(var)*0.5`和`score-np.array(var)*0.5`这两条线,我们可以看到预测得分的变化范围,这可以帮助我们理解模型的预测性能的稳定性。如果这个范围较小,那么说明模型的预测性能比较稳定;如果这个范围较大,那么说明模型的预测性能有较大的波动。这两条线实际上构成了一个置信区间,它表示的是我们对模型预测得分的不确定性。这是一种常见的可视化方法,可以帮助我们更好地理解和解释模型的性能。

接下来我们看看20箱时,模型的拟合效果怎么样:

enc = KBinsDiscretizer(n_bins=20,encode="onehot")
X_binned = enc.fit_transform(X)
line_binned = enc.transform(line)

fig, ax2 = plt.subplots(1,figsize=(5,4))

LinearR_ = LinearRegression().fit(X_binned, y)
print(LinearR_.score(line_binned,np.sin(line)))
TreeR_ = DecisionTreeRegressor(random_state=0).fit(X_binned, y)

ax2.plot(line #横坐标
         , LinearR_.predict(line_binned) #分箱后的特征矩阵的结果
         , linewidth=2
         , color='green'
         , linestyle='-'
         , label='linear regression')
ax2.plot(line, TreeR_.predict(line_binned), linewidth=2, color='red',
         linestyle=':', label='decision tree')
ax2.vlines(enc.bin_edges_[0], *plt.gca().get_ylim(), linewidth=1, alpha=.2)
ax2.plot(X[:, 0], y, 'o', c='k')
ax2.legend(loc="best")
ax2.set_xlabel("Input feature")
ax2.set_title("Result after discretization")
plt.tight_layout()
plt.show()

可以看到模型非常接近正弦曲线,且R2 = 0.94,已经很接近1了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL学习day02

一、SQL通用语法 1)SQL语句可以单行或多行书写,以分号结尾 2)SQL语句可以使用空格/缩进来增强语句的可读性 3)MySQL数据库的SQL语句不区分大小写,关键字建议使用大写 4)注释: a)单行注释&#x…

深度学习+opencv+python实现昆虫识别 -图像识别 昆虫识别 计算机竞赛

文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数:2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 4 MobileNetV2网络5 损失函数softmax 交叉熵5.1 softmax函数5.2 交叉熵损失函数 6 优化器SGD7 学…

【软考篇】中级软件设计师 第一部分

中级软件设计师 第一部分 一. 计算机硬件1.1 运算器1.2 控制器 二. 数据的进制2.1 数的表示2.2 数的编码方式2.2.1 数据运算用补码运算 2.3 码制的取值范围2.3.1 例题一 三. 浮点的表示3.1 浮点数运算 四. 运算符五. 校验码5.1 海明校验码 六. 计算机指令6.1 计算机体系结构分类…

【unity插件】UGUI的粒子效果(UI粒子)—— Particle Effect For UGUI (UI Particle)

文章目录 前言插件地址描述特征Demo 演示如何玩演示对于 Unity 2019.1 或更高版本对于 Unity 2018.4 或更早版本 用法基本上是用法使用您现有的 ParticleSystem 预制件带 Mask 或 RectMask2D 组件脚本用法UIParticleAttractor 组件开发说明常见问题解答:为什么我的粒…

MySQL--MHA高可用

MHA相关知识 1.什么是MHA MHA(MasterHigh Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件MHA 的出现就是解决MySQL 单点故障的问题。目的:MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。MH…

Vue3:父组件向子组件传值(Props)

背景 在Vue3项目里,页面A(在views文件夹里)需要读取某个接口的数据,而页面A引入的组件a(在components文件夹里)也需要读取该接口的数据为了避免重复读取数据从而造成资源浪费,可以利用传值来实…

YOLO目标检测——苹果缺陷检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用:苹果质量检测和自动化分拣系统数据集说明:苹果缺陷检测数据集,真实场景的高质量图片数据,数据场景丰富,含有缺陷图片和没缺陷图片。标签说明:使用lableimg标注软件标注,标注框质量…

快速掌握华为VRP系统的CLI管理技巧,让你轻松玩转命令行!

华为VRP基础 基本概述 VRP(通用路由平台) 系统软件:.cc 配置文件:.cfg,.zip,.dat 补丁文件:.pat paf文件:.bin 设备初始化: 设备管理方式: WEB网管:配置与设备同网段IP地址,使用浏览…

发疯买了200片51,我能做点什么?

发疯买了200片51,我能做点什么? 对于电子元件我喜欢以5个作为一个基数,因为考虑的焊接失误,烧冒烟等等因素,5个芯片也足以出一套方案样机。有时候遇到网上芯片做活动,也会屯一点,一般不超过4个基数。pcb和…

Django(五、视图层)

文章目录 一、视图层1.视图函数返回值的问题2.三板斧的使用结论:在视图文件中写视图函数的时候不能没有返回值,默认返回的是None,但是页面上会报错,用来处理请求的视图函数都必须返回httpResponse对象。 二、JsonReponse序列化类的…

Elasticsearch 面试题

文章目录 Elasticsearch 读取数据您能解释一下 X-Pack for Elasticsearch 的功能和重要性吗?Elasticsearch 中的节点(比如共 20 个),其中的 10 个选了 一个master,另外 10 个选了另一个 master,怎么办&…

信息系统项目管理师(第四版)教材精读思维导图-第十五章到二十四章

请参阅我的另一篇文章,综合介绍软考高项: 信息系统项目管理师(软考高项)备考总结_计算机技术与软件专业技术_铭记北宸的博客-CSDN博客 ​ 思维导图源文件下载链接: 十五章风险管理 十六章采购管理 十七章干系人管理…

2023年【陕西省安全员C证】新版试题及陕西省安全员C证考试试卷

题库来源:安全生产模拟考试一点通公众号小程序 2023年陕西省安全员C证新版试题为正在备考陕西省安全员C证操作证的学员准备的理论考试专题,每个月更新的陕西省安全员C证考试试卷祝您顺利通过陕西省安全员C证考试。 1、【多选题】下列关于安全帽&#xf…

【数据结构 | 链表】leetcode 2. 两数相加

个人主页:兜里游客棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里游客棉花糖 原创 收录于专栏【LeetCode】 原题链接:点击直接跳转到该题目 目录 题目描述解题代码 题目描述 给你两个 非空 的链表,表示两个非…

【Python3】【力扣题】263. 丑数

【力扣题】题目描述: 此题:正整数n,能被2或3或5整除,且不断除以2或3或5最终的数是1。 【Python3】代码: 1、解题思路:递归。 知识点:递归:函数中调用函数自身(必须有退…

解决:element ui表格表头自定义输入框单元格el-input不能输入问题

表格表头如图所示&#xff0c;有 40-45&#xff0c;45-50 数据&#xff0c;且以输入框形式呈现&#xff0c;现想修改其数据或点击右侧加号增加新数据编辑。结果不能输入&#xff0c;部分代码如下 <template v-if"columnData.length > 0"><el-table-colu…

【左程云算法全讲10】打表技巧和矩阵处理技巧

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于左程云算法课程进行的&#xff0c;每个知识点的修正和深入主要参考…

【LeetCode刷题-双指针】--80.删除有序数组中的重复项II

80.删除有序数组中的重复项II 方法&#xff1a;双指针 因为给定数组是有序的&#xff0c;所以相同元素必然连续&#xff0c;使用双指针解决&#xff0c;遍历数组检查每一个元素是否应该被保留&#xff0c;如果应该保留&#xff0c;就将其移动到指定位置。我们定义两个指针slow…

Python实现扫雷游戏,代码示例,边玩边学+回忆童年!

文章目录 前言实现总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 前言 扫雷是一款益智类小游戏&#xff0…

使用vue2实现todolist待办事项

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…