当前位置: 首页 > news >正文

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

目录

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

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

相关文章:

  • 1.k8s:架构,组件,基础概念
  • 和小红书一起参会! 了解大模型与大数据融合的技术趋势
  • 后台运行大师:HarmonyOS 3.0中如何轻松设置APP常驻后台
  • 左耳听风_030_29_推荐阅读分布式数据调度相关论文
  • Vue.js有哪些优点和缺点
  • Redis-实战篇-什么是缓存-添加redis缓存
  • 安卓应用开发学习:通过腾讯地图SDK实现定位功能
  • 在Spring Boot项目中引入本地JAR包的步骤和配置
  • 【SkiaSharp绘图14】SKCanvas方法详解(三)URL注释、按顶点绘制、 是否裁切区域之外、旋转、缩放、倾斜、平移、保存/恢复画布
  • Linux_fileio实现copy文件
  • RK3568平台(USB篇)USB HID设备
  • 【文件上传】
  • Linux CentOS 环境 MySQL 主从复制集群搭建
  • 电信NR零流量小区处理
  • java 操作 milvus 2.1.4
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 10个确保微服务与容器安全的最佳实践
  • bearychat的java client
  • DOM的那些事
  • Effective Java 笔记(一)
  • github指令
  • js
  • Python - 闭包Closure
  • SpiderData 2019年2月16日 DApp数据排行榜
  • Theano - 导数
  • vuex 笔记整理
  • windows下如何用phpstorm同步测试服务器
  • 对象管理器(defineProperty)学习笔记
  • 如何进阶一名有竞争力的程序员?
  • 数组大概知多少
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • raise 与 raise ... from 的区别
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #07【面试问题整理】嵌入式软件工程师
  • #HarmonyOS:基础语法
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (06)金属布线——为半导体注入生命的连接
  • (2.2w字)前端单元测试之Jest详解篇
  • (2015)JS ES6 必知的十个 特性
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (函数)颠倒字符串顺序(C语言)
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (强烈推荐)移动端音视频从零到上手(上)
  • (三分钟)速览传统边缘检测算子
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .Net Core 中间件验签
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • @Autowired注解的实现原理