基于python集成学习算法XGBoost农业数据可视化分析预测系统

news/2024/2/29 16:47:41/文章来源:https://blog.csdn.net/Myx74270512/article/details/135552109

文章目录

  • 基于python集成学习算法XGBoost农业数据可视化分析预测系统
    • 一、项目简介
    • 二、开发环境
    • 三、项目技术
    • 四、功能结构
    • 五、功能实现
      • 模型构建
      • 封装类用于网格调参
      • 训练模型
      • 系统可视化数据请求接口
      • 模型评分 0.5*mse
    • 六、系统实现
    • 七、总结

基于python集成学习算法XGBoost农业数据可视化分析预测系统

一、项目简介

基于python集成学习算法XGBoost农业数据可视化分析预测系统,旨在帮助农民和相关从业者更好地预测农作物产量,以优化农业生产。该系统主要包括四个功能模块。

首先,农作物数据可视化模块利用Echarts、Ajax、Flask、PyMysql技术实现了可视化展示农作物产量相关数据的功能。

其次,产量预测模块使用pandas、numpy等技术,通过对气象和农作物产量关系数据集的分析和训练,实现了对农作物产量的预测功能。该模块可以对当前或未来某一时间段的农作物产量进行预测,并提供预测结果的可视化展示。

然后,用户登录与用户注册模块使用layui、Flask、PyMysql技术实现了用户登录和注册功能。用户可以通过登录系统后,利用该系统提供的预测和可视化功能,更好地规划和管理自己的农业生产。

最后,数据管理模块使用layui、Flask、PyMysql技术,实现了用户管理、公告管理和农作物数据管理等功能。系统管理员可以通过后台界面对用户信息、公告信息和农作物数据进行管理和维护,保证系统的正常运行和信息安全。

本系统的实现对农业生产的优化具有积极的意义。通过对气象和农作物产量关系数据的分析和训练,该系统可以帮助用户更好地了解不同作物产量随时间变化的趋势和规律,提高农作物的产量和品质,促进农业生产的可持续发展。

二、开发环境

开发环境版本/工具
PYTHON3.x
开发工具PyCharm2021
操作系统Windows 10
内存要求16GB
浏览器Firefox
数据库MySQL 8.0
数据库工具Navicat Premium 15
项目框架FLASK、layui

三、项目技术

后端:Flask、sklearn、PyMySQL、MySQL、urllib

前端:Jinja2、Jquery、Ajax、layui

四、功能结构

农作物产量大屏数据可视化模块:通过ECharts实现数据可视化,展示农作物产量的趋势、关联因素等。

机器学习预测农作物产量模型构建与训练:使用Scikit-learn、Pandas、NumPy构建机器学习模型,对农作物产量进行预测。

用户登录与注册:通过Flask、PyMySQL、LAYUI实现用户登录和注册功能。

系统后台管理模块:

​ 用户模块:管理用户信息,权限等。

​ 公告模块:发布和管理系统相关公告信息。

​ 农作物数据管理模块:存储和管理与农作物产量预测相关的数据集。

​ 预测可视化后台交互:提供用户与预测数据的交互界面,使用Ajax请求后端数据接口展示数据可视化结果。
系统结构图
在这里插入图片描述

五、功能实现

模型构建

def model(X_data,y_label,testst,prediction):"""模型搭建"""global params_xgb  #模型参数,设置全局变量便于调参n_splits = 25res = []kf = KFold(n_splits = n_splits, shuffle=True, random_state=520)for i, (train_index, test_index) in enumerate(kf.split(X_data)):print('第{}次训练...'.format(i+1))train_data = X_data.iloc[train_index]train_label = y_label.iloc[train_index]valid_data = X_data.iloc[test_index]valid_label = y_label.iloc[test_index]xgb_train = xgb.DMatrix(train_data, label=train_label)xgb_valid = xgb.DMatrix(valid_data, valid_label)evallist = [(xgb_valid, 'eval'), (xgb_train, 'train')]cgb_model = xgb.train(params_xgb, xgb_train, num_boost_round=500 , evals=evallist, verbose_eval=500, early_stopping_rounds=300, feval=myFeval)valid = cgb_model.predict(xgb_valid, ntree_limit=cgb_model.best_ntree_limit)valid_score = mean_squared_error(valid_label,valid)*0.5if valid_score > 0.01:#验证集分数不好的模型丢弃continuexgb_test = xgb.DMatrix(testst)preds = cgb_model.predict(xgb_test, ntree_limit=cgb_model.best_ntree_limit)res.append(preds)print("\n")

在这里插入图片描述

使用XGBoost(Extreme Gradient Boosting)算法进行回归任务的模型搭建函数。

  1. 参数说明:
    • X_data: 训练数据的特征。
    • y_label: 训练数据的目标标签。
    • testst: 测试数据的特征,用于进行预测。
    • prediction: 预测结果的存储列表。
  2. 交叉验证:
    • 该模型使用了 K 折交叉验证(KFold),将数据集分成训练集和验证集,循环进行训练和验证。这有助于评估模型的性能,并减少由于数据集划分不同而引起的波动。
  3. XGBoost模型训练:
    • 使用 XGBoost 中的 xgb.train 函数进行模型训练。
    • 参数 params_xgb 是全局变量,应该在代码其他地方定义,包含了 XGBoost 模型的超参数设置。
    • 训练中使用了早停法(early stopping),如果在一定迭代次数内验证集分数没有提高,则提前结束训练。
  4. 模型预测:
    • 使用训练好的模型对验证集和测试集进行预测。
    • 验证集预测结果与真实标签计算均方误差(Mean Squared Error),如果分数大于0.01,则该模型被丢弃。
    • 如果验证集分数较好,将测试集的预测结果添加到 res 列表中。
  5. 输出信息:
    • 打印每次训练的信息,包括训练次数、验证集分数等。

封装类用于网格调参

class XGBoostre(object):"""封装类用于网格调参"""def __init__(self,**kwargs):self.params = kwargsif "num_boost_round" in self.params:self.num_boost_round = self.params["num_boost_round"]self.params.update({'objective': 'reg:squarederror','silent': 0,'seed': 1000})def fit(self,x_train,y_train):xgb_train = xgb.DMatrix(x_train, label=y_train)self.bst = xgb.train(params=self.params, dtrain=xgb_train, num_boost_round=self.num_boost_round,  verbose_eval=100, feval=myFeval)def predict(self,x_pred):dpred = xgb.DMatrix(x_pred)return self.bst.predict(dpred)def kfold(self,x_train,y_train,n_fold=5):xgb_train = xgb.DMatrix(x_train, label=y_train)bst_cv = xgb.cv(params=self.params, dtrain=xgb_train,feval=myFeval,num_boost_round=self.num_boost_round, nfold=n_fold,)return bst_cv.iloc[-1,:]def plt_feature_importance(self):feat = pd.Series(self.bst.get_fscore()).sort_values(ascending=False)feat.plot(title = "Feature_importance")def get_params(self,deep=True):return self.paramsdef set_params(self,**params):self.params.update(params)return self

在这里插入图片描述

  1. 初始化方法 __init__
    • 这个方法用于初始化XGBoostre类的实例。
    • 使用**kwargs来接收任意数量的关键字参数,并将这些参数存储在self.params字典中。
    • 如果"num_boost_round"存在于self.params中,则将其值存储在self.num_boost_round中。
    • 设置默认的XGBoost参数,包括目标函数为'reg:squarederror',不进行静默操作('silent': 0),并设置随机种子为1000。
  2. fit 方法
    • 该方法用于训练XGBoost模型。
    • 将训练数据x_trainy_train转换为xgb.DMatrix格式。
    • 使用xgb.train函数进行模型训练,并保存训练好的模型为self.bst
  3. predict 方法
    • 该方法用于使用训练好的模型进行预测。
    • 将待预测数据x_pred转换为xgb.DMatrix格式。
    • 使用训练好的模型self.bst进行预测,并返回预测结果。
  4. kfold 方法
    • 该方法执行K折交叉验证。
    • 使用xgb.cv函数进行K折交叉验证,并返回交叉验证的结果。
  5. plt_feature_importance 方法
    • 该方法用于绘制特征重要性。
    • 获取模型中特征的重要性得分,并将其排序。
    • 使用pd.Series.plot方法绘制特征重要性的条形图。
  6. get_params 方法
    • 该方法用于获取当前设置的XGBoost参数。
    • 返回存储在self.params中的参数。
  7. set_params 方法
    • 该方法用于更新XGBoost参数。
    • 使用传入的关键字参数更新self.params字典中的参数,并返回更新后的参数。

这个XGBoostre类为XGBoost模型提供了一个封装接口,使得用户可以更方便地进行模型训练、预测和评估,同时还可以进行参数调优和特征重要性分析。

训练模型

if __name__ == "__main__":deal_loss()change()change_week()params_xgb = {'booster': 'gbtree','objective': 'reg:squarederror','eval_metric': 'rmse',  # 对于回归问题,默认值是rmse,对于分类问题,默认值是error'gamma': 0.1,     #损失下降多少才分裂'max_depth': 4,'lambda': 1.2,    #控制模型复杂度的权重值的L2曾泽化参数,参数越大越不容易过拟合'subsample': 0.9,   #随机采样的训练样本'colsample_bytree': 0.9,    #生成树时特征采样比例'min_child_weight': 3,  # 6'silent': 0,    #信息输出设置成1则没有信息输出'eta': 0.12,   #类似学习率'seed': 1000,'nthread': 9,}X_data,y_label,testst,prediction = get_data()model(X_data,y_label,testst,prediction)df = pd.read_csv("result.csv",encoding="gbk")df["区县id"] =  df["columns"].apply(arr)

在这里插入图片描述

对预测模型进行训练和预测,然后将结果保存到一个 CSV 文件中,并进行后续的数据处理。

  1. XGBoost模型参数设置:
    • 定义了一个字典 params_xgb,包含了 XGBoost 模型的超参数设置。这些参数控制了模型的结构和训练过程。
  2. 获取数据:
    • 调用 get_data() 函数,但代码中未提供该函数的实现。这个函数用于获取训练数据 (X_data, y_label) 和测试数据 (testst)。
  3. 模型训练:
    • 调用 model 函数,传入训练数据和测试数据,进行模型训练和预测。模型的超参数通过 params_xgb 传递。
  4. 读取CSV文件并进行数据处理:
    • 使用 Pandas (pd) 读取一个 CSV 文件,文件名为 “result.csv”,使用 GBK 编码。
    • 对 DataFrame 中的 “columns” 列应用 arr 函数,但未提供 arr 函数的实现。

系统可视化数据请求接口

在这里插入图片描述

@app.route('/')
def main_page():month_rain = data_service.get_month_rain_volume()ave_wind = data_service.get_ave_wind()count, output, weather = data_service.get_total()yearly_outputs = data_service.get_yearly_output()months_temp = data_service.get_months_temp()times_selling = data_service.get_times_selling()months_sun = data_service.get_months_sun()table_list = data_service.get_table_list()return render_template("main.html", month_rain=month_rain,ave_wind=ave_wind,table_list=table_list,count=count, output=output, weather=weather,yearly_outputs=yearly_outputs, months_temp=months_temp,times_selling=times_selling, months_sun=months_sun)
  1. 数据获取:
    • month_rain = data_service.get_month_rain_volume(): 获取月降雨量的数据,是通过调用 get_month_rain_volume 函数从 data_service 中获取。
    • ave_wind = data_service.get_ave_wind(): 获取平均风速的数据,是通过调用 get_ave_wind 函数从 data_service 中获取。
    • count, output, weather = data_service.get_total(): 获取总数、输出和天气的数据,是通过调用 get_total 函数从 data_service 中获取。
    • 其他类似的语句用于获取其他数据,如年度产出、月温度、销售次数、月日照时间等。
  2. HTML 模板渲染:
    • return render_template("main.html", ...): 使用 Flask 提供的 render_template 函数渲染 HTML 模板。传递了多个变量作为模板中的参数,这些变量包括上面获取的各种数据。
  3. 返回结果:
    • main.html 模板将使用传递的数据进行渲染,然后作为 HTTP 响应返回给用户。

模型评分 0.5*mse

def myFeval(preds, xgbtrain):"""模型评分 0.5*mse"""xgbtrain = xgbtrain.get_label() #将xgboost.core.DMatrix类转化为ndarray类别score = mean_squared_error(xgbtrain,preds)*0.5return 'myFeval', score

在这里插入图片描述

自定义评估函数 myFeval,用于在XGBoost模型训练过程中评估模型的性能。

  1. 参数解释:

    • preds: 预测的目标变量值。
    • xgbtrain: XGBoost训练数据,通常是 xgboost.DMatrix 类型。
  2. 函数逻辑:

    • xgbtrain = xgbtrain.get_label(): 将 xgbtrain 转换为 ndarray 类型,通过调用 get_label() 方法获取标签。这是将XGBoost的 DMatrix 转换为NumPy数组的操作。

    • score = mean_squared_error(xgbtrain, preds) * 0.5: 计算均方误差(Mean Squared Error,MSE),然后乘以0.5。这是一个模型评估指标,用于衡量模型预测值与实际标签之间的平方差。将MSE乘以0.5可能是为了得到更合适的评估分数。

    • return 'myFeval', score: 返回一个元组,包含自定义评估名称 ‘myFeval’ 和计算得到的分数。

      该评估函数主要用于XGBoost模型训练中,作为 eval_metric 参数的值。这个函数的设计是为了与XGBoost的内置评估函数保持一致,并且使用MSE的一半作为最终评估分数。

六、系统实现

启动项目

在这里插入图片描述

可视化模块主要实现了对各个地区农业产量的轮播数据展示、对气象变化归路展 示、对气象天气进行分类统计、对日照时间进行统计柱状图分析等功能。实现流程首先 通过浏览器发动 http 请求,Flask 接收到请求后,通过 PyMysql 对数据库进行查询,然 后格式化与分析后响应给前端,前端通过 Echarts 技术在进行可视化解析与渲染,最终 实现可视化效果。

在这里插入图片描述

用户模块核心带主要是用户登录时候的校验,这里以用户登录的业务逻辑层代码为

例,如下图 所示。

在这里插入图片描述

登录页面

在这里插入图片描述

注册页面

在这里插入图片描述

后台管理首页

在这里插入图片描述

用户管理

在这里插入图片描述

公告管理

在这里插入图片描述

产量数据管理

在这里插入图片描述

气象数据管理

在这里插入图片描述

产量预测管理

在这里插入图片描述

七、总结

基于XGBoost的算法分析预测具有许多优势,这些优势使得XGBoost成为许多应用场景的首选算法之一。

  1. 高性能:
    • XGBoost是一种梯度提升算法,它在性能上表现出色。通过使用并行处理和基于特征的分裂方法,XGBoost能够快速、高效地处理大规模数据集。
  2. 强大的正则化:
    • XGBoost通过正则化项(如L1和L2正则化)提供了对模型的强大控制,有助于防止过拟合。这使得模型更具泛化能力,可以适用于不同的数据集。
  3. 处理缺失值:
    • XGBoost能够自动处理缺失值。在实际应用中,数据中的缺失值是常见的问题,而XGBoost能够有效地处理这些情况,而不需要进行额外的数据处理。
  4. 可解释性:
    • XGBoost具有一定的可解释性,可以输出特征的重要性得分。这对于理解模型对农作物产量预测中哪些特征起到关键作用非常有帮助,从而为农业决策提供支持。
  5. 适用于多种任务:
    • XGBoost不仅可以用于回归问题(如农作物产量预测),还可以用于分类和排序等任务。这种通用性使得XGBoost在不同类型的问题中都能够展现出色的性能。
  6. 可扩展性:
    • XGBoost具有良好的可扩展性,可以应对大规模数据和高维特征。它支持分布式计算,可以在分布式环境中运行,提高了处理大规模数据时的效率。
  7. 特征重要性评估:
    • XGBoost可以输出特征的相对重要性,帮助用户理解模型对输入特征的依赖程度。这对于农作物产量预测系统的可解释性和可理解性非常有价值。

总结来说,XGBoost在性能、鲁棒性和可解释性等方面都表现出色,使其成为解决复杂问题的强大工具,也为农作物产量预测系统提供了可靠的建模手段。

需项目资料/商业合作/交流探讨等可以添加下面个人名片,感谢各位的喜欢与支持!

后续持续更新更多优质内容!

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

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

相关文章

多行SQL转成单行SQL

如下图所示 将以上多行SQL转成单行SQL 正则表达式如下 (?s)$[^a-zA-Z()0-9]*结果如下 灵活使用,也未必只能使用Sublime Text 提供了一个在线工具

[Docker] Docker为什么出现

Docker为什么出现 一款产品: 开发–上线 -->两套环境 | 应用配置 开发即运维! 环境配置十分麻烦,每一个机器都要部署环境(Redis, ES, Hadoop) 费时费力 项目带上配置环境安装打包。 传统: 开发jar&…

基于pyqt5+scapy 根据ip 具体端口 进行扫描 的程序

先给出代码 import sysfrom PyQt5 import uic from PyQt5.QtWidgets import *from scapy.all import * import argparse import logging from scapy.layers.inet import IP, TCP from scapy.sendrecv import sr1class MyWindow(QWidget):def __init__(self):super().__init__(…

AI人工智能工程师证书专业认证培训班有用吗?

当然有用,它即让自身技术技能有所提升,也拿到行内有含金量的证书,让自己在选择职业、升职加薪中更有竞争力。但是要擦亮眼睛,建议大家如果要找人工智能培训,就找性价比较高的培训班, 人工智能AI培训班怎么…

IP风险画像:源头防范网络攻击的全面策略

在当今数字化的时代,网络攻击呈现多样化和复杂化的趋势,为了确保网络的安全,制定全面的IP风险画像并从源头防范网络攻击是至关重要的。ip数据云将探讨如何通过建立IP风险画像来识别和应对潜在的威胁,从而实现更加安全可靠的网络环…

UML-用例图

提示:用例图是软件建模的开始,软件建模中的其他图形都将以用例图为依据。用例图列举了系统所需要实现的所有功能,除了用于软件开发的需求分析阶段,也可用于软件的系统测试阶段。 UML-用例图 一、用例图的基础知识1.用例图的构成元…

Spring Boot 3 + Vue 3实战:引入数据库实现用户登录功能

文章目录 一、实战概述二、实战步骤(一)创建数据库(二)创建用户表(三)后端项目引入数据库1、添加相关依赖2、用户实体类保持不变3、编写应用配置文件4、创建用户映射器接口5、创建用户服务类6、修改登录控制…

Linux集锦大全【持续更新】

文章目录 Linux集锦大全【持续更新】Linux最常用的几个归档和压缩命令解压方法之一 tar语法压缩文件查看压缩文件的内容解压文件 解压方法之一 zip语法参数参考实例仅保存文件名 解压命令之一 unzip基本命令指定目录解压不解压某些文件 解压命令之一 gzip Linux最危险的几个命令…

Android基于Matrix绘制PaintDrawable设置BitmapShader,以手指触点为中心显示原图像圆图,Kotlin(2)

Android基于Matrix绘制PaintDrawable设置BitmapShader,以手指触点为中心显示原图像圆图,Kotlin(2) 在 https://zhangphil.blog.csdn.net/article/details/135374279 基础上,增加一个功能,当手指在上面的图片…

元宇宙商城LightCycle如何重塑我们的数字生活

在数字化时代,元宇宙的概念不再是科幻小说中的奇思妙想,而是逐渐成为我们日常生活的一部分。在这一领域,LightCycle项目以其独特的视角和创新技术,不仅在游戏领域取得了突破,更是在重塑我们数字生活的方式方面发挥了巨…

面试题总结-分布式总结

Nginx 篇 【1】简述一下什么是Nginx,它有什么优势和功能? Nginx 是高性能的 HTTP 和反向代理的服务器,处理高并发能力是十分强大的,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。Nginx主要提供功能有 http服务…

免费3d模型库怎么下载?

3D模型库是提供3D模型资源下载的平台,用户可以在这里找到各种类型的3D模型,如建筑、道具、人物、动物等。那么3d模型库怎么免费下载? 1、打开3D模型库免费网站建e,并在搜索框中输入您需要的3D模型关键词,如建筑、道具、人物等。 …

操作系统概述

概述 文章目录 概述定义功能特征并发共享并发与共享的关系虚拟异步 发展与分类手工操作阶段批处理阶段分时操作系统实时操作系统网络操作系统分布式操作系统个人计算机操作系统 运行机制程序是如何运行的?内核程序应用程序特权指令非特权指令内核态用户态内核态与用…

【软件测试学习笔记1】测试基础

1.软件测试的定义 软件的定义:控制计算机硬件工作的工具 软件的基本组成:页面客户端,代码服务器,数据服务器 软件产生的过程:需求产生(产品经理),需求文档,设计效果图…

STM32之OLED显示

一、模块介绍 1、常见的显示设备 LED、数码管、点阵、LCD屏(1602/12864)、OLED屏(消费电子) 2、OLED屏的概述 OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesenc…

css宽度适应内容

废话不多说,看如下demo,我需要将下面这个盒子的宽度变成内容自适应 方法有很多,如下 父元素设置display:flex 实现子元素宽度适应内容 如下给父元素设置flex能实现宽度自适应内容 <!DOCTYPE html><html lang"en"><head><meta charset"U…

C++每日一练(15):简单幂计算

题目描述 输入两个数a和b&#xff0c;求a的b次方。 输入 输入两个整数a&#xff0c;b&#xff08;1<a<10&#xff0c;1<b<15&#xff09;。 输出 输出一个正整数&#xff0c;该值<1000000000000。 输入样例 3 3 输出样例 27 参考答案 #include<bits/stdc.h&…

C++常用类

1、QString 字符串类 QString 是Qt的字符串类&#xff0c;与C的std::string相比&#xff0c;不再使用ASCII编码。QString使用的Unicode编码。 QString 完全支持中文&#xff0c; 但是由于不同的技术可能会采用不同的编码。有时候也会遇到中文编码的一致性问题。 如果后续的学习…

无人机测绘助力实现高效、安全的城市规划

随着城市化进程的不断加快&#xff0c;城市规划显得尤为重要。而无人机测绘技术作为一种创新的工具&#xff0c;为城市规划提供了更加高效、安全的解决方案。它通过快速、精确的数据采集和分析&#xff0c;为行业提供有力的决策支持&#xff0c;助力城市规划的现代化和可持续发…

LeetCode刷题---基本计算器

解题思路&#xff1a; 根据题意&#xff0c;字符串中包含的运算符只有和- 使用辅助栈的方法来解决该问题 定义结果集res和符号位sign(用于判断对下一数的加减操作),接着对字符串进行遍历。 如果当前字符为数字字符&#xff0c;判断当前字符的下一个字符是否也是数字字符&#x…