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

news2025/2/24 2:39:36

文章目录

  • 基于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 = 25
    res = []
    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.5
        if valid_score > 0.01:
            #验证集分数不好的模型丢弃
            continue
        xgb_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 = kwargs
        if "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.params

    def 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.5
    return '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.coloradmin.cn/o/1391662.html

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

相关文章

国内小白最靠谱的充值chatgpt的方法是什么?

在AI越来越火得时代,大家都想尝试以下ChatGPT与ChatGPTPlus有什么不同,那么我们如何使用靠谱得方式来充值ChatGPT呢? 充值注意事项: 1、一个干净得环境 2、Fomepay得虚拟卡,5347/5561/都可以 3、登录ChatGPT 按图片…

LLM:Training Compute-Optimal Large Language Models

论文:https://arxiv.org/pdf/2203.15556.pdf 发表:2022 前文回顾: OpenAI在2020年提出《Scaling Laws for Neural Language Models》:Scaling Laws(缩放法则)也一直影响了后续大模型的训练。其给出的结论是最佳计算效…

工具推荐 |Devv.ai — 最懂程序员的新一代 AI 搜索引擎

介绍 伴随 GPT 的出现,我们可以看到越来越多的 AI 产品,其中也不乏针对程序员做的代码生成工具。 今天介绍的这款产品是一款针对中文开发者的 AI 搜索引擎,Devv.ai 使用 Devv.ai 的使用非常简单,就是传统的搜索场景&#xff…

高级分布式系统-第10讲 分布式控制系统

高级分布式系统汇总:高级分布式系统目录汇总-CSDN博客 自动化是关于一切人造系统自动、智能、自主、高效和安全运行的科学与技术 计算机控制技术是实现自动化的主要方法和手段 分布式控制技术是伴随着机器大工业生产而诞生的特殊计算机控制技术 计算机控制系统 …

rust获取本地ip地址的方法

大家好,我是get_local_info作者带剑书生,这里用一篇文章讲解get_local_info的使用。 get_local_info是什么? get_local_info是一个获取linux系统信息的rust三方库,并提供一些常用功能,目前版本0.2.4。详细介绍地址&a…

MSSQL-识别扩展extended event(扩展事件)中的时间单位

经常使用sqlserver extended event(扩展事件),但是总是忘记扩展事件使用的时间单位,不确定它们是 秒、毫秒、还是微秒? 以下下代码能够从 相关DMV中提取description字段内容来识别时间单位: SELECT [p].[name] [package_name],[o…

企业网站建站源码系统:Thinkphp5内核企业网站建站模板源码 带完整的安装代码包以及搭建教程

随着互联网的快速发展,企业对于网站的需求日益增强。为了满足这一市场需求,小编给大家分享一款基于Thinkphp5内核的企业网站建站源码系统。该系统旨在为企业提供一套功能强大、易于使用的网站建设解决方案,帮助企业快速搭建自己的官方网站&am…

探索数据的奥秘:一份深入浅出的数据分析入门指南

数据分析 书籍推荐 入门读物 深入浅出数据分析啤酒与尿布数据之美数学之美 数据分析 Scipy and NumpyPython for Data AnalysisBad Data Handbook集体智慧编程Machine Learning in Action机器学习实战Building Machine Learning Systems with Python数据挖掘导论Machine L…

LLM:Scaling Laws for Neural Language Models (上)

论文:https://arxiv.org/pdf/2001.08361.pdf 发表:2020 摘要1:损失与模型大小、数据集大小以及训练所用计算量成比例,其中一些趋势跨越了七个量级以上。 2:网络宽度或深度等其他架构细节在很大范围内影响较小。3&…

两道有挑战的问题(算法村第九关黄金挑战)

将有序数组转换为二叉搜索树 108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode) 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个…

rust跟我学五:是否安装双系统

图为RUST吉祥物 大家好,我是get_local_info作者带剑书生,这里用一篇文章讲解get_local_info是怎么得到检测双系统的。 首先,先要了解get_local_info是什么? get_local_info是一个获取linux系统信息的rust三方库,并提供一些常用功能,目前版本0.2.4。详细介绍地址:[我的Ru…

【JVM】常用命令

一、前言 Java虚拟机(JVM)是Java程序运行的基础设施,它负责将Java字节码转换为本地机器代码并执行。在开发过程中,我们经常需要使用一些命令来监控和管理JVM的性能和状态。本文将详细介绍6个常用的JVM命令:jps、jstat…

C语言——编译和链接

(图片由AI生成) 0.前言 C语言是最受欢迎的编程语言之一,以其接近硬件的能力和高效性而闻名。理解C语言的编译和链接过程对于深入了解其运行原理至关重要。本文将详细介绍C语言的翻译环境和运行环境,重点关注编译和链接的各个阶段…

含并行连结的网络(GoogLeNet)

目录 1.GoogLeNet 2.代码 1.GoogLeNet inception不改变高宽,只改变通道数。GoogLeNet也大量使用1*1卷积,把它当作全连接用。 V3耗内存比较多,计算比较慢,但是精度比较准确。 2.代码 import torch from torch import nn from t…

未来的NAS:连接您的数字生活

未来的NAS:连接您的数字生活 引言 网络附加存储(Network Attached Storage,简称NAS)是一种通过网络连接的存储设备,用于集中存储和共享数据。传统的NAS设备通常包含一个或多个硬盘驱动器,可以通过局域网连…

2024.1.14每日一题

LeetCode 83.删除排序链表中的重复元素 83. 删除排序链表中的重复元素 - 力扣(LeetCode) 题目描述 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 示例 1: 输…

.NET 8.0 发布到 IIS

如何在IIS(Internet信息服务)上发布ASP.NET Core 8? 在本文中,我假设您的 Windows Server IIS 上已经有一个应用程序池。 按照步骤了解在 IIS 环境下发布 ASP.NET Core 8 应用程序的技巧。 您需要设置代码以支持 IIS 并将项目配…

我的年终总结2023

As a DBA 从2023年初开始,我就给自己定下了23年的主要任务——学习PostgreSQL数据库。虽然没有定下细致的计划,但总体的目标是把PG的一些基础知识学完。后来发现我想简单了,学习PG的成本比我想象的多的多,导致23年这个目标没有完…

前端踩坑之——antDesignVue的upload组件

本地启动时控制台会报404,放到服务器上控制台会报405(多发一个请求) 原因:upLoad有默认的上传事件 解决:阻止默认事件即可 beforeUpload Hook function which will be executed before uploading. Uploading will be stopped with false or …

修复uni-simple-router@2.0.7版本query参数null的bug

问题:query参数为null或者为空时,插件内部参数校验问题导致的会报错:TypeError: Cannot convert undefined or null to object at Function.keys 源码修改如下: 通过打补丁的方式修复query参数类型校验问题 1. 安装patch-packag…