共计 1719 个字符,预计需要花费 5 分钟才能阅读完成。
为什么需要预测土壤属性?
土壤属性(如 pH 值、有机质含量等)是农业、生态保护等领域的重要基础数据。传统方法依赖实验室分析 + 空间插值,不仅成本高,还容易忽略局部变异特征(比如山脊和谷底的土壤性质差异)。而机器学习方法能有效挖掘环境因子(地形、植被指数等)与土壤属性的非线性关系。

算法选型:为什么是随机森林?
- 对比 SVM:随机森林天然适合高维特征,不需要像 SVM 那样手动设计核函数
- 对比神经网络:训练速度快,超参数少,且自带特征重要性评估
- 核心优势:
- 通过多棵树投票降低过拟合风险
- 能自动处理缺失值和特征共线性
- 输出结果可解释性强(比如坡度比高程对预测影响更大)
实战步骤详解
1. 数据准备与特征工程
import arcpy
from sklearn.ensemble import RandomForestRegressor
# 从 DEM 提取地形特征
arcpy.ddd.Slope('dem.tif', 'slope')
arcpy.ddd.Aspect('dem.tif', 'aspect')
# 将采样点与环境因子关联
arcpy.sa.ExtractMultiValuesToPoints(
'soil_samples.shp',
['slope', 'aspect', 'ndvi.tif'],
'BILINEAR')
2. 模型训练与调参
import pandas as pd
from sklearn.model_selection import train_test_split
# 读取属性表
data = pd.DataFrame(arcpy.da.TableToNumPyArray('soil_samples.shp'))
# 拆分训练集 / 测试集(注意空间分层抽样!)X_train, X_test, y_train, y_test = train_test_split(data[['slope', 'aspect', 'NDVI']],
data['pH'],
test_size=0.3,
stratify=data['landuse_type']) # 按土地利用类型分层
# 关键参数设置
model = RandomForestRegressor(
n_estimators=200, # 树的数量
max_depth=15, # 防止过拟合
min_samples_leaf=5,
n_jobs=-1) # 使用所有 CPU 核心
3. 精度验证与结果输出
from sklearn.metrics import mean_absolute_error
import matplotlib.pyplot as plt
# 预测并评估
y_pred = model.predict(X_test)
print(f'MAE 误差: {mean_absolute_error(y_test, y_pred):.2f}')
# 特征重要性可视化
plt.barh(X_train.columns, model.feature_importances_)
plt.show()
# 将预测结果写回 GIS
arcpy.management.CopyFeatures('test_samples.shp', 'predictions.shp')
arcpy.da.ExtendTable(
'predictions.shp', 'FID',
pd.DataFrame({'pred_pH': y_pred}).reset_index(), 'index')
避坑指南
- 空间自相关陷阱:
- 错误做法:随机划分训练 / 测试集会导致数据泄漏
-
正确方案:使用空间块交叉验证(
sklearn.model_selection.ShuffleSplit) -
特征共线性处理:
- 地形指数(如 TWI)常与坡度高度相关
-
解决方案:先用 PCA 降维或删除 VIF>10 的特征
-
Pro 3.0+ 版本注意:
arcpy.sa模块部分函数改用了新参数名- 推荐始终使用 conda 环境管理 Python 库依赖
进阶思考
如何将训练好的模型封装成地理处理工具?可以考虑:
– 用 arcpy.GetParameterAsText() 获取用户输入的采样点
– 通过 pickle 保存模型对象
– 创建自定义工具箱(.tbx)并设置参数验证规则
最终目标是让农技人员只需点击几下就能生成预测图——这才是空间智能的真正价值。
正文完
发表至: 地理信息系统
近一天内
