欢迎来到决策树的世界!
在本节中,我们将学习如何实际“种植”一棵决策树,或许更重要的是,如何对其进行“修剪”,使其能够在处理新数据时发挥完美的效能。想象决策树就像一株真正的植物:如果你任由它随意生长而不加维护,它会长成一团混乱、难以打理的杂草。但如果你仔细修剪,它就会变成一个强大且好用的预测工具。
决策树深受精算师喜爱,因为它们很容易向利益相关者(如你的上司或客户)解释,而且它们反映了人类决策的思维方式。让我们开始吧!
快速回顾:请记住,决策树会根据输入变量的数值,将数据拆分为不同的组别(称为节点 (nodes))。最底层的最终分组称为叶节点 (leaves) 或终端节点 (terminal nodes)。
第一步:建立决策树(递归二元拆分)
当我们开始构建决策树时,我们会使用一种称为递归二元拆分 (Recursive Binary Splitting) 的过程。别让这个名称吓到你,拆解开来看其实很简单:
1. 递归 (Recursive):我们针对产生的每一个分支重复同样的拆分过程。
2. 二元 (Binary):每次拆分只会产生“两个”分支(例如:“是”或“否”)。
3. 拆分 (Splitting):我们正在将数据划分为更小的群组。
“贪婪”策略 (Greedy Approach):
建立决策树是一个贪婪算法。这意味着在每一步中,计算机都会寻找当下能使模型表现提升的“最佳拆分”。它不会预测现在选择一个稍微“差一点”的拆分是否会导致未来出现更好的拆分,它只专注于当下!
我们如何决定哪个拆分是“最佳”的?
这取决于我们要预测的目标:
对于回归树(预测数值):
我们希望最小化残差平方和 (Residual Sum of Squares, RSS)。我们希望每个最终叶节点中的数据点,都能尽可能接近该叶节点的平均值。公式如下:
\( RSS = \sum_{j=1}^{J} \sum_{i \in R_j} (y_i - \hat{y}_{R_j})^2 \)
解释:我们想要最小化所有最终区域 (\( R_j \)) 的总平方误差。
对于分类树(预测类别):
我们希望产生的分组尽可能“纯”。如果一个叶节点包含 100% 的“类别 A”和 0% 的“类别 B”,那么它就是完全纯的。我们通常使用基尼系数 (Gini Index) 或熵 (Entropy) 来衡量。数值越低,代表该组越“纯”。
你知道吗?基尼系数通常被称为衡量节点不纯度 (node impurity) 的指标。如果基尼系数为 0,则代表该节点完全纯净(组内所有数据皆属于同一个类别)。
总结要点:我们由上而下建立决策树,一次只进行一个拆分,并选择在当下能最大程度减少误差 (RSS) 或不纯度 (Gini/Entropy) 的拆分方式。
第二步:长得太大的风险
如果我们不断地拆分数据,直到数据集中的每个人都有自己专属的叶节点,我们在训练集 (training data) 上的错误率将会是 0%。但这有一个大问题:过度拟合 (Overfitting)。
过度拟合是指决策树学习到了你特定数据集中的“噪音”或随机特征,而非真正的模式。一个过度拟合的决策树就像是一个只会死背考古题答案的学生,却没理解背后的数学原理——当真正的考试题目数字变动时,他们就会失败!
偏差与方差权衡 (Bias-Variance Tradeoff):
- 一棵巨大且复杂的树具有高方差 (High Variance)(如果你稍微改变数据,结果就会产生巨大变化)。
- 一棵只有一个拆分、过于简单的树具有高偏差 (High Bias)(它过于简单,无法捕捉到真正的模式)。
第三步:修剪决策树(成本复杂度修剪)
为了修正过度拟合,我们会先长出一棵很大的树,然后将其“修剪”成较小的子树 (subtree)。但我们不能随机选择子树,因为可能性太多了!因此,我们使用成本复杂度修剪 (Cost-Complexity Pruning)(也称为最弱连接修剪 (Weakest Link Pruning))。
我们使用一个特殊的评分指标来决定该切除哪些分支。该评分公式为:
\( \sum_{m=1}^{|T|} \sum_{i \in R_m} (y_i - \hat{y}_{R_m})^2 + \alpha|T| \)
让我们用“精算语言”拆解这个公式:
1. 第一部分 \( \sum \sum (y_i - \hat{y}_{R_m})^2 \) 就是 RSS(树对数据的拟合程度)。
2. 第二部分 \( \alpha|T| \) 是惩罚项 (Penalty)。
- \( |T| \) 是终端节点(叶节点)的数量。叶节点越多,复杂度越高。
- \( \alpha \) (alpha) 是调整参数 (tuning parameter)。这是我们选择的一个数值,用来控制我们对“过于复杂的树”惩罚的力度。
\(\alpha\) 如何运作:
- 如果 \( \alpha = 0 \):没有惩罚!我们得到的是原本那棵巨大的树。
- 如果 \( \alpha \) 非常大:惩罚极高!最终我们会得到一棵非常小的树(甚至可能只有一个节点)。
- 当我们将 \( \alpha \) 从零开始增加时,分支会以特定且可预测的顺序被逐一修剪掉。
记忆小撇步:将 \( \alpha \) 想成是对叶节点征收的“税”。如果税收很低,树可以负担得起很多叶子;如果税收很高,为了保持“获利”,树必须缩减规模。
总结要点:修剪能帮助我们在过于简单与过于复杂之间找到平衡。我们通过调整参数 \( \alpha \) 来控制这种平衡。
第四步:选择最佳的 Alpha (\(\alpha\))
我们如何知道该使用哪个 \(\alpha\) 值呢?答案是使用 K-折交叉验证 (K-Fold Cross-Validation)!
1. 将你的数据分成 \( K \) 个部分(折)。
2. 对于每个 \( \alpha \) 值,在其中几个折上建立树,并在剩余的折上进行测试。
3. 选择那个在测试集上能产生最低平均误差的 \( \alpha \)。
避免常见错误:不要选择那个让树在你的训练数据上表现最好的 \( \alpha \)。一定要使用验证数据或交叉验证来选择 \( \alpha \)。否则,你又会掉进过度拟合的陷阱!
步骤流程总整理
别担心,这看起来有很多步骤。以下是建立一棵优秀决策树的标准“食谱”:
1. 使用递归二元拆分在训练数据上长出一棵大树。(直到节点变得非常小才停止)。
2. 应用成本复杂度修剪,根据 \( \alpha \) 的函数找到一系列最佳子树。
3. 使用K-折交叉验证选择最佳的 \( \alpha \)。
4. 选定对应于你所选 \( \alpha \) 的子树,这就是你的最终模型。
最终快速回顾表
- 生长策略:由上而下、贪婪、递归二元拆分。
- 回归目标:最小化 RSS。
- 分类目标:最小化基尼系数或熵。
- 问题:大树会过度拟合(高方差)。
- 解决方案:使用惩罚项 \( \alpha|T| \) 进行修剪。
- 调校:使用交叉验证选择最佳 \( \alpha \)。
你一定没问题的!决策树的核心就是尽可能进行最佳拆分,然后在之后进行清理,确保模型在处理新数据时依然“聪明”。