1. 剪枝 (Pruning)
1.1 为什么需要剪枝?
决策树在训练时,如果任由其生长,可能会为了拟合训练数据中的每一个细节(包括噪声)而变得非常复杂。这样的树在训练集上表现完美,但在未见过的测试集上往往表现很差,也就是过拟合。
例子 :
沿用之前的打球数据集(天气与打球的关系),假如我们添加了一个特征"今天是否是我的幸运日",而这个特征在训练集中纯属巧合地与打球结果相关,决策树可能会用它来划分,导致模型在真实数据上失效。
剪枝就是通过删除树中那些对预测能力贡献不大、主要拟合了噪声或个别样本的枝叶,来简化模型,提高泛化能力。
1.2 剪枝的类型
主要分为预剪枝 和后剪枝。
预剪枝 (Pre-pruning)
在决策树生长过程中,提前停止分裂。
-
方法:设定一个阈值,比如信息增益小于某个值、节点包含的样本数少于某个数、树达到一定深度等,就停止分裂,将该节点直接作为叶节点,其类别为多数类。
-
优点:效率高,边建树边剪枝。
-
缺点:可能过早停止,导致欠拟合;阈值难以把握。
后剪枝 (Post-pruning)
先让树充分生长(甚至过拟合),然后自底向上对非叶节点进行考察,判断将其替换为叶节点是否能提升泛化性能。
-
常用方法 :代价复杂度剪枝 (Cost Complexity Pruning) 或 错误率降低剪枝 (Reduced Error Pruning)。
-
步骤:
-
生成一棵完全生长的树。
-
从底向上,尝试将某个子树替换为一个叶节点(叶节点的类别取该子树中样本最多的类别)。
-
用验证集评估替换前后的误差:如果替换后误差不增大(或下降),则进行剪枝,否则保留原树。
-
-
优点:更可靠,通常比预剪枝效果好。
-
缺点:需要额外的验证集,计算开销大。
1.3 直观理解
想象一棵长满枝叶的树,每个枝叶代表一个决策规则。剪枝就像园艺师修剪掉那些"无用"或"有害"的枝条,让树的主干更清晰,生命力更强(泛化能力更好)。
2. 随机森林 (Random Forest)
随机森林是一种集成学习方法,它通过构建多棵决策树并将它们的预测结果进行投票(分类)或平均(回归)来获得最终输出。
2.1 核心思想
-
集成学习:多个弱学习器组合成一个强学习器。如果每棵树都有些许差异,它们集体决策会比单棵树更稳定、准确。
-
Bagging (Bootstrap Aggregating) :对原始训练集进行有放回采样,生成多个不同的子训练集,每棵树在不同的子集上训练。
-
随机特征选择 :在每个节点分裂时,不是从所有特征中选最优,而是随机选择一部分特征(通常是 sqrt(总特征数) 或 log2(总特征数)),然后从中选最优特征分裂。这增加了树之间的多样性。
2.2 构建过程
-
假设原始训练集有 N 个样本,M 个特征。
-
对于每一棵树(共 T 棵):
-
从原始训练集中有放回地抽取 N 个样本,形成一个自助样本集 (bootstrap sample)。未被抽到的样本(约1/3)称为袋外数据 (OOB),可用于评估模型。
-
在构建树的每个节点时,随机选择 m 个特征(m << M),然后根据信息增益等准则从这 m 个特征中选择最佳分裂特征。
-
每棵树充分生长,通常不进行剪枝。
-
-
预测时,分类问题采用多数投票,回归问题采用平均值。
2.3 为什么随机森林效果好?
-
降低方差:单棵决策树对数据变化敏感(高方差)。通过 Bagging 和随机特征选择,多棵树的平均可以显著降低方差,同时保持较低的偏差。
-
防止过拟合:由于每棵树只看到部分样本和部分特征,它们不会过度拟合训练数据中的噪声。即使个别树过拟合,投票机制也能抵消其影响。
-
自带特征重要性评估:利用 OOB 数据或记录特征在树分裂中带来的纯度提升总和,可以评估每个特征的重要性。
2.4 剪枝 vs 随机森林
-
剪枝是对单棵树的"减法"操作,旨在简化模型。
-
随机森林是对多棵树的"加法"操作,通过组合来平衡偏差和方差。通常,随机森林中的树都保持完全生长(不剪枝),因为其方差已通过平均被控制,而完全生长的树偏差较低,组合后性能更好。
-
在某些场景下,对随机森林中的每棵树进行适度剪枝可能会进一步提升效率,但多数实践表明让树充分生长即可。
3. 总结
| 方法 | 目标 | 手段 | 适用场景 |
|---|---|---|---|
| 剪枝 | 防止单棵树过拟合 | 简化树结构(预剪枝/后剪枝) | 需要单一可解释模型,或作为决策树训练的必须步骤 |
| 随机森林 | 提高预测精度和稳定性 | 构建多棵随机树,集成投票 | 追求高准确率,能接受模型复杂度增加(黑箱) |