共计 2094 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点:为什么需要预测概率?
传统的地理空间分类任务中,模型通常只输出最终的类别标签(如 ” 林地 ” 或 ” 水域 ”)。这种单一结果的输出方式存在明显局限:

- 信息丢失:无法判断模型对预测结果的置信程度。例如,同样是预测为 ” 城市用地 ”,可能是 90% 概率的确定判断,也可能是 51% 概率的勉强选择。
- 决策风险:在关键应用中(如灾害风险评估),仅知道最终类别而不知其可靠性,可能导致决策失误。
- 后续分析受限:难以进行不确定性量化或概率敏感性分析。
技术解析:随机森林如何计算预测概率
随机森林通过多棵决策树的 ” 软投票 ”(soft voting)机制计算类别概率。具体公式为:
P(y=c|x) = (1/T) * Σᵢ I[hᵢ(x)=c]
其中:
– T是决策树总数
– hᵢ(x)是第 i 棵树对样本 x 的预测类别
– I[]是指示函数(预测为 c 时值为 1,否则为 0)
例如,若有 100 棵树,某像素被 60 棵树预测为 ” 农田 ”,30 棵为 ” 林地 ”,10 棵为 ” 裸地 ”,则概率分布为:[0.6, 0.3, 0.1]。
ArcGIS Pro 中的实现细节
在【空间分析工具】→【机器学习分类】→【训练随机森林分类器】工具中:
- 勾选 ’ 包含所有预测概率 ’ 时:
- 为每个类别生成单独的概率字段
- 字段命名规则:
类名_Prob(如 ” 农田_Prob”) -
输出示例:某要素属性表包含字段[农田_Prob, 林地_Prob, 裸地_Prob]
-
未勾选时:
- 仅保留
Confidence字段(最高概率值) - 丢失其他类别的概率分布信息
Python 实战:概率提取与分析
1. 提取概率字段
import arcpy
# 假设输出要素类路径
output_fc = "C:/data/classification_result.shp"
# 获取所有概率字段(名称以 '_Prob' 结尾)prob_fields = [f.name for f in arcpy.ListFields(output_fc, "*_Prob")]
# 创建搜索游标读取数据
with arcpy.da.SearchCursor(output_fc, ["OID@"] + prob_fields) as cursor:
for row in cursor:
print(f"要素 ID {row[0]} 的概率分布: {dict(zip(prob_fields, row[1:]))}")
2. 计算概率熵值(评估确定性)
import numpy as np
def calculate_entropy(prob_array):
"""计算概率分布的熵值(值越小表示预测越确定)"""
return -np.sum(prob_array * np.log(prob_array + 1e-10)) # 加小量避免 log(0)
# 示例:对单个要素的概率计算熵值
probabilities = [0.8, 0.15, 0.05] # 三个类别的预测概率
entropy = calculate_entropy(probabilities)
print(f"熵值: {entropy:.3f}") # 输出示例:0.423
3. 生成概率热力图
import matplotlib.pyplot as plt
# 模拟三个类别的概率栅格(实际应用中需从要素类转换)prob_arrays = {"农田": np.random.rand(100,100)*0.8,
"林地": np.random.rand(100,100)*0.6,
"裸地": np.random.rand(100,100)*0.3
}
# 绘制多子图
fig, axes = plt.subplots(1, 3, figsize=(15,5))
for ax, (cls_name, prob) in zip(axes, prob_arrays.items()):
im = ax.imshow(prob, vmin=0, vmax=1, cmap='RdYlGn')
ax.set_title(f"{cls_name}概率")
fig.colorbar(im, ax=ax)
plt.tight_layout()
plt.savefig("probability_heatmaps.png")
避坑指南
- 数据类型陷阱:
- ArcGIS 可能将概率字段存储为文本(特别是从 SHP 导出时)
-
解决方案:使用
arcpy.ConvertField_management()转换为浮点型 -
内存优化:
- 处理多波段影像时,建议分块处理(使用
arcpy.sa.Tile) -
关闭不必要的中间文件(设置
arcpy.env.workspace到内存"memory") -
阈值选择:
- 对关键类别(如 ” 洪涝风险区 ”)可设置概率阈值(如仅当概率 >0.7 时才采纳)
- 使用
arcpy.SelectLayerByAttribute_management()筛选高概率区域
思考题
- 在国土调查中,如何利用多类别概率输出改进 ” 边缘像元 ” 的分类精度?
- 当不同类别的预测概率非常接近时(如[0.35,0.32,0.33]),应采用哪些策略提高确定性?
- 如何将预测概率与后续的空间统计分析(如热点分析)相结合?
通过充分理解概率输出,我们不仅能获得更丰富的模型信息,还能为空间决策提供更科学的依据。建议在实际项目中尝试对比勾选 / 不勾选该选项的结果差异,亲身体验概率数据的价值。
正文完
发表至: 地理信息系统
近一天内
