基于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

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

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

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

相关文章

【vocabulary in use (elementary)】6 Health and Illness

very well / fine 很好 ill sick 生病 I feel terrible 感觉很差 headache 头疼 toothache 牙疼 dentist medicine 药 pills 片药 caps 胶囊 aspirin 阿司匹林 antibiotic 抗生素 vitamin 维生素 painkiller 止痛药 dentist 牙医 got a cold 感冒 for many years 很多年 all th…

Channel Messaging API 的使用

Channel Messaging API 是HTML5中引入的一种高级通信机制,它允许在Web Workers之间,以及Web Workers与主线程之间建立高效、安全的双向通信通道。这一API特别适用于需要频繁交换数据或维持长期通信的场景,提高了Web应用的性能和灵活性。 基础…

中英双语介绍美国的州:印第安纳州(Indiana)

中文版 印第安纳州简介 印第安纳州位于美国中西部地区,是一个以其农业、制造业和体育文化而著称的州。以下是对印第安纳州的详细介绍,包括其地理位置、人口、经济、教育、文化和主要城市。 地理位置 印第安纳州东临俄亥俄州,北接密歇根州…

白骑士的Python教学高级篇 3.1 多线程与多进程

系列目录 上一篇:白骑士的Python教学进阶篇 2.4 高级数据结构 在现代编程中,提升程序性能和处理能力的常见方法之一是并发编程,通过同时执行多个任务来提高效率。Python中主要有两种并发方式:多线程和多进程。理解它们的概念、差…

数据集成面试题

Flume 一、flume组成 --Agent Flume的部署单元,本质上是一个JVM进程,Agent主要由Source、Channel、Sink三个部分组成 --Source 收集数据,以event为单元进行封装发送给channel 参数配置:当采集速度比较慢,调整batchSize参数&…

IOS Swift 从入门到精通:写入 Firestore数据库

文章目录 FirestoreManager 类创建文档更新文档更新 Firestore 权限规则现在,我们想要在 Firestore 中添加或更新文档。如果您还没有,我建议您阅读有关设置 Firebase Auth 和从 Firestore 读取的部分。您必须在应用程序中启用 Firebase,并在项目中启用 Firestore 数据库,才…

【IT专业入门,高考假期预习指南】高考后的IT征途:启航前的准备与策略

IT专业入门,高考假期预习指南 七月来临,各省高考分数已揭榜完成。而高考的完结并不意味着学习的结束,而是新旅程的开始。对于有志于踏入IT领域的高考少年们,这个假期是开启探索IT世界的绝佳时机。作为该领域的前行者和经验前辈&a…

Java中的分布式事务管理

Java中的分布式事务管理 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨Java中的分布式事务管理,这是在现代大规模应用中必须解决…

【SkiaSharp绘图14】SKCanvas方法详解(三)URL注释、按顶点绘制、 是否裁切区域之外、旋转、缩放、倾斜、平移、保存/恢复画布

文章目录 SKCanvas方法DrawUrlAnnotation 绘制URL注释DrawVertices 按顶点绘制Flush 立即绘制QuickReject 判断区域是否在裁切区域之外ResetMatrix重置矩阵Restore、RestoreToCountRotateDegrees按角度旋转画布RotateRadians按弧度旋转画布SaveLayer保存并新建图层Scale 缩放画…

Python协作运动机器人刚体力学解耦模型

🎯要点 🎯腿式或固定式机器人模型 | 🎯网格、点云和体素网格碰撞检测 | 🎯正反向运动学和动力学 | 🎯机器人刚体力学计算 | 🎯编辑参考系姿势和路径 | 🎯软件接口实体机器人模拟 | &#x1f3a…

使用shell脚本进行clang-tidy静态代码分析

文章目录 0. 引言1. 完整检测脚本代码 clang-tidy-check.sh1.1 流程图1.2 脚本功能概述 2. 该脚本优缺点 0. 引言 clang-tidy 是基于 Clang 的工具,提供了丰富的代码检查功能,可以根据用户配置文件进行定制化的检查和规则定义。 之前的文章《使用 Clang…

分子AI预测赛Task2笔记

下面所述比较官方的内容都来自官方文档 ‍‌⁠‌‍​​​‌​​⁠​​​​​​​​‍‬​​‍⁠‍‍​​‬​‌​​​‌‍‬​​​​​​‍‌Task2:赛题深入解析 - 飞书云文档 (feishu.cn) 赛题背景 强调了人工智能在科研领域&…

WebDriver API

WebDriver API 是一组允许程序控制和自动化Web浏览器的接口,它是Selenium框架的一部分。Selenium 是一个广泛使用的开源自动化测试工具,用于Web应用程序的自动化测试。WebDriver API 提供了与浏览器进行交互的能力,支持多种浏览器&#xff0c…

苹果电脑废纸篓数据被清空了,有什么方法可以恢复吗?

使用电脑的用户都知道,被删除的文件一般都会经过回收站,想要恢复它直接点击“还原”就可以恢复到原始位置。mac电脑同理也是这样,但是“回收站”在mac电脑显示为“废纸篓”。 苹果电脑废纸篓数据被清空了,有什么方法可以恢复吗&am…

java反射和注解

反射 获取class对象的三种方法 ①:Class.forName("全类名"); ②:类名.class ③:对象.getclass(); 代码样例 package com.ithema;public class Main {public static void main(String[] args) throws ClassNotFoundException {//第…

基于Canvas的Html5多时区动态时钟实战

目录 前言 一、关于Canvas技术 1、Canvas是什么 2、Canvas的属性及渲染特性 二、Canvas动态多时区展示 1、新建html页面 2、创建Canvas对象 3、绘制所有的时钟 总结 前言 出差旅行相信大家一定会住酒店,大家在酒店的前台进行预订的时候,是不是都…

centos执行yum相关命令报错的可能原因

文章目录 1. 执行yum命令是报下面一大帕拉2. 安装某个包报错,找不到这个包 1. 执行yum命令是报下面一大帕拉 最后一行报错,在repo文件中找不到空baseurl:xxx / x86_64 执行这行命令把这个找不到的 xxx 禁掉即可sudo yum-config-manager --di…

【项目日记(三)】搜索引擎-搜索模块

❣博主主页: 33的博客❣ ▶️文章专栏分类:项目日记◀️ 🚚我的代码仓库: 33的代码仓库🚚 🫵🫵🫵关注我带你了解更多项目内容 目录 1.前言2.项目回顾3.搜索流程3.1分词3.2触发3.3去重3.4排序3.5包装 4.总结 1.前言 在前…

Qt的源码目录集合(V5.12.12版本)

目录 1.QObject实现源码 2.qml中的ListModel实现源码 3.qml中的JS运行时的环境和数据类型源码 1.QObject实现源码 .\Qt\Qt5.12.12\5.12.12\Src\qtbase\src\corelib\kernel\qobject.h .\Qt\Qt5.12.12\5.12.12\Src\qtbase\src\corelib\kernel\qobject.cpp .\Qt\Qt5.12.12\5…

虚拟机USB——解决每次插U盘都得选择连接到主机还是虚拟机问题

虚拟机USB——解决每次插U盘都得选择连接到主机还是虚拟机问题 1.编辑–>首选项–> 2.如果想每次插U盘都连接到主机就选“将设备连接到主机” 如果想每次插U盘都进行选择,就选择“询问要执行的操作”