基于Flask(机器学习)的农作物产量预测与可视化分析系统(xgboost)

一、项目简介

基于Flask的农作物产量预测分析与可视化系统,旨在帮助农民和相关从业者更好地预测农作物产量,以优化农业生产。该系统主要包括四个功能模块。

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

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

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

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

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

二、开发环境

开发环境 版本/工具
PYTHON 3.6.8
开发工具 PyCharm
操作系统 Windows 10
内存要求 8GB 以上
浏览器 Firefox (推荐)、Google Chrome (推荐)、Edge
数据库 MySQL 8.0 (推荐)
数据库工具 Navicat Premium 15 (推荐)
项目框架 FLASK

三、项目技术

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

前端:Jinja2、Jquery、Ajax、layui

四、功能结构

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

机器学习预测农作物产量模型构建与训练:使用Scikit-learn、Pandas、NumPy构建机器学习模型,对农作物产量进行预测(数据集来自阿里云AI竞赛课题)。

用户登录与注册:通过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")

训练模型

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)
  df1 = pd.read_csv(path+"train_rice.csv",encoding="gbk")
  d = df1[["区县id","2017年晚稻"]]
  la = pd.merge(df,d,on="区县id")
  score = mean_squared_error(la["pre_xgboost"],la["2017年晚稻"])*0.5
  print(score)
  s = la[["区县id","pre_xgboost"]]
  s.to_csv('x_prediction.csv', index=False,encoding='gbk',header=True)

可视化核心业务

# 获取各个区县3年产量
def get_times_selling():
 sqlManager = SQLManager()
 sql = "SELECT round(SUM(early2015 + late2015 + early2016 + late2016 + early2017 + late2017), 2) as `value`, county as number, '产量分析' as name FROM `output` GROUP BY county, `name`;"
 res = sqlManager.get_list(sql)
 return res

# 近半年日照时常统计
def get_months_sun():
 times = ['2018-07', '2018-08', '2018-09', '2018-10', '2018-11', '2018-12']  # 半年
 data = []
 sqlManager = SQLManager()
 sql = "SELECT ROUND(avg(sun_time),2) as `value`  FROM `weather` where date_format(rec_time,'%%Y-%%m')=%s;"
 for t in times:
   res = sqlManager.get_one(sql, t)
   if not res or not res['value']:
     res['value'] = 0
   data.append({"time": t, "value": float(res['value']), "name": "近半年日照时常统计"})
 return data

# 近半年高低温统计
def get_months_temp():
 times = ['2018-07', '2018-08', '2018-09', '2018-10', '2018-11', '2018-12']  # 半年
 data_max = []
 data_min = []
 sqlManager = SQLManager()
 sql = "SELECT ROUND(avg(temp_max),2) as `value1` ,ROUND(avg(temp_min),2) as `value2`  FROM `weather` where date_format(rec_time,'%%Y-%%m')=%s;"
 for t in times:
   res = sqlManager.get_one(sql, t)
   if not res or not res['value1']:
     res['value1'] = 0
   if not res or not res['value2']:
     res['value2'] = 0
   data_max.append(float(res['value1']))
   data_min.append(float(res['value2']))
 return {'time': times, 'max': data_max, 'min': data_min}

七、数据库设计

数据库:agricultural_analysis

表名:notice

字段名称 数据类型 是否必填 注释
id int(11)
title varchar(255) 公告标题
content longtext 公告内容
user_name varchar(50) 发布人
create_time datetime 发布时间

表名:output

字段名称 数据类型 是否必填 注释
id int(11) 产量
county varchar(20) 县区
early2015 double(12,8) 2015早稻
early2016 double(12,8) 2016早稻
early2017 double(12,8) 2017早稻
late2015 double(12,8) 2015晚稻
late2016 double(12,8) 2016晚稻
late2017 double(12,8) 2017晚稻

表名:user

字段名称 数据类型 是否必填 注释
id int(11)
name varchar(255) 用户名称(供应商名称)
account varchar(255) 用户账号
password varchar(255) 用户密码
company varchar(255) 企业名称
mail varchar(255) 邮箱
type int(11) 0管理员,1普通用户
status int(11) 0禁用1启用

表名:weather

字段名称 数据类型 是否必填 注释
id int(11)
county varchar(20) 区县
rec_time date 记录日期
sun_time double(10,2) 日照时数(单位:h)
wind double(10,2) 日平均风速(单位:m/s)
rain double(10,2) 日降水量(mm)
temp_max double(10,2) 日最高温度(单位:℃)
temp_min double(10,2) 日最低温度(单位:℃)
temp_ave double(10,2) 日平均温度(单位:℃)
humidity double(10,2) 日相对湿度(单位:%)
hpa double(10,2) 日平均气压(单位:hPa)

八、源码获取

源码、安装教程文档、项目简介文档以及其它相关文档已经上传到是云猿实战官网,可以通过下面官网进行获取项目!

Logo

一站式 AI 云服务平台

更多推荐