基于python的随机森林回归预测+贝叶斯优化超参数前后训练效果对比

news2024/11/20 4:30:30

目录

1.导入必要的库

2.导入数据与数据预处理

3.查看数据分布

4.特征选择

5.模型建立与训练

6.训练集预测结果

7.模型评估

8.预测新数据

9.贝叶斯优化超参数

1.导入必要的库

# 导入所需的库 
from sklearn.model_selection import cross_val_score
import pandas as pd  
import numpy as np  
from sklearn.model_selection import train_test_split  
from sklearn.ensemble import RandomForestRegressor  
from sklearn.feature_selection import SelectKBest, f_regression  
from sklearn.metrics import mean_squared_error, r2_score  
from bayes_opt import BayesianOptimization  
import matplotlib.pyplot as plt  

2.导入数据与数据预处理

# 加载数据  
data = pd.read_excel('train1.xlsx')  
test_data = pd.read_excel('test1.xlsx')  
  
# 假设所有列都用于训练,除了最后一列是目标变量  
X = data.iloc[:, :-1]  
y = data.iloc[:, -1]  
  
# 如果有缺失值,可以选择填充或删除  
X.fillna(X.mean(), inplace=True)  
test_data.fillna(test_data.mean(), inplace=True)

3.查看数据分布

# 注意:distplot 在 seaborn 0.11.0+ 中已被移除  
# 你可以分别使用 histplot 和 kdeplot  
  
plt.figure(figsize=(50, 50))  
for i, feature in enumerate(data.columns, 1):  
    plt.subplot(6, int(len(data.columns)/6), i) 
    sns.histplot(data[feature], kde=True, bins=30, label=feature,color='cyan') 
    plt.title(f'QQ plot of {feature}', fontsize=40, color='black')  
    # 如果需要设置坐标轴标签的字体大小和颜色  
    plt.xlabel('X-axis Label', fontsize=35, color='black')  # 设置x轴标签的字体大小和颜色  
    plt.ylabel('Y-axis Label', fontsize=40, color='black')  # 设置y轴标签的字体大小和颜色  
  
    # 还可以调整刻度线的长度、宽度等属性  
    plt.tick_params(axis='x', labelsize=40, colors='black', length=5, width=1)  # 设置x轴刻度线、刻度标签的更多属性  
    plt.tick_params(axis='y', labelsize=40, colors='black', length=5, width=1)  # 设置y轴刻度线、刻度标签的更多属性 
plt.tight_layout() 
plt.subplots_adjust(wspace=0.2, hspace=0.3)
plt.show()

图1

4.特征选择

# 特征选择  
# 使用SelectKBest选择K个最佳特征  
selector = SelectKBest(score_func=f_regression, k=8)  # 选择8个最佳特征  
X_new = selector.fit_transform(X, y) 

5.模型建立与训练

rf = RandomForestRegressor() 
rf.fit(X_new, y)

6.训练集预测结果

y_pred = rf.predict(X_new)
plt.figure(figsize=(10, 5))  
plt.plot(y, label='Actual',c='g')
plt.plot(y_pred, label='RF Prediction',c='r') 
plt.legend()  

图2

7.模型评估

print("MSE:", mean_squared_error(y, y_pred))  
print("R2 Score:", r2_score(y, y_pred))
MSE: 1.969590155695453
R2 Score: 0.996235507229591

8.预测新数据

# 测试集预测  
test_pred = rf.predict(selector.transform(test_data))
# 测试集预测结果可视化  
plt.figure(figsize=(12, 6))  
plt.plot(test_pred, label='RF Test Prediction',c='black') 
plt.legend()  

图3

9.贝叶斯优化超参数

# 导入所需的库 
from sklearn.model_selection import cross_val_score
import pandas as pd  
import numpy as np  
from sklearn.model_selection import train_test_split  
from sklearn.ensemble import RandomForestRegressor  
from sklearn.feature_selection import SelectKBest, f_regression  
from sklearn.metrics import mean_squared_error, r2_score  
from bayes_opt import BayesianOptimization  
import matplotlib.pyplot as plt 
# 加载数据  
data = pd.read_excel('train1.xlsx')  
test_data = pd.read_excel('test1.xlsx')  
  
# 假设所有列都用于训练,除了最后一列是目标变量  
X = data.iloc[:, :-1]  
y = data.iloc[:, -1]  
  
# 如果有缺失值,可以选择填充或删除  
X.fillna(X.mean(), inplace=True)  
test_data.fillna(test_data.mean(), inplace=True)
# 特征选择  
# 使用SelectKBest选择K个最佳特征  
selector = SelectKBest(score_func=f_regression, k=8)  # 假设选择8个最佳特征  
X_new = selector.fit_transform(X, y)  
  
# 定义随机森林模型  
def rf_model(n_estimators, max_depth, min_samples_split, min_samples_leaf, random_state):  
    model = RandomForestRegressor(n_estimators=int(n_estimators),  
                                  max_depth=int(max_depth),  
                                  min_samples_split=int(min_samples_split),  
                                  min_samples_leaf=int(min_samples_leaf),  
                                  random_state=int(random_state))  
    return model  
  
# 使用贝叶斯优化进行超参数调优  
def rf_evaluate(n_estimators, max_depth, min_samples_split, min_samples_leaf, random_state):  
    model = rf_model(n_estimators, max_depth, min_samples_split, min_samples_leaf, random_state)  
    scores = -cross_val_score(model, X_new, y, cv=5, scoring='neg_mean_squared_error').mean()  
    return scores  
  
rf_bo = BayesianOptimization(rf_evaluate, {  
    'n_estimators': (100, 300),  
    'max_depth': (5, 30),  
    'min_samples_split': (2, 10),  
    'min_samples_leaf': (1, 5),  
    'random_state': (0, 100)  
})  
  
# 执行优化过程  
rf_bo.maximize(init_points=5, n_iter=3)  
  
# 根据最优超参数训练模型  
best_rf = rf_model(rf_bo.max['params']['n_estimators'],  
                   rf_bo.max['params']['max_depth'],  
                   rf_bo.max['params']['min_samples_split'],  
                   rf_bo.max['params']['min_samples_leaf'],  
                   rf_bo.max['params']['random_state'])  
best_rf.fit(X_new, y)  
  
# 未优化的随机森林模型  
unoptimized_rf = RandomForestRegressor()  
unoptimized_rf.fit(X_new, y)  
  
# 进行预测  
y_pred = unoptimized_rf.predict(X_new)  
y_pred_best = best_rf.predict(X_new)  
  
# 测试集预测  
test_pred = unoptimized_rf.predict(selector.transform(test_data))  
test_pred_best = best_rf.predict(selector.transform(test_data))  
  
# 可视化预测结果  
plt.figure(figsize=(10, 5))  
plt.plot(y, label='Actual')  
plt.plot(y_pred, label='Unoptimized RF Prediction')  
plt.plot(y_pred_best, label='Optimized RF Prediction')  
plt.legend()  
plt.show()  
  
# 测试集预测结果可视化  
plt.figure(figsize=(10, 5))  
plt.plot(test_pred, label='Unoptimized RF Test Prediction')  
plt.plot(test_pred_best, label='Optimized RF Test Prediction')  
plt.legend()  
plt.show()  
  
# 评估模型  
print("未优化的随机森林:")  
print("MSE:", mean_squared_error(y, y_pred))  
print("R2 Score:", r2_score(y, y_pred))  
  
print("\n优化的随机森林:")  
print("MSE:", mean_squared_error(y, y_pred_best))  
print("R2 Score:", r2_score(y, y_pred_best))

图4

        从结果上看,优化了个寂寞,这和本身随机森林训练效果就好迭代次数较少有直接关系。

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

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

相关文章

【聊聊原子性,中断,以及nodejs中的具体示例】

什么是原子性 从一个例子说起, x ,读和写 , 如图假设多线程,线程1和线程2同时操作变量x,进行x的操作,那么由于写的过程中,都会先读一份x数据到cpu的寄存器中,所以这个时候cpu1 和 c…

Michael.W基于Foundry精读Openzeppelin第61期——ERC1967Upgrade.sol

Michael.W基于Foundry精读Openzeppelin第61期——ERC1967Upgrade.sol 0. 版本0.1 ERC1967Upgrade.sol 1. 目标合约2. 代码精读2.1 _getImplementation() internal && _upgradeTo(address newImplementation) internal2.2 _upgradeToAndCall(address newImplementation,…

11--ElasticStack7-ELK+Kafka

前言:日志分析管理平台对于平时的规模化运维占的权重非常大,这一章涉及的程序较多,会将每个程序的基础使用和模块分开梳理,基础概念会分布在每小节开头,最后串联成一个完整的工作环境。 1、ELK架构 ELK 是一个非常流…

基于机器学习的永磁同步电机矢量控制策略-高分资源-下载可用!

基于机器学习的永磁同步电机矢量控制策略 优势 训练了RL-Agent,能够提高电机在非线性负载下的性能。 部分程序 仿真结果 转矩估计及dq轴电流。 代码有偿,50,需要的可以联系。

【STM32HAL库学习】通信方式:USART、IIC、SPI

通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统 通信接口区别 名称引脚双工时钟电平设备USARTTX、RX全双工异步单端点对点I2CSCL、SDA半双工同步单端多设备SPISCLK、MOSI、MISO、CS全双工同步单端多设备CANCAN_H、CAN_L半双工异步差分多设…

【antd + vue】表格行合并,同时使用插槽

一、需求说明 表格中,如果一个学校有多个考试科目,则分行展示,其余列,则合并为一行展示,如图所示 二、需求分析 1、表格行合并 相当于有4行,其中1、2行是同一个学校包含不同考试科目及对应人次的数据&am…

COB封装的LED显示屏是什么?

COB(Chip on Board)封装的LED显示屏,是一种采用先进倒装COB封装技术的显示屏,其中LED芯片是直接被安装并封装在PCB电路板上,而不是先对单个封装再焊接至电路板,与SMD(Surface Mount Device&…

Java知识点整理 18 — Lambda表达式

一. 简介 Lambda 表达式是函数式编程思想的体现,强调做什么,而不是以什么方式去做。 面向对象编程思想强调的是对象,必须通过对象的形式来做一些事情。比如多线程执行任务,需要创建对象,对象需要实现指定接口&#x…

【吴恩达机器学习-week2】可选实验:使用 Scikit-Learn 进行线性回归

支持我的工作 🎉 📃亲爱的朋友们,感谢你们一直以来对我的关注和支持! 💪🏻 为了提供更优质的内容和更有趣的创作,我付出了大量的时间和精力。如果你觉得我的内容对你有帮助或带来了欢乐&#xf…

看完这篇文章你就知道什么是未来软件开发的方向了!即生成式AI在软件开发领域的革新=CodeFlying

从最早的UGC(用户生成内容)到PGC(专业生成内容)再到AIGC(人工智能生成内容)体现了web1.0→web2.0→web3.0的发展历程。 毫无疑问UGC已经成为了当前拥有群体数量最大的内容生产方式。 同时随着人工智能技术…

SAP 表字段调整,表维护生成器调整

表维护生成器->已生成的对象->更改->专家模式

Linux下的wifi开发

了解什么是wifi 可参考: 什么是Wi-Fi?Wi-Fi和WLAN的区别是什么? - 华为 (huawei.com) WLAN的基本元素 工作站STA(Station):支持802.11标准的终端设备。例如带无线网卡的电脑、支持WLAN的手机等。 接入点AP&…

OpenSSH RCE (CVE-2024-6387) | 附poc | 小试

Ⅰ 漏洞描述 OpenSSH 远程代码执行漏洞(CVE-2024-6387)&#xff0c;该漏洞是由于OpenSSH服务器 (sshd) 中的信号处理程序竞争问题&#xff0c;未经身份验证的攻击者可以利用此漏洞在Linux系统上以root身份执行任意代码。 Ⅱ 影响范围 8.5p1 < OpenSSH < 9.8p1 但OpenSS…

数学建模--层次分析法~~深入解读

目录 1.基本概念 &#xff08;1&#xff09;研究案例 &#xff08;2&#xff09;模型框架 &#xff08;3&#xff09;阐述说明 &#xff08;4&#xff09;注意事项 2.模型的建立和求解 &#xff08;1&#xff09;数量级的统一 &#xff08;2&#xff09;归一化处理 &am…

用Vue3和Rough.js绘制一个粗糙的3D条形图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 使用 Rough.js 和 D3.js 绘制粗糙手写风格条形图 应用场景 该代码适用于需要在 Web 应用程序中创建具有粗糙手写风格的条形图的情况。它可以用于数据可视化、信息图表或任何需要以独特和有吸引力的方式呈现数…

Java StringBuffer类和StringBuilder类

在使用 StringBuffer 类时&#xff0c;每次都会对 StringBuffer 对象本身进行操作&#xff0c;而不是生成新的对象&#xff0c;所以如果需要对字符串进行修改推荐使用 StringBuffer。 StringBuilder 类在 Java 5 中被提出&#xff0c;它和 StringBuffer 之间的最大不同在于 St…

【PYG】Cora数据集分类任务计算损失,cross_entropy为什么不能直接替换成mse_loss

cross_entropy计算误差方式&#xff0c;输入向量z为[1,2,3]&#xff0c;预测y为[1]&#xff0c;选择数为2&#xff0c;计算出一大坨e的式子为3.405&#xff0c;再用-23.405计算得到1.405MSE计算误差方式&#xff0c;输入z为[1,2,3]&#xff0c;预测向量应该是[1,0,0]&#xff0…

IAR工程目录移动报错(改变文件目录结构)

刚开始用IAR&#xff0c;记录一下。 工作中使用华大单片机&#xff0c;例程的文件目录结构太复杂了想精简一点。 1.如果原本的C文件相对工程文件&#xff08;.eww文件&#xff09;路径变化了&#xff0c;需要先打开工程&#xff0c;再将所有的.c文件右键Add添加进工程&#xf…

【Godot4.2】Godot中的贝塞尔曲线

概述 通过指定平面上的多个点&#xff0c;然后顺次连接&#xff0c;我们可以得到折线段&#xff0c;如果闭合图形&#xff0c;就可以获得多边形。通过向量旋转我们可以获得圆等特殊图形。 但是对于任意曲线&#xff0c;我们无法使用简单的方式来获取其顶点&#xff0c;好在计…

X-ObjectMount: 对象存储访问接入的新选择

XEOS 自 2017 年发布面世以来&#xff0c;历经 7 年的研发迭代&#xff0c;上个月正式发布了 XSKY SDS 6.4 版本&#xff0c;包含了最新的多站点统一命名空间能力&#xff0c;也标志了 XEOS 在对象存储领域的全方面优势和领先市场地位。 在 XSKY 过去对象存储服务历程里&#…