共计 2079 个字符,预计需要花费 6 分钟才能阅读完成。
决策树的局限性
决策树是机器学习中最直观的算法之一,它通过一系列 if-else 规则对数据进行分割。但单独使用决策树时,我们常常会遇到两个主要问题:

- 过拟合风险高:决策树会不断生长,直到完美拟合训练数据,导致对噪声数据过于敏感
- 稳定性差:训练数据的微小变化可能导致生成完全不同的树结构
这些问题使得单一决策树在实际应用中表现不稳定,特别是在复杂数据集上。这自然引出了集成学习的思想——为什么不把多个决策树组合起来呢?
随机森林的核心原理
1. Bootstrap 聚合(Bagging)
随机森林的基础是 Bagging 技术,其工作原理如下:
- 从原始训练集中有放回地随机抽取 n 个样本(bootstrap 样本)
- 用这个样本子集训练一棵决策树
- 重复上述过程 k 次,建立 k 棵决策树
- 对于分类问题采用投票法,回归问题采用平均法汇总结果
数学表达式为:
分类:ŷ = mode{tree₁(x), tree₂(x), ..., tree_k(x)}
回归:ŷ = (1/k) * Σ tree_i(x)
2. 特征随机选择
除了样本随机,随机森林在每棵树分裂节点时还会随机选择部分特征候选集(而非全部特征)。通常选择特征数为:
分类:sqrt(n_features)
回归:n_features/3
这种双重随机性(数据 + 特征)有效增强了模型的多样性,是抑制过拟合的关键。
实战代码演示
基础实现
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 加载数据
iris = load_iris()
X, y = iris.data, iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
# 关键参数说明:# n_estimators - 森林中树的数量
# max_features - 节点分裂时考虑的最大特征数
rf = RandomForestClassifier(
n_estimators=100,
max_features='sqrt',
random_state=42
)
rf.fit(X_train, y_train)
print(f"测试集准确率: {rf.score(X_test, y_test):.2f}")
对比实验
# 单一决策树 vs 随机森林对比
from sklearn.tree import DecisionTreeClassifier
dtree = DecisionTreeClassifier(max_depth=3)
dtree.fit(X_train, y_train)
print("单一决策树测试集准确率:", dtree.score(X_test, y_test))
print("随机森林测试集准确率:", rf.score(X_test, y_test))
典型输出结果:
| 模型 | 训练集准确率 | 测试集准确率 |
|——|————-|————-|
| 决策树 | 0.98 | 0.92 |
| 随机森林 | 1.00 | 0.96 |
进阶应用技巧
特征重要性评估
import matplotlib.pyplot as plt
importances = rf.feature_importances_
features = iris.feature_names
plt.barh(features, importances)
plt.title("Feature Importance")
plt.show()
超参数调优
from sklearn.model_selection import GridSearchCV
param_grid = {'n_estimators': [50, 100, 200],
'max_depth': [None, 5, 10],
'min_samples_split': [2, 5, 10]
}
grid_search = GridSearchCV(
estimator=rf,
param_grid=param_grid,
cv=5,
n_jobs=-1
)
grid_search.fit(X_train, y_train)
print("最佳参数:", grid_search.best_params_)
性能优化建议
- 树的数量 (n_estimators) 越多越好,但会增大内存消耗
- 使用
n_jobs参数并行化训练(- 1 表示使用所有 CPU 核心) - 对于大数据集考虑设置
max_samples参数
开放性问题
- 当特征维度远大于样本量时(如文本数据),随机森林的表现会如何变化?是否需要特殊处理?
- 与梯度提升树 (GBDT) 相比,随机森林在哪些场景下更具优势?它们的核心差异是什么?
- 在需要模型解释性的领域(如金融风控),如何平衡随机森林的预测性能与可解释性要求?
随机森林以其 ” 简单但有效 ” 的特点,成为机器学习工程师工具箱中的必备利器。通过理解其核心思想并掌握这些实践技巧,你可以在保持模型鲁棒性的同时,充分发挥其强大的预测能力。
正文完
发表至: 未分类
近一天内
