注:该内容由“数模加油站”原创,无偿分享,可以领取参考但不要利用该内容倒卖,谢谢!
A 题 农业灌溉系统优化
问题1思路框架:
1.1 研究背景与问题意义
土壤湿度是农业生产中影响作物根系水分供应的关键环境指标。5厘米深度的土壤湿度指标5cm_SM能较准确反映作物根系活跃层的水分状况,是制定合理灌溉计划的基础。气象因素(气温、气压、降水、风速等)通过影响蒸发和水分补给等过程,动态作用于土壤湿度的变化。因此,准确预测土壤湿度5cm_SM,结合实时气象数据,能够显著提升农业灌溉效率和水资源利用率。
本题目标是构建一个准确的数学模型,量化土壤湿度5cm_SM与多维气象数据之间的复杂非线性关系,并利用模型对目标日期的土壤湿度进行预测,支持后续灌溉系统优化设计。
1.2 数据预处理与探索性分析
1.2.1 时间同步与数据清洗
- 将土壤湿度数据与逐小时气象数据的时间戳统一格式,确保对应时间点数据匹配。
- 采用插值法填补缺失数据,剔除缺失过多或异常样本。
- 通过箱线图、直方图等方法检测异常值并做处理。
1.2.2 变量统计分析与相关性筛选
- 计算各气象变量的均值
、标准差
、极值等统计量,了解数据分布特征。
- 计算土壤湿度5cm_SM与各气象因子的皮尔逊相关系数:
- 筛选相关系数绝对值较大(如|
| > 0.3)的气象变量作为候选特征,剔除强共线性变量。
1.3 土壤湿度预测模型构建
1.3.1 特征工程
- 采用筛选后的气象指标(如气温T、相对湿度U、气压P、降水量RRR、风速Ff等)作为输入特征。
- 构造滞后特征,如前1小时土壤湿度预测值、前几小时降水量累积值,以捕捉时间依赖。
- 对特征进行归一化或标准化,促进模型训练稳定。
1.3.2 XGBoost回归模型详细应用
模型形式
设训练样本为,其中
为多维气象特征向量,
为对应的土壤湿度5cm_SM。XGBoost模型预测为:
为回归树函数集合,每棵树f_k对应一个树结构和叶权重。
目标函数
优化目标结合训练误差和正则化项:
其中,为第k棵树叶子数,
为叶子权重,
为正则化参数。
训练迭代
- 迭代添加新树拟合当前残差,采用二阶梯度优化提升效率。
- 树的分裂依据最大化增益计算:
G_L, H_L分别为左子节点一阶和二阶梯度和,右子节点类似。
参数调优
- 树的最大深度max_depth,防止过拟合。
- 学习率eta控制每棵树贡献。
- 树数量K及子样本比例。
- 正则化系数
。
- 利用交叉验证确定最优参数组合。
1.4 模型训练与评估
1.4.1 训练集测试集划分
- 按时间序列划分,防止未来信息泄漏。
- 可用滚动窗口交叉验证评估模型泛化能力。
1.4.2 评估指标
- 均方误差(MSE)、均方根误差(RMSE)、平均绝对误差(MAE)、决定系数R^2。
- 选用多个指标综合评价。
1.5 预测应用与结果展示
- 利用训练好的XGBoost模型对题目中指定日期逐小时气象数据进行预测。
- 填写表2“预测的当天湿度5cm_SM”栏目。
- 可绘制预测值与实际观测值的对比图,直观展示模型效果。
1.6 讨论与改进方向
- 可以引入更多交互项、多阶特征增强模型表达力。
- 探索LSTM等深度时序模型以捕获更长时依赖。
- 融合空间信息,提升局部预测准确性。
- 持续优化特征选取与超参数,提升模型稳定性。
1.7 小结
本问题通过数据清洗、特征筛选,结合XGBoost回归模型建立了土壤湿度5cm_SM的准确预测系统,利用梯度提升树高效捕捉非线性多维关系,实现了基于气象数据的动态土壤湿度预测。该模型为后续灌溉方案设计提供了坚实的数据支持。
Python代码:
# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as snsfrom sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
from xgboost import XGBRegressor# 1. 读取数据
# 替换为你本地的文件路径
soil_df = pd.read_excel('该地土壤湿度数据.xlsx')
weather_df = pd.read_excel('降水量等逐时气象数据.xls')# 2. 数据预处理
## 假设两表均有时间列'Time',且格式为字符串或datetime
# 转换为datetime格式
soil_df['Time'] = pd.to_datetime(soil_df['Time'])
weather_df['Time'] = pd.to_datetime(weather_df['Time'])# 以时间为索引,方便合并
soil_df.set_index('Time', inplace=True)
weather_df.set_index('Time', inplace=True)# 3. 时间对齐 - 取时间交集
common_index = soil_df.index.intersection(weather_df.index)
soil_df = soil_df.loc[common_index]
weather_df = weather_df.loc[common_index]# 4. 合并数据
data = pd.concat([soil_df, weather_df], axis=1)# 5. 缺失值处理 - 简单方法:删除含缺失值的行
data = data.dropna()# 6. 相关性分析
# 计算土壤湿度5cm_SM与其他气象指标相关性
target_col = '5cm_SM' # 请根据实际列名调整
corr = data.corr()[target_col].drop(target_col)
print("与土壤湿度5cm_SM相关性排序:")
print(corr.abs().sort_values(ascending=False))# 7. 特征选择
# 选择与土壤湿度相关系数绝对值大于0.3的变量
selected_features = corr[ corr.abs() > 0.3 ].index.tolist()
print("选取特征:", selected_features)# 8. 构造滞后特征(如前1小时土壤湿度)
data['5cm_SM_lag1'] = data[target_col].shift(1)
data = data.dropna()# 更新特征列表,加入滞后特征
selected_features.append('5cm_SM_lag1')# 9. 准备训练数据与标签
X = data[selected_features]
y = data[target_col]# 10. 数据集划分,时间序列方式,前80%训练,后20%测试
split_index = int(len(data) * 0.8)
X_train, X_test = X.iloc[:split_index], X.iloc[split_index:]
y_train, y_test = y.iloc[:split_index], y.iloc[split_index:]# 11. 建立XGBoost回归模型
xgb_model = XGBRegressor(n_estimators=100,max_depth=5,learning_rate=0.1,objective='reg:squarederror',random_state=42
)# 12. 模型训练
xgb_model.fit(X_train, y_train)# 13. 预测
y_pred_train = xgb_model.predict(X_train)
y_pred_test = xgb_model.predict(X_test)# 14. 评估指标函数
def evaluate(y_true, y_pred, label=""):mse = mean_squared_error(y_true, y_pred)rmse = np.sqrt(mse)mae = mean_absolute_error(y_true, y_pred)r2 = r2_score(y_true, y_pred)print(f"【{label}】MSE: {mse:.4f}, RMSE: {rmse:.4f}, MAE: {mae:.4f}, R^2: {r2:.4f}")# 15. 输出训练与测试评估结果
evaluate(y_train, y_pred_train, "训练集")
evaluate(y_test, y_pred_test, "测试集")# 16. 重要特征可视化
importance = xgb_model.feature_importances_
plt.figure(figsize=(10,6))
sns.barplot(x=importance, y=selected_features)
plt.title('XGBoost特征重要性')
plt.show()# 17. 预测结果可视化 — 测试集
plt.figure(figsize=(12,6))
plt.plot(y_test.index, y_test.values, label='真实值')
plt.plot(y_test.index, y_pred_test, label='预测值', alpha=0.7)
plt.xlabel('时间')
plt.ylabel('土壤湿度 5cm_SM')
plt.title('土壤湿度预测对比(测试集)')
plt.legend()
plt.show()# 18. 利用训练好的模型预测给定某天逐小时气象数据(示例)
# 假设有一个DataFrame new_weather_df 包含该天逐小时选定特征(包括滞后特征5cm_SM_lag1)
# new_weather_df = pd.read_excel('表2给定气象数据.xlsx') # 读取示例数据
# new_predictions = xgb_model.predict(new_weather_df[selected_features])
# print(new_predictions)
后续都在“数模加油站”......