大数据农业数据分析:基于Python呆板学习算法农业数据可视化分析预测体系( ...

金歌  金牌会员 | 2024-12-28 04:45:04 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 922|帖子 922|积分 2766

大数据农业数据分析:基于Python呆板学习算法农业数据可视化分析预测体系(随机丛林算法+XGBoost算法)

一、项目简介

基于python呆板学习随机丛林算法+XGBoost的算法农业数据可视化分析预测体系,旨在资助农民和相关从业者更好地预测农作物产量,以优化农业生产。该体系主要包括四个功能模块。
首先,农作物数据可视化模块利用Echarts、Ajax、Flask、PyMysql技术实现了可视化展示农作物产量相关数据的功能。
其次,产量预测模块利用pandas、numpy等技术,通过对气象和农作物产量关系数据集的分析和练习,实现了对农作物产量的预测功能。该模块可以通过随机丛林算法+XGBoost的算法对当前或未来某一时间段的农作物产量举行预测,并提供预测结果的可视化展示。
然后,用户登录与用户注册模块利用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实现用户登录和注册功能。
体系后台管理模块:
​ 用户模块:管理用户信息,权限等。
​ 公告模块:发布和管理体系相关公告信息。
​ 农作物数据管理模块:存储和管理与农作物产量预测相关的数据集。
​ 预测可视化后台交互:提供用户与预测数据的交互界面,通过随机丛林算法+XGBoost的算法利用Ajax哀求后端数据接口展示数据可视化结果。
体系结构图

五、功能实现

部分算法模型构建

随机丛林部分核心代码

  1. def model(X_data, y_label, testst, prediction):
  2.     """模型搭建
  3.     """
  4.     global params_rf  # 模型参数,设置全局变量便于调参
  5.     n_splits = 25
  6.     res = []
  7.     kf = KFold(n_splits=n_splits, shuffle=True, random_state=520)
  8.     for i, (train_index, test_index) in enumerate(kf.split(X_data)):
  9.         print('第{}次训练...'.format(i + 1))
  10.         train_data = X_data.iloc[train_index]
  11.         train_label = y_label.iloc[train_index]
  12.         valid_data = X_data.iloc[test_index]
  13.         valid_label = y_label.iloc[test_index]
  14.         rf_model = RandomForestRegressor(**params_rf)
  15.         rf_model.fit(train_data, train_label)
  16.         valid = rf_model.predict(valid_data)
  17.         valid_score = mean_squared_error(valid_label, valid) * 0.5
  18.         if valid_score > 0.01:
  19.             # 验证集分数不好的模型丢弃
  20.             continue
  21.         preds = rf_model.predict(testst)
  22.         res.append(preds)
  23.         print("\n")
  24.     res = np.array(res)
  25.     print(res.shape)
  26.     res = res.mean(axis=0)
  27.     prediction["pre_randomforest"] = res
  28.     prediction.to_csv('result_rf.csv', index=False, encoding='gbk')
  29. def arr(a):
  30.     return a.split("_")[0]
  31. if __name__ == "__main__":
  32.     # deal_loss()
  33.     # change()
  34.     # change_week()
  35.     path = "../data/"
  36.     params_rf = {
  37.         'n_estimators': 100,
  38.         'max_depth': 4,
  39.         'min_samples_split': 2,
  40.         'min_samples_leaf': 1,
  41.         'random_state': 520
  42.     }
  43.     X_data, y_label, testst, prediction = get_data()
  44.     model(X_data, y_label, testst, prediction)
复制代码
部分截图展示:

这里model 函数界说了一个随机丛林模型的练习和预测过程。参数包括练习数据 X_data、练习标签 y_label、测试数据 testst 和一个空的预测结果 prediction。在该函数中,利用 KFold 交叉验证来划分数据集,练习多个随机丛林模型,对测试集举行预测,并将结果生存到 result_rf.csv 文件中。利用均方偏差 (MSE) 衡量模型预测的准确性,计算方式为预测值与实际值之间的差异的平方的平均值。利用 r2_score 函数计算模型的 R2 拟合优度,该值越靠近1表现模型拟合得越好。利用 Matplotlib 举行预测结果的可视化,将实际值与预测值举行散点图绘制,并添加一条表现完善预测的直线,模型拟合准确准确率可以到达95%以上。
xgboost部分核心代码

  1. def model(X_data,y_label,testst,prediction):
  2.     """模型搭建
  3.     """
  4.     global params_xgb  #模型参数,设置全局变量便于调参
  5.     n_splits = 25
  6.     res = []
  7.     kf = KFold(n_splits = n_splits, shuffle=True, random_state=520)
  8.     for i, (train_index, test_index) in enumerate(kf.split(X_data)):
  9.         print('第{}次训练...'.format(i+1))
  10.         train_data = X_data.iloc[train_index]
  11.         train_label = y_label.iloc[train_index]
  12.         valid_data = X_data.iloc[test_index]
  13.         valid_label = y_label.iloc[test_index]
  14.         xgb_train = xgb.DMatrix(train_data, label=train_label)
  15.         xgb_valid = xgb.DMatrix(valid_data, valid_label)
  16.         evallist = [(xgb_valid, 'eval'), (xgb_train, 'train')]
  17.         cgb_model = xgb.train(params_xgb, xgb_train, num_boost_round=500 , evals=evallist, verbose_eval=500, early_stopping_rounds=300, feval=myFeval)
  18.         valid = cgb_model.predict(xgb_valid, ntree_limit=cgb_model.best_ntree_limit)
  19.         valid_score = mean_squared_error(valid_label,valid)*0.5
  20.         if valid_score > 0.01:
  21.             #验证集分数不好的模型丢弃
  22.             continue
  23.         xgb_test = xgb.DMatrix(testst)
  24.         preds = cgb_model.predict(xgb_test, ntree_limit=cgb_model.best_ntree_limit)
  25.         res.append(preds)
  26.         print("\n")
复制代码

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

  • 参数阐明:

    • X_data: 练习数据的特征。
    • y_label: 练习数据的目标标签。
    • testst: 测试数据的特征,用于举行预测。
    • prediction: 预测结果的存储列表。

  • 交叉验证:

    • 该模型利用了 K 折交叉验证(KFold),将数据集分成练习集和验证集,循环举行练习和验证。这有助于评估模型的性能,并减少由于数据集划分不同而引起的波动。

  • XGBoost模型练习:

    • 利用 XGBoost 中的 xgb.train 函数举行模型练习。
    • 参数 params_xgb 是全局变量,应该在代码其他地方界说,包含了 XGBoost 模型的超参数设置。
    • 练习中利用了早停法(early stopping),如果在肯定迭代次数内验证集分数没有提高,则提前结束练习。

  • 模型预测:

    • 利用练习好的模型对验证集和测试集举行预测。
    • 验证集预测结果与真实标签计算均方偏差(Mean Squared Error),如果分数大于0.01,则该模型被丢弃。
    • 如果验证集分数较好,将测试集的预测结果添加到 res 列表中。

  • 输出信息:

    • 打印每次练习的信息,包括练习次数、验证集分数等。

封装类用于网格调参

  1. class XGBoostre(object):
  2.     """封装类用于网格调参
  3.     """
  4.     def __init__(self,**kwargs):
  5.         self.params = kwargs
  6.         if "num_boost_round" in self.params:
  7.             self.num_boost_round = self.params["num_boost_round"]
  8.         self.params.update({'objective': 'reg:squarederror','silent': 0,'seed': 1000})
  9.     def fit(self,x_train,y_train):
  10.         xgb_train = xgb.DMatrix(x_train, label=y_train)
  11.         self.bst = xgb.train(params=self.params, dtrain=xgb_train, num_boost_round=self.num_boost_round,  verbose_eval=100, feval=myFeval)
  12.     def predict(self,x_pred):
  13.         dpred = xgb.DMatrix(x_pred)
  14.         return self.bst.predict(dpred)
  15.     def kfold(self,x_train,y_train,n_fold=5):
  16.         xgb_train = xgb.DMatrix(x_train, label=y_train)
  17.         bst_cv = xgb.cv(params=self.params, dtrain=xgb_train,feval=myFeval,num_boost_round=self.num_boost_round, nfold=n_fold,)
  18.         return bst_cv.iloc[-1,:]
  19.     def plt_feature_importance(self):
  20.         feat = pd.Series(self.bst.get_fscore()).sort_values(ascending=False)
  21.         feat.plot(title = "Feature_importance")
  22.     def get_params(self,deep=True):
  23.         return self.params
  24.     def set_params(self,**params):
  25.         self.params.update(params)
  26.         return self
复制代码


  • 初始化方法 __init__

    • 这个方法用于初始化XGBoostre类的实例。
    • 利用**kwargs来接收任意数量的关键字参数,并将这些参数存储在self.params字典中。
    • 如果"num_boost_round"存在于self.params中,则将其值存储在self.num_boost_round中。
    • 设置默认的XGBoost参数,包括目标函数为'reg:squarederror',不举行静默操作('silent': 0),并设置随机种子为1000。

  • fit 方法

    • 该方法用于练习XGBoost模型。
    • 将练习数据x_train和y_train转换为xgb.DMatrix格式。
    • 利用xgb.train函数举行模型练习,并生存练习好的模型为self.bst。

  • predict 方法

    • 该方法用于利用练习好的模型举行预测。
    • 将待预测数据x_pred转换为xgb.DMatrix格式。
    • 利用练习好的模型self.bst举行预测,并返回预测结果。

  • kfold 方法

    • 该方法实行K折交叉验证。
    • 利用xgb.cv函数举行K折交叉验证,并返回交叉验证的结果。

  • plt_feature_importance 方法

    • 该方法用于绘制特征重要性。
    • 获取模型中特征的重要性得分,并将其排序。
    • 利用pd.Series.plot方法绘制特征重要性的条形图。

  • get_params 方法

    • 该方法用于获取当前设置的XGBoost参数。
    • 返回存储在self.params中的参数。

  • set_params 方法

    • 该方法用于更新XGBoost参数。
    • 利用传入的关键字参数更新self.params字典中的参数,并返回更新后的参数。

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

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

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

  • XGBoost模型参数设置:

    • 界说了一个字典 params_xgb,包含了 XGBoost 模型的超参数设置。这些参数控制了模型的结构和练习过程。

  • 获取数据:

    • 调用 get_data() 函数,但代码中未提供该函数的实现。这个函数用于获取练习数据 (X_data, y_label) 和测试数据 (testst)。

  • 模型练习:

    • 调用 model 函数,传入练习数据和测试数据,举行模型练习和预测。模型的超参数通过 params_xgb 传递。

  • 读取CSV文件并举行数据处理:

    • 利用 Pandas (pd) 读取一个 CSV 文件,文件名为 “result.csv”,利用 GBK 编码。
    • 对 DataFrame 中的 “columns” 列应用 arr 函数,但未提供 arr 函数的实现。

体系可视化数据哀求接口


  1. @app.route('/')
  2. def main_page():
  3.     month_rain = data_service.get_month_rain_volume()
  4.     ave_wind = data_service.get_ave_wind()
  5.     count, output, weather = data_service.get_total()
  6.     yearly_outputs = data_service.get_yearly_output()
  7.     months_temp = data_service.get_months_temp()
  8.     times_selling = data_service.get_times_selling()
  9.     months_sun = data_service.get_months_sun()
  10.     table_list = data_service.get_table_list()
  11.     return render_template("main.html", month_rain=month_rain,
  12.                            ave_wind=ave_wind,
  13.                            table_list=table_list,
  14.                            count=count, output=output, weather=weather,
  15.                            yearly_outputs=yearly_outputs, months_temp=months_temp,
  16.                            times_selling=times_selling, months_sun=months_sun)
复制代码

  • 数据获取:

    • 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 中获取。
    • 其他类似的语句用于获取其他数据,如年度产出、月温度、贩卖次数、月日照时间等。

  • HTML 模板渲染:

    • return render_template("main.html", ...): 利用 Flask 提供的 render_template 函数渲染 HTML 模板。传递了多个变量作为模板中的参数,这些变量包括上面获取的各种数据。

  • 返回结果:

    • main.html 模板将利用传递的数据举行渲染,然后作为 HTTP 相应返回给用户。

模型评分 0.5*mse

  1. def myFeval(preds, xgbtrain):
  2.     """模型评分 0.5*mse
  3.     """
  4.     xgbtrain = xgbtrain.get_label() #将xgboost.core.DMatrix类转化为ndarray类别
  5.     score = mean_squared_error(xgbtrain,preds)*0.5
  6.     return 'myFeval', score
复制代码

自界说评估函数 myFeval,用于在XGBoost模型练习过程中评估模型的性能。

  • 参数解释:

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

  • 函数逻辑:

    • 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的算法分析预测具有许多上风,这些上风使得随机丛林算法和XGBoost成为许多应用场景的首选算法之一。

  • 高性能:

    • XGBoost是一种梯度提升算法,它在性能上表现精彩。通过利用并行处理和基于特征的分裂方法,XGBoost可以或许快速、高效地处理大规模数据集。

  • 强大的正则化:

    • XGBoost通过正则化项(如L1和L2正则化)提供了对模型的强大控制,有助于防止过拟合。这使得模型更具泛化本领,可以适用于不同的数据集。

  • 处理缺失值:

    • XGBoost可以或许自动处理缺失值。在实际应用中,数据中的缺失值是常见的题目,而XGBoost可以或许有用地处理这些情况,而不需要举行额外的数据处理。

  • 可解释性:

    • XGBoost具有肯定的可解释性,可以输出特征的重要性得分。这对于理解模型对农作物产量预测中哪些特征起到关键作用非常有资助,从而为农业决议提供支持。

  • 适用于多种任务:

    • XGBoost不仅可以用于回归题目(如农作物产量预测),还可以用于分类和排序等任务。这种通用性使得XGBoost在不同类型的题目中都可以或许显现精彩的性能。

  • 可扩展性:

    • XGBoost具有良好的可扩展性,可以应对大规模数据和高维特征。它支持分布式计算,可以在分布式环境中运行,提高了处理大规模数据时的效率。

  • 特征重要性评估:

    • XGBoost可以输出特征的相对重要性,资助用户理解模型对输入特征的依靠水平。这对于农作物产量预测体系的可解释性和可理解性非常有价值。

八、结语

总结来说,随机丛林算法+XGBoost的算法在性能、鲁棒性和可解释性等方面都表现精彩,使其成为解决复杂题目的强大工具,也为农业数据预测提供了可靠的建模手段。
需项目资料/商业合作/交换探讨等可以添加下面个人手刺,感谢各位的喜欢与支持!
后续持续更新更多优质内容!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

金歌

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表