注:該內容由“數模加油站”原創,無償分享,可以領取參考但不要利用該內容倒賣,謝謝!
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)
后續都在“數模加油站”......?