摘要
随机森林是一种集成学习方法,通过构建多棵决策树来提高预测的准确性和稳定性。其实现原理可以类比为“班级投票选班长”的过程:首先,将全班同学随机分成若干小组,每个小组独立选出小组长;然后,所有小组长投票选出最终班长。在随机森林中,每个小组代表一棵决策树,小组成员随机分配对应随机采样数据,评判标准不同对应随机选择特征,小组长投票对应多棵树投票,最终班长对应随机森林的预测结果。通过数据采样、特征随机性、训练多棵决策树和集成投票,随机森林能够避免偏见、抗干扰,并提高决策的准确性。代码实现和流程图进一步直观展示了这一过程。
随机森林的实现原理——“班级投票选班长”故事版
1. 场景设定
假设你们班要选班长,但班里同学太多,大家意见不统一。于是,老师想了个办法:
- 把全班同学随机分成若干个小组(比如10个小组)。
- 每个小组内部先选出一个“小组长”。
- 最后,让这10个小组长投票,票数最多的人成为班长。
2. 细节展开
(1)每个小组的“选举”过程
- 每个小组的同学不完全一样(随机分组)。
- 每个小组评判标准也不一样(有的看学习成绩,有的看体育,有的看人缘)。
- 每个小组独立选出自己心目中的“小组长”。
(2)最终投票
- 10个小组长把自己选出来的候选人名单拿出来投票。
- 得票最多的人成为全班班长。
3. 对应到随机森林
- 每个小组 = 一棵“决策树”
- 小组成员随机分配 = 随机采样数据(Bootstrap采样)
- 评判标准不同 = 随机选择特征(每棵树只看部分特征)
- 小组长投票 = 多棵树投票,少数服从多数
- 最终班长 = 随机森林的最终预测结果
技术版简述
- 数据采样:从原始数据中有放回地随机采样,生成多份“训练集”。
- 特征随机性:每棵树在分裂节点时,只随机选取部分特征进行判断。
- 训练多棵决策树:每份数据训练一棵决策树。
- 集成投票:所有树对新样本进行预测,最终结果由多数投票决定(分类)或平均(回归)。
为什么这样做?
- 多样性:每棵树看到的数据和特征都不一样,避免大家“想法太一致”导致偏差。
- 抗干扰:即使有一两棵树判断错了,大多数树还是能做出正确决策。
- 准确率高:集体智慧通常比单打独斗更靠谱。
总结
随机森林就像一群有不同观点的小组长,大家各自独立思考,最后投票决定班长。这样既能避免偏见,又能提高决策的准确性和稳定性。
下面我会用具体代码和流程图,帮助你更直观地理解随机森林的实现原理。
一、简化版随机森林代码实现(Python伪代码)
我们用sklearn的RandomForestClassifier
做一个简化演示,并用注释说明每一步。
import numpy as np
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
# 1. 加载数据
iris = load_iris()
X, y = iris.data, iris.target
# 2. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 3. 创建随机森林模型(假设有5棵树)
rf = RandomForestClassifier(n_estimators=5, max_depth=3, random_state=42)
# 4. 训练模型
rf.fit(X_train, y_train)
# 5. 预测
y_pred = rf.predict(X_test)
# 6. 查看每棵树的预测结果
for i, tree in enumerate(rf.estimators_):
print(f"第{i+1}棵树的预测:", tree.predict(X_test))
# 7. 最终投票结果
print("随机森林最终投票结果:", y_pred)
说明:
n_estimators=5
表示森林里有5棵树。- 每棵树都用不同的数据子集和特征子集训练。
- 最终预测是所有树的投票结果。
二、流程图(文字版)
原始数据集
|
|---> 随机采样1(有放回)---> 决策树1(只用部分特征)
|
|---> 随机采样2(有放回)---> 决策树2(只用部分特征)
|
|---> 随机采样3(有放回)---> 决策树3(只用部分特征)
|
| ...
|
|---> 随机采样N(有放回)---> 决策树N(只用部分特征)
|
|-----------------------------|
|
多数投票/平均
|
最终结果
三、流程图(图片版)
你可以用如下Mermaid语法在支持的平台画出流程图:
flowchart TD
A[原始数据集] --> B1[随机采样1]
A --> B2[随机采样2]
A --> B3[随机采样3]
A --> Bn[随机采样N]
B1 --> C1[决策树1(部分特征)]
B2 --> C2[决策树2(部分特征)]
B3 --> C3[决策树3(部分特征)]
Bn --> Cn[决策树N(部分特征)]
C1 --> D[投票/平均]
C2 --> D
C3 --> D
Cn --> D
D --> E[最终结果]
四、代码细节补充
你还可以查看每棵树的特征重要性:
for i, tree in enumerate(rf.estimators_):
print(f"第{i+1}棵树特征重要性:", tree.feature_importances_)
以及整体特征重要性:
print("整体特征重要性:", rf.feature_importances_)
五、总结
- 每棵树:用不同的数据和特征训练,彼此独立。
- 集成投票:每棵树给出自己的判断,最终结果由“少数服从多数”决定。
- 流程图:帮助你理解数据如何流经每棵树,最后汇总。