【Mathematical Model】基于Python实现随机森林回归算法特征重要性评估线性拟合

        前段时间在做遥感的定量反演,所以研究了一下回归算法,由于之前发的几篇博文都是定义好基础方程进行拟合的,不太满足我的需求。所以研究了一下随机森林回归的算法,之前使用随机森林都是做分类,这次做了回归算法也算是补全了RF算法的空缺了。今天抽空给大家分享一下使用Python实现随机森林回归算法,同时将特征重要性和拟合结果进行可视化。

原创作者:RS迷途小书童

博客地址:https://blog.csdn.net/m0_56729804?type=blog

1. 需要的库

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score

2. 代码主函数

        这里其实还是调用sklearn里面的随机森林回归算法的函数,所以整体没什么难度,最后将结果使用matplotlib库进行绘制。

# -*- coding: utf-8 -*-
"""
@Time : 2023/4/2 11:31
@Auth : RS迷途小书童
@File :Random Forest Regression.py
@IDE :PyCharm
@Purpose:随机森林回归算法+特征重要性评估
@Web:博客地址:https://blog.csdn.net/m0_56729804
"""
import joblib
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']


def RF_Regression(path_excel):
    print("-----------------------------------随机森林回归分析-----------------------------------")
    print("【数据准备】正在导入数据......")
    df = pd.read_excel(path_excel)  # 读取数据
    num_columns = df.shape[1]
    x = df.iloc[:, 0:num_columns-1]  # 读取前18列为自变量
    y = df.iloc[:, num_columns-1]  # 读取第19列为因变量
    print("【数据准备】正在分割训练集和测试集......")
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)  # 以7:3划分训练样本和测试样本
    model = RandomForestRegressor(n_estimators=100, random_state=42)  # 创建模型
    #  {'max_depth': None, 'max_features': 'log2', 'min_samples_leaf': 4, 'min_samples_split': 10, 'n_estimators': 200}
    print("【模型分析】正在训练回归模型......")
    model.fit(x_train, y_train)  # 以训练样本训练模型
    print("【模型分析】正在验证模型精度......")
    y_predict = model.predict(x_test)  # 用验证集预测
    mse = mean_squared_error(y_test, y_predict)
    r2 = r2_score(y_test, y_predict)
    # 计算MSE和R-squared
    print('【评估参数】MSE:', mse)  # 线性回归的损失函数
    print('【评估参数】R-squared:', r2)  # 确定系数的取值范围为[0 1].越接近1,表明方程的变量对y的解释能力越强,这个模型对数据拟合的也较好
    print("【模型参数】特征重要性:")
    feature_importance = model.feature_importances_  # 特征的重要性分数
    for i, feature in enumerate(x.columns):
        print(" {}: {}\n".format(feature, feature_importance[i]), end='')
    print("【结果可视化】正在绘制特征重要性......")
    feature_names = x.columns.tolist()  # 获取特征的名称
    feature_importance_sort = feature_importance.argsort()  # 按照特征重要性从小到大排序的索引
    plt.subplots(figsize=(8, 6))
    plt.barh(range(len(feature_importance)), feature_importance[feature_importance_sort])  # 绘制一个水平条形图
    plt.yticks(range(len(feature_importance)), [feature_names[i] for i in feature_importance_sort], fontsize=8)
    # 设置了y轴的刻度标签。根据排序后的索引feature_ids获取对应的特征名称。font size=8设置字体大小
    plt.xlabel('Features Importance')
    plt.ylabel('Features Name')
    plt.title('Random Forest Regression Feature Importance Evaluation')
    plt.show()
    # plt.savefig('Random Forest Regression Feature Importance Evaluation', dpi=500)
    print("【结果可视化】正在精度曲线......")
    plt.subplots(figsize=(8, 6))
    plt.scatter(y_predict, y_test, alpha=0.6)
    w = np.linspace(min(y_predict), max(y_predict), 100)
    plt.plot(w, w)
    plt.xlabel('Predicted Value')
    plt.ylabel('Actual Value')
    plt.title('Random Forest Prediction')
    plt.show()
    # joblib.dump(model, 'model_RF.pkl')

3. 结果展示

4. 总结

        随机森林算法做分类和回归问题还是不错的,只不过有个缺点就是无法直接将拟合的方程展示出来,只能直接将预测结果输出。所以大家在使用时可以将训练的模型保存,这样后面分析数据的时候就又可以调用这个模型了,不然每次分析都需要将训练和预测放在一起。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信聊天记录恢复只需简单3招,快速找回聊天内容!

各种社交软件早已深深融入我们的日常生活,无论是与亲朋好友的闲聊,还是与同事伙伴的工作沟通,都离不开它们的陪伴。然而,有时由于误操作、系统更新或手机故障等原因,我们可能会不小心删除了重要的聊天记录,…

基于SSM+Jsp+Mysql的弹幕视频网站

开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包…

UVC紫外杀菌灯珠-消毒杀菌应用解决方案

随着疾病传播的频繁发生以及人们对卫生健康的重视,有效的杀菌措施,更好的消毒杀菌技术越来越重要,为此,工采网提供一系列UVC紫外杀菌灯珠产品,为客户提供适应不同功能应用的UVC杀菌方案。 UVC紫外线杀菌是一种高效、安…

在不同操作系统中搭建Python编程环境

1 在不同操作系统中搭建Python编程环境 1.1 在Linux系统中搭建Python编程环境 1. 检查Python版本 在你的系统中运行应用程序Terminal(如果你使用的是Ubuntu,可按Ctrl Alt T),打开一个终端窗口。为确定是否安装了Python&…

Netty学习——源码篇12 Netty池化内存管理机制 备份

1 PooledByteBufAllocator简述 现在来分析池化内存的分配原理。首先找到AbstractByteBufAllocator的子类PooledByteBufAllocator实现分配内存的两个方法:newDirectBuffer和newHeapBuffer方法。 public class PooledByteBufAllocator extends AbstractByteBufAlloc…

Tailwind 4.0 即将到来:前端开发的“速度与激情”

随着前端开发技术的不断进步,我们每天都在寻找更快、更简洁的解决方案来提升我们的开发效率和用户体验。今天,我要为大家介绍一项令人振奋的新技术进展——Tailwind 4.0的来临! 对于经常使用Tailwind的朋友们来说,这个消息无疑是激…

1130 - Host ‘36.161.238.56‘ is not allowed to connect to this MySQL server如何处理

1、背景 我在阿里云的ecs安装好了mysql,并且已经安装成功了,我使用navcat客户端连接自己的mysql的时候,却报错:1130 - Host 36.161.238.56 is not allowed to connect to this MySQL server 2、解决 2.1 在服务器终端使用命令行…

引脚数量最少的单片机

引脚数量最少的单片机 2款SOT23-6封装单片机介绍 参考价格 PMS150C-U06 整盘单价:0.19688,该芯片为中国台湾品牌PADAUK(应广) SQ013L-SOT23-6-TR 整盘单价:0.27876,该芯片为国产:holychip(芯圣电子) 上述价格为2024…

OSPF基础实验

一、实验拓扑 二、实验要求 1、按照图示配置IP地址 2、R1,R2,R3运行OSPF使内网互通,所有接口(公网接口除外)全部宣告进 Area 0;要求使用环回口作为Router-id 3、业务网段不允许出现协议报文 4、R4模拟互…

C++ 指针与结构

三种存取结构成员的方式: ① 通过结构变量名; ②通过指向结构的指针和间接运算符(*); ③通过指向结构的指针和指向成员运算符(->);

C++ 【桥接模式】

简单介绍 桥接模式属于 结构型模式 | 可将一个大类或一系列紧密相关的类拆分 为抽象和实现两个独立的层次结构, 从而能在开发时分别使用。 聚合关系:两个类处于不同的层次,强调了一个整体/局部的关系,当汽车对象销毁时,轮胎对象…

kettle介绍-Step之CSV Input

CSV Input/CSV 文件输入介绍 CSV 文件输入步骤主要用于将 CSV 格式的文本文件按照一定的格式输入至 流中 Step name:步骤的名称,在单一转换中,名称必须唯一Filename:指定输入 CSV 文件的名称,或通过单击右边的“浏览”按钮指定本地的 CSV …

JavaScript - 请问你是如何中断forEach循环的

难度级别:中高级及以上 提问概率:65% forEach与原始for循环不同的是,并不能通过简单的break或是return中断循环,意思就是不管需要循环的数组有多长,一旦使用了,就会将数组所有元素循环一遍才会结束。其实回答这道题,就要想到forEach的使…

【Kafka】Kafka安装、配置、使用

【Kafka】安装Kafka 1. 安装Kafka2. Kafka使用2.0 集群分发脚本xsync(重要)2.0.1 scp命令2.0.2 rsync远程同步工具2.0.3 写一个集群分发脚本xsync (Shell 脚本) 2.1 Zookeeper安装2.2 对Kafka进行分发2.2.1 执行同步脚本2.2.2 三台云主机配置Kafka环境变量 1. 安装Kafka Kafka…

java自动化-03-04java基础之数据类型举例

1、需要特殊注意的数据类型举例 1)定义float类型,赋值时需要再小数后面带f float num11.2f; System.out.println(num1);2)定义double类型,赋值时直接输入小数就可以 3)另外需要注意,float类型的精度问题…

【Spring Cloud Alibaba】9 - OpenFeign集成Sentinel实现服务降级

目录 一、简介Sentinel 是什么如何引入Sentinel 二、服务搭建1.安装Sentinel控制台1.1 下载1.2 启动1.3 访问 2.改造服务提供者cloud-provider服务2.1 引入依赖2.2 添加API2.3 添加配置文件 3.改造cloud-consumer-feign服务3.1 引入依赖3.2 添加Feign接口3.3 添加服务降级类3.4…

python 日期字符串转换为指定格式的日期

在Python编程中,日期处理是一个常见的任务。我们经常需要将日期字符串转换为Python的日期对象,以便进行日期的计算、比较或其他操作。同时,为了满足不同的需求,我们还需要将日期对象转换为指定格式的日期字符串。本文将详细介绍如…

短袖什么材质最舒服?教你夏季如何选高品质T恤

因为天气转热,不少朋友最近想挑选一些合适自己的短袖,但是因为市面上的衣服质量参差不齐,消费者总是面临着选择难题,甚至还有一些做工极差、面料闷热不透气的衣服。 所以我特别深入进行众多衣服短袖测评与对比分析,整…

HTML5+CSS3+JS小实例:圣诞按钮

实例:圣诞按钮 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0&…

Xshell连接虚拟机失败,没有ssh连接窗口

Xshell连接虚拟机失败&#xff0c;没有ssh连接窗口 连接失败的原因有很多&#xff0c;我只是记录一下我失败的原因以及改正方法 前提 本机ping虚拟机可以得到响应&#xff0c;说明ip配置没问题 问题 但是&#xff0c;在用xshell连接时&#xff0c; 在进行如图配置点击连接时…