1. 先区分两种 Random Forest:分类 vs 回归
🟢 分类 RF(RandomForestClassifier)
-
目标变量是 类别,比如:
-
0 = 不发生滑坡 / 不发生冲突
-
1 = 发生滑坡 / 发生冲突
-
也就是 "有 / 没有"、"属于哪一类"。
🔵 回归 RF(RandomForestRegressor)
-
目标变量是 连续数值,比如:
-
某栅格格点的死亡人数
-
某格点的事件次数
-
某处经济损失的金额
-
也就是 "有多大 / 有多少" 这种量。
2. 分类 RF:predict() vs predict_proba()
2.1 predict(X) ------ 给你"类别结果"
- 输出是:0 或 1(或者多个类别 A/B/C)
举个例子:
你用的是二分类:0=不发生滑坡,1=发生滑坡。
y_pred = clf.predict(X)
可能得到:
[0, 0, 1, 1, 0, 1, ...]
意思就是:
-
第 1 个样本:模型判断"不发生"
-
第 3 个样本:模型判断"会发生"
特点:
-
这是模型最终"下决定"的结果。
-
如果你把这个直接写进栅格,地图上就是 0/1 的 分类图(发生/不发生)。
2.2 predict_proba(X) ------ 给你"概率(置信度)"
probs = clf.predict_proba(X)
对于二分类,probs 每一行是两个数:
[ [0.9, 0.1], [0.3, 0.7], [0.2, 0.8], ... ]
如果类别顺序是 [0, 1],那:
-
第一行
[0.9, 0.1]=-
P(类别0) = 0.9(不发生的概率 0.9)
-
P(类别1) = 0.1(发生的概率 0.1)
-
我们最常用的是 "发生"这一类的概率,也就是第二列:
p_event = probs[:, 1] # 发生滑坡/冲突的概率
比如得到:
[0.1, 0.7, 0.8, 0.05, ...]
特点:
-
输出是 0--1 之间的连续值,可直接理解为:
👉"这个位置发生事件的概率/风险大小"
-
如果你把它写回点 → 再转栅格,就是一幅 风险概率图,非常适合做 0--1 的风险图、热度图。
你可以这样理解:
-
predict()= 模型帮你"拍板":发生 / 不发生(0/1) -
predict_proba()= 模型告诉你它的"信心":发生的可能性是 0.8 还是 0.2
在空间风险制图里,一般 更喜欢用 predict_proba 的结果 来做图。
3. 回归 RF:只有 predict()(没有概率)
回归模型(RandomForestRegressor)的目标是一个连续值:
reg = RandomForestRegressor(...) y_pred = reg.predict(X)
举例:
-
你训练的是 "某栅格的冲突事件次数"
- 输入一堆因子 → 输出可能是:0.3 次、2.7 次、5.1 次...
-
或者 "死亡人数"
- 预测结果可能是:0.0、12.5、3.2 ...
这里的 predict() 就是你想要的"数值预测结果",本身就是连续的。
典型区别:
-
分类 RF:
predict()给 0/1、A/B/C(离散) -
回归 RF:
predict()给 3.7、10.2 这种连续数
注意:
回归 RF 一般 没有 predict_proba(),因为回归本身就不是"概率意义的分类",而是直接预测数值。
4. 跟你这套流程的关系(帮你选用哪个)
结合你现在这套"因子栅格 → 转点 → 提取多因子 → RF → 写回 prediction → 转栅格"的流程来看:
如果你的标签是 0/1(有事件 / 无事件):
-
这是 分类问题。
-
推荐做法:
-
用
RandomForestClassifier训练模型; -
用
predict_proba(X)得到每个点/像元的 发生概率(取类别 1 的那一列); -
把这个概率写到
prediction字段 → 再转成栅格。
-
-
得到的结果:
👉 每个像元是一个 0--1 的概率值,可以说"这里发生事件的概率是 0.73"。
如果你的标签是 连续数量(比如次数、死亡人数等):
-
这是 回归问题。
-
做法:
-
用
RandomForestRegressor; -
predict(X)得到连续数值; -
写入
prediction字段 → 转栅格。
-
-
得到的结果:
👉 每个像元是 "预测的次数/人数"。
5. 一句简短总结
-
分类 RF:
-
predict():给你分类结果(0/1),适合做"发生 / 不发生"图。 -
predict_proba():给你类别的概率(0--1),适合做"风险概率图"。
-
-
回归 RF:
- 只有
predict():直接给连续数值(强度/次数/损失),适合做"强度分布图"。
- 只有