随机森林(RFC)实现模型优化与特征提取

2023-11-19

随机森林既可以进行分类也可以进行回归预测,这里通过随机森林(RFC)模型对汽油辛烷值RON进行特征提取与模型优化。

一、导入相关的数据库

import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier     #随机森林用于分类
from sklearn.ensemble import RandomForestRegressor       #随机森林用于回归
from sklearn.model_selection import train_test_split           #划分训练集与测试集
from sklearn import metrics    
from sklearn.metrics import r2_score              #用于模型拟合优度评估
import numpy as np 
import pandas as pd           #读取数据

二、数据预处理

2.1 读取数据

df_2=pd.read_csv("辛烷值数据.csv",encoding="gbk")
df_head()

 部分数据格式展示如下可以看到数据为83列,具体1个标签值,82个特征,,这里,产品辛烷值RON作为数据标签,其余作为特征,由于特征过多,需要对对特征进行降维提取。

 2.2 数据划分

#将数据分为训练和测试集
train_labels = df_2.iloc[:,0]          #数据标签
train_features= df_2.iloc[:,1:]        #数据特征
feature_list = list(train_features.columns)        #数据特征名称
train_features = np.array(train_features)            #格式转换
#划分训练集与测试集
train_features, test_features, train_labels, test_labels = train_test_split(train_features, train_labels, test_size = 0.25, random_state = 42)

三、模型构建

3.1构建初步随机森林模型

#构造随机森林模型
rf=RandomForestRegressor(n_estimators = 1000,oob_score = True,n_jobs = -1,random_state =42,max_features='auto',min_samples_leaf = 12)
rf.fit(train_features,train_labels)               #模型拟合
predictions= rf.predict(test_features)                 #预测
print("train r2:%.3f"%r2_score(train_labels,rf.predict(train_features)))         #评估
print("test r2:%.3f"%r2_score(test_labels,predictions))

初步构造未提取特征之前的随机森林模型,测试集与训练集结果展示如下:

可以看到,模型拟合训练集比测试集程度好,说明模型拟合程度待优化,这里通过网格搜索方法实现模型参数的优化。

3.2 GridSearch实现参数调优

from sklearn.model_selection import GridSearchCV
#GridSearch网格搜索 进行参数调优
rfc=RandomForestRegressor()
param = {"n_estimators": range(1,20),"min_samples_leaf": range(1,20)}     #要调优的参数
gs = GridSearchCV(estimator=rfc,param_grid=param,cv=5)
gs.fit(train_features,train_labels)                  #调优拟合

参数调优后就是进行模型最优参数导出

#导出调参后最优参数
best_score=gs.best_score_
best_params=gs.best_params_
print(best_score,best_params,end='\n')

 可以看到,模型拟合分数为0.6,再次对模型进行拟合查看参数调优后的效果。

#最优参数再次进行模型评估
rf=RandomForestRegressor(n_estimators = 16,oob_score = True,n_jobs = -1,random_state =42,max_features='auto',min_samples_leaf = 1)
rf.fit(train_features,train_labels)
predictions= rf.predict(test_features)
print("train r2:%.3f"%r2_score(train_labels,rf.predict(train_features)))
print("test r2:%.3f"%r2_score(test_labels,predictions))    

 可以看到,模型的训练集拟合优度大幅度提升,测试集模型额拟合优度也有明显额提升,但幅度不大。

四、特征提取

这里影响辛烷值RON的特征很多,有82个,但并不是每个特征对辛烷值RON都有影响,特征过多在模型拟合的过程中会使得模型过于复杂,训练时间长,结果不理想,因此,需要对数据特征进行提取,选取对辛烷值RON影响程度大的特征。

4.1 获取影响辛烷值的特征重要性

importances = list(rf.feature_importances_)      #辛烷值RON影响因素的重要性
feature_importances = [(feature, round(importance, 2)) for feature, importance in zip(feature_list,importances)]     #将相关变量名称与重要性对应
feature_importances = sorted(feature_importances, key = lambda x: x[1], reverse = True)                #排序
[print('Variable: {:12} Importance: {}'.format(*pair)) for pair in feature_importances]            #输出特征影响程度详细数据

 部分特征的重要性得分展示如下

4.2 可视化

#绘图
f,ax = plt.subplots(figsize = (13,8))    #设置图片大小
x_values = list(range(len(importances)))     
plt.bar(x_values,importances, orientation = 'vertical', color = 'r',edgecolor = 'k',linewidth =0.2)    #绘制柱形图
# Tick labels for x axis
plt.xticks(x_values, feature_list, rotation='vertical',fontsize=8)      
# Axis labels and title
plt.ylabel('Importance'); plt.xlabel('Variable'); plt.title('Variable Importances');

各特征重要性柱形图展示 

 为了更加系统的看数据的影响重要性程度,这里将其做成表格形式展示

# 以二维表格形式显示
importances_df = pd.DataFrame()
importances_df["特征名称"]=feature_list
importances_df["特征重要性"]=importances
p=importances_df.sort_values("特征重要性",ascending=False)
 print(importances_df)

 

 根据需要,这里选择15个特征变量,并最终作为辛烷值RON的特征

lost_result=list(p['特征名称'][:15])                        #数据排名前15个的特征
u=df_2.loc[:,lost_result]
print(u)

将数据保存为csv格式

u.to_csv("最终提取数据变量.csv",encoding="gbk",header=True,index=False)

好啦,数据特征提取就写到这里,作为一个小白一直都在摸索的过程中,同时也记录自己每一次的学习进步,分享这些希望可以给到像我一样有需要的人,希望这些可以帮助到你,谢谢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

随机森林(RFC)实现模型优化与特征提取 的相关文章

随机推荐

  • 12个真实项目实战带你玩转Java并发编程

    这篇博客 我会总结如下内容 满满的干货 篇幅可能会很长 做好心理准备 Immutable Object 不可变对象模式 在不引入锁的条件下 能保证访问共享变量时是线程安全的 缺点是会频繁的创建变量 Guarded Suspension 保护
  • 什么是架构,架构的本质是什么

    不论是开发人员还是架构师 我们都一直在跟软件系统打交道 架构是在工作中出现最频繁的术语之一 那么 到底什么是架构 你可能有自己的答案 也有可能没有答案 对 架构 的理解需要我们不断在实践中思考 归纳 演绎 形成自己的认知 一 什么是软件架构
  • Dinic算法学至大佬,学以致用【挂上相应的题目】

    这个巨佬讲的超级厉害 学起来很快 还有优化的说呢 Dinic算法 研究总结 网络流 网络流是信息学竞赛中的常见类型 笔者刚学习了最大流Dinic算法 简单记录一下 网络流基本概念 什么是网络流 在一个有向图上选择一个源点 一个汇点 每一条边
  • 11年做安卓开发至今,我失业了,我跟CSDN的缘分

    今天来写篇自己的文章 自己工作的文章 11年毕业到现在 我彻底失业了 是真的失业了 不过失业我觉得没什么可怕 至少干了这些年 也攒下了一些生活费 至少饿不死就行了 我失业也是因为自己有业 并不害怕 从11年做开发 那个时候就边做开发 边思考
  • 学习-Java输入输出之File类之获取文件信息(1)

    任务描述 本关任务 判断给定的字符串是目录 文件路径还是其它 相关知识 File 对象既可以表示文件 又可以表示目录 下面我们来了解一下更多关于 File 对象的操作 获取文件信息常用方法 已知在C Users yy Desktop fil
  • Unity编辑器扩展——进度条显示通用方法

    在我们使用Unity编辑器扩展做一些批处理的工具时 通常会需要显示一个进度条 这样不会让Unity一直卡住不动 使得使用者不知道当前的进展 那么如何显示进度条呢 涉及的相关API有 EditorUtility ClearProgressBa
  • 运用transport tablespace进行快速oracle版本升级(9i-10g)

    运用transport tablespace进行快速oracle版本升级 9i 10g 大家可能都知道在进行oracle数据库版本升级的时候会有2种方式 1 通过dbua database upgrade assistant 2 exp i
  • 竞逐对话式AI,百度、字节各有千秋

    随着OpenAI陆续发布的ChatGPT引发了AI界热议 新一代的AI热度便开始持续走高 与此同时 以ChatGPT模型为代表的大型预训练模型的出现 也使得对话式AI的生成能力和智能水平得到了飞跃式的提升 得益于此 对话式AI的发展又开始受
  • GPIO使用( 一 )

    一 GPIO的两大功能 通用输入输出端口GPIO具有两大功能 一种是作为一个可控的端口引脚 另外一种是通过端口映射功能连接到芯片外设 最为常用的功能是 可以作为一个可控的端口引脚 配置该引脚为输入或者输出 输出功能包括强推挽输出和开漏输出两
  • Laddernet:基于UNet的医学分割多路径网络

    摘要 UNet是医学图像分割中的主流网络 以往的对于UNet网络的修改都是有一个跳跃连接的编码器和解码器组成 这种结构的信息流路径是有限的 本文提出的Laddernet 可以看成是一个由多个UNet组成的链 与原始的UNet不同 Ladde
  • 基于springboot,vue手机商城系统

    开发工具 IDEA 服务器 Tomcat9 0 jdk1 8 项目构建 maven 数据库 mysql5 7 系统分前后台 项目采用前后端分离 前端技术 vue elementUI 服务端技术 springboot mybatis plus
  • ubuntu下Gflags安装、配置、使用

    一 基础知识 1 Gflags是一种命令行解析工具 处理命令行参数的库 主要用于解析用命令行执行可执行文件时传入的参数 在gflags中flag可以分散的定义在各个文件之中 而不用定义在一起 这就意味着在我们可以在一个单独的文件中只定义这个
  • org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

    idea下Maven项目 Spring Mybatis 查询时报错 org apache ibatis binding BindingException Invalid bound statement not found 解决方案 org
  • UE4 如何使用C++代码实现 在指定范围内随机生成同一个种类的不同物品(怪物,NPC,拾取物)的 自定义蓝图

    一 引言 在游戏世界中有特别多的物品 NPC 怪物 使用UE4中的蓝图我们可以摆放这些事务 但是如何在指定范围内随机生成同一个种类的不同事物呢 这就需要UE4 实现 C 自定义 蓝图功能 二 构思 首先我们构思一下实现上诉功能 应该怎么做
  • 抖音怎么上传无损画质_抖音上传视频为什么会模糊?如何才能上传高清无损视频?...

    很多初入抖音的朋友 制作好的视频本地预览没有问题 上传视频到抖音就模糊的不行不行的 特别是竖屏 小时候的黑白电视都比它强 最近私我的小伙伴问这个问题的一定多 所以干脆写篇回答 不知道你们有没有这种情况 今天小编就为大家分析一下产生模糊视频的
  • IE Sieve, Memory Leak detector for Internet Explorer

    IE Sieve Memory Leak detector for Internet Explorer sIEve is a project to get rid of memory leaks due to some limitation
  • 7.Simulink基础建模操作——选择判决运算

    欢迎订阅 FPGA MATLAB SIMULINK系列教程 目录 1 基于Simulink的选择判决运算模块简介 2 判决运算模块建模案例1
  • IOS开发-表视图LV3导航控制器

    学到这里感觉有点难了 其实这篇文章再草稿箱里放了好久了 最近对于学习的热情下降了 这不行 抓紧学习走起 在这一章节的学习中主要针对导航控制器及表视图来建立多视图的应用 首先要了解一些概念 1 导航控制器 UINavigationContro
  • HTTP 协议中的 Transfer-Encoding

    HTTP 协议中的 Transfer Encoding 文章目录 Persistent Connection Content Length Transfer Encoding chunked 本文作为我的博客 HTTP 相关 专题新的一篇
  • 随机森林(RFC)实现模型优化与特征提取

    随机森林既可以进行分类也可以进行回归预测 这里通过随机森林 RFC 模型对汽油辛烷值RON进行特征提取与模型优化 一 导入相关的数据库 import matplotlib pyplot as plt from sklearn ensembl