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

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

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了。

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

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

相关文章

Domino 14中安装配置使用OnTime团队日历组件

大家好,才是真的好。 在9月底发布的Domino 14 EA3中,包含了OnTime团队日历组件。OnTime是一款日历协作功能应用,侧重于团队日历,功能侧重于协作,界面较为简洁、现代等。 Domino如今越来越多地集成进合作伙伴的解决方…

Android设计模式--原型模式

一,定义 原型模式就是用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象 也就是说用户从一个实例中复制出一个内部属性一致的对象,这个被复制的对象就是原型。 原型模式多用于创建复杂的或者构造耗时的实例,因为这…

Python入门:一文详解Python列表(List)操作方法

文章目录 前言一、创建一个列表二、访问列表中的值三、更新列表四、删除列表元素六、Python列表截取七、Python列表操作的函数和方法关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②…

IntelliJ IDEA cmd和idea Terminal查看java版本不一致

参考:IntelliJ IDEA cmd和idea Terminal查看java版本不一致的解决方案 1、idea清缓存重启 没用 2、删除缓存文件 没试 3、修改环境变量的顺序 没试 4、重启电脑 麻烦,没试 5、项目配置jdk7 没试 按照这个url配置了一个遍 https://blog.csdn…

AIOT数字孪生智慧工地一体化管理平台源码

智慧工地app基于物联网和移动互联网技术,利用各类传感器及终端设备通过与云端服务器的实时数据交互,为施工现场的管理人员提供环境监测、劳务实名制管理、物料管理、巡检记录、设备管理等一系列优质高效的行业解决方案。 一、智能工地应用价值 智慧工地…

入选《人工智能领域内容榜》

2023-11-13 入选《人工智能领域内容榜》31 C# OpenCvSharp DNN HybridNets 同时处理车辆检测、可驾驶区域分割、车道线分割

并发编程产生的根本原因和C#怎么处理并发问题?

并发编程产生的根本原因和C#怎么处理并发问题? 前言 对于现在很多编程语言来说,多线程已经得到了很好的支持, 以至于我们写多线程程序简单,但是一旦遇到并发产生的问题就会各种尝试。 因为不是明白为什么会产生并发问题&#…

React Virtual DOM及Diff算法

JSX到底是什么 使用React就一定会写JSX,JSX到底是什么呢?它是一种JavaScript语法的扩展,React使用它来描述用户界面长成什么样子,虽然它看起来非常像HTML,但他确实是javaScript,在React代码执行之前&#…

Nginx 是如何解决惊群效应的?

什么是惊群效应? 第一次听到的这个名词的时候觉得很是有趣,不知道是个什么意思,总觉得又是奇怪的中文翻译导致的。 复杂的说(来源于网络)TLDR; 惊群效应(thundering herd)是指多进程&#xff…

十年软件测试老程序告诉你性能测试的左移右移到底能干嘛

常规的性能测试一般都是在测试阶段集成测试时候才开始介入,很容易测试时间不够,可不可以借鉴测试左移右移的思路,更早的介入和发现性能风险,然后在测试阶段更专注于分析优化? 借着这个问题,结合自己的实践…

孙哥Spring源码第29集

第29集 解析事务属性中的传播属性 【视频来源于:B站up主孙帅suns Spring源码视频】【微信号:suns45】 1、事务属性有哪些? 1、事务属性2、传播属性3、只读属性 设置事务为只读,提高事务运行的效率 false 4、超时属性 超时属性 通…