首页 > 编程语言 >【Mathematical Model】基于Python实现随机森林回归算法&特征重要性评估&线性拟合

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

时间:2024-04-06 11:33:30浏览次数:22  
标签:Mathematical plt Python feature test print import Model importance

        前段时间在做遥感的定量反演,所以研究了一下回归算法,由于之前发的几篇博文都是定义好基础方程进行拟合的,不太满足我的需求。所以研究了一下随机森林回归的算法,之前使用随机森林都是做分类,这次做了回归算法也算是补全了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. 总结

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

标签:Mathematical,plt,Python,feature,test,print,import,Model,importance
From: https://www.cnblogs.com/RSran/p/18117273

相关文章

  • 【个人笔记】如何用 Python 编写激活码解锁程序
    目录前言第一步:编写激活码解锁程序(激活码.py)第二步:修改需要解锁的程序(1.py) 总结前言在软件开发中,有时候我们需要设计一种机制来保护程序,例如通过激活码来控制程序的使用权限。本文将介绍如何使用Python编写一个简单的激活码解锁程序,以及如何修改另一个程序来检测是否......
  • 【Python&RS】基于GDAL遥感影像分幅裁剪(固定尺寸)
    ​    之前分享过一篇分幅裁剪的文章:【Python&RS】基于GDAL遥感影像分幅裁剪,只不过这篇文章当时编写的逻辑是自己输入需要裁剪多少行多少列,由于大家可能并没有直观地希望自己裁剪多少行列,所以非常局限。今天跟大家分享一下使用固定尺寸对遥感影像进行分幅裁剪,即每张裁剪......
  • 华为OD机试 - 猴子爬山(Java & JS & Python & C & C++)
    须知哈喽,本题库完全免费,收费是为了防止被爬,大家订阅专栏后可以私信联系退款。感谢支持文章目录须知题目描述输入描述输出描述用例解题思路:Java代码:JS代码:Python代码:C代码:C++代码:题目描述一天一只顽猴想去从山脚爬到山顶,途中经过一个有个N个台......
  • 华为OD机试 - 火星文计算(Java & JS & Python & C & C++)
    须知哈喽,本题库完全免费,收费是为了防止被爬,大家订阅专栏后可以私信联系退款。感谢支持文章目录须知题目描述输入描述输出描述用例解题思路:Java代码:JS代码:Python代码:C代码:C++代码:题目描述已知火星人使用的运算符为#、$,其与地球人的等价公式如下......
  • Python中的iif语句这样用(使用三元表达式替代if-else语句)
    #使用三元表达式替代if-else语句scope=n.name.startswith("'")and'工作表'or'工作簿'#ifn.name.startswith("'"):#scope='工作表'#else:#scope='......
  • 1.4Python环境安装
    1、安装包的下载进入Python官网:WelcometoPython.org以win系统64位为例,下载安装包:Python3.12.2下载完成准备安装:2、安装步骤2-1、如下图勾选:安装时使用管理员权限,添加python的环境变量        并选择自定义安装2-2、点击【Next】2-3、选择文件路径,使用......
  • Python面试必备一之迭代器、生成器、浅拷贝、深拷贝
    本文首发于公众号:Hunter后端原文链接:Python面试必备一之迭代器、生成器、浅拷贝、深拷贝这一篇笔记主要介绍Python面试过程中常被问到的一些问题,比如:Python中的迭代器和生成器是什么,有什么作用Python中不可变类型有哪些在Python函数中,传递参数传递的是什么,值还是引......
  • 部署python网站
    如何部署python的代码既然是运维,运维,部署,维护一个完整的产品、前端开发工程师(前端代码html,css,js)+后端工程师(编写和数据库交互的逻辑代码)前端、后端源码,打包,发给运维,部署到linux服务器上1.如果是web产品,需要运维,部署如nginx这样的web服务器,提供域名,端口,防火墙,等允许......
  • python的时间格式化
    datetimedatetime.date属性/方法功能说明.max日期最大值类属性.min日期最小值类属性.today()今天的日期类方法.year对象的年属性int类型.month对象的月属性int类型.day对象的天属性int类型.weekday对象的星期属性周一~周日(0~6)......
  • Python if、for、while
    一、第一个程序 交互式输入第一个程序 #!/usr/bin/envpython3#-*-coding:utf-8-*-#@Author:Tom#@Time:2024/4/522:25#定义变量Google_Mail="[email protected]"#允许交互式输入并赋值给对应的变量Google_Url=input("PleaseInputGoogleTheUr......