首先我们回顾一下决策树。决策树就像是一个挑选路线的指示牌,通过一系列的是非问题来帮你做决定。比如说,你想预测明天会不会下雨,决策树可能会问:“今天云多吗?”、“湿度高不高?”根据你的回答,它会告诉你最后的预测结果。
但问题来了,如果这个指示牌上的指示太多太复杂,你不仅跟着它走得晕头转向,而且有时候它给出的建议可能在其他情况下就不太管用了。这就是所谓的过拟合——决策树太过于匹配我们手头上的这点数据,反而丢失了一些普遍性,导致它在面对新情况时判断失误。
为了解决这个问题,就有了剪枝处理。剪枝就像是给这个决策树进行了一次“瘦身”,去掉一些不那么重要的分叉,使得这个树模型更加简洁、更具有泛化能力。这样,当有新情况出现时,决策树就能更加稳健地做出预测。
那么,为啥要发明剪枝呢?主要是为了防止决策树变得太复杂,以至于只能解决眼前的数据,对新的数据无能为力。通过剪枝,模型就能更好地推广到其他数据上,即提高模型的泛化能力。
决策树剪枝在任何你需要使用决策树模型的地方都很有帮助。无论是在银行判断是否批贷款,在医院预测病情发展,还是在商店推荐商品,只要是需要通过一系列判断来得出结论的场景,剪枝处理都能帮助决策树模型变得更加强大、更加适用。简而言之,剪枝就是为了让决策树不仅能在当前数据上表现好,也能在未来遇到新情况时,依然能做出靠谱的判断。
决策树的剪枝处理是为了解决决策树容易过拟合的问题,通过减少决策树的复杂度(如减少决策树的深度或叶节点数目)来防止过拟合。
剪枝处理主要有预剪枝和后剪枝两种方法。
预剪枝就像是我们在种树时,边种边修剪的过程。我们的目的是种一棵既健康又不会长得乱七八糟的树。在树苗长大的过程中,我们会时不时地观察它的每一个分叉,思考一下:如果让这个分叉继续长下去,它能不能让整棵树变得更好?是不是每个分叉都有它存在的价值呢?
如果我们发现某个分叉长出来后,可能不会对整棵树有什么好处,甚至还可能让树长得杂乱无章,那我们就会提前下手,把这个分叉给剪掉。这样做的好处是什么呢?首先,它可以避免我们的树长出太多没必要的枝条,保持树的整洁和健康;其次,我们也省下了更多的精力和资源,因为没有让那些没必要的枝条继续长下去。
在决策树模型中,这种“边种边剪”的做法就是预剪枝。具体来说,就是在我们构建决策树的时候,不是盲目地让树的每个分支都长下去,而是先评估一下,如果让这个节点继续分下去,能不能让我们的模型变得更强大,能不能让我们的模型在面对新情况时表现得更好。如果答案是“不行”,那我们就在这里停下来,不再继续让它分下去了,把它定为一个叶节点,也就是树的一个末端节点。这样,我们的决策树就会更加精简,运行起来也更加高效,不会浪费时间在那些没有帮助的分支上。
评估的标准可以有很多,比如信息增益、信息增益率等,这里以基尼系数作为评估标准为例。
基尼系数的计算公式为:
其中, 是当前节点的数据集, 是类别的数量, 是第 类在当前节点的概率。
现在我们以基尼系数为参照按照预剪枝的策略来决定是否分割当前节点。以下是具体步骤:
计算当前节点的基尼系数。 这是预剪枝的第一步,用于评估当前节点的不纯度。
计算分割当前节点后,其子节点的基尼系数。我们需要对每个可能的分割计算加权后的基尼系数,公式如下
其中, 是在特征 的第 个取值下的子数据集, 是 的元素数量, 是 的元素数量。
比较分割前后的基尼系数。我们通过计算基尼系数的减少量(基尼增益)来衡量分割的效果:
如果基尼增益 大于0,表示分割后的数据集纯度提高了;如果 小于或等于0,表示分割不会增加数据集的纯度,甚至可能降低。
根据基尼增益的结果来决定是否对当前节点进行分割。如果基尼增益小于等于0,则停止分割并将当前节点标记为叶节点。如果基尼增益大于0,并且其他预剪枝的条件(如深度限制、最小样本数等)也满足,可以继续分割。
举一个简单的例子来说明这个过程:
假设当前节点包含以下数据集 :
类别 | 数量 |
---|---|
A | 30 |
B | 10 |
基尼系数为:
现在假设有一个特征可以将数据集分为两个子集D1和D2:
D1:
类别 | 数量 |
---|---|
A | 20 |
B | 5 |
D2:
类别 | 数量 |
---|---|
A | 10 |
B | 5 |
D1的基尼系数为:
D2的基尼系数为:
加权后的基尼系数为:
基尼增益为:
因为 大于0,我们可以考虑根据这个特征去分割数据集,以提高模型的泛化能力。如果 小于或等于0,我们就不分割当前节点,并把它标记为叶节点。
做决策就像是在庞大的树上攀爬,每一次选择都是沿着不同的枝条前进。这棵树,就是我们的决策树模型。但有时候,树枝太多,反而让树变得复杂难以把握。这时候,我们就需要进行一番修剪,而这个过程,俗称“后剪枝”。
后剪枝,就像是在树长成之后,拿起园艺剪,审视每一颗小树苗,决定哪些需要留下,哪些应该剪掉。这样做的目的,是为了让整棵树显得不那么杂乱,更加清晰、简洁。
具体到我们的决策树模型,后剪枝就是把那些复杂的、细小的枝条砍掉,这些枝条可能只是模型过于细致的想象,对于我们理解整个问题并没有太大帮助,甚至可能导致模型太过于钻牛角尖,只在特定情况下才对,而忽略了更广泛的情况。这种情况,我们称之为过拟合。
通过后剪枝,我们可以让模型变得更加通用,就像是剪过枝的树更能抵御风雨一样,模型也能更好地适应新的数据。与预剪枝相比,后剪枝好比是让树先自由生长,再精心修整,而预剪枝则是在树刚刚发芽就开始限制其生长。因此,后剪枝通常会保留更多的枝条,让树的生长更自然,也因此它的学习能力更强,懂得的东西更多,对未来未知情况的适应能力就更强。也就是说,后剪枝相比预剪枝,一般能保留更多的分支,有更好的学习能力,因此泛化错误率通常会低于预剪枝。
具体步骤如下:
生成决策树:首先,我们需要构建一棵完整的决策树,这棵树通常会根据训练数据集长得很"深"和"繁茂",因此很容易对训练数据产生过拟合。
自底向上剪枝:剪枝的过程是自底向上的,意味着我们从树的叶节点开始,逐步向上检查每个非叶节点。对于每个节点,我们都会考虑如果把这个节点的所有子树剪掉(即,把这个节点变成一个叶节点),对模型泛化能力的影响。
评估剪枝效果:为了评估剪枝的效果,我们需要使用一个独立的验证数据集。验证集不参与训练,用来模拟模型在实际应用中遇到未知数据的情况。我们会计算每次潜在剪枝操作前后决策树在验证集上的准确率。准确率的计算公式是:
如果某次剪枝操作能够让模型在验证集上的准确率提高,那么我们就执行这次剪枝。
重复剪枝过程:继续执行步骤2和步骤3,不断地对决策树进行自底向上的评估和可能的剪枝操作。这个过程会一直重复,直到进一步的剪枝不再带来验证集准确率的提升。
后剪枝的过程可能会持续一段时间,直到达到某个停止条件,比如决策树结构稳定下来不再发生变化,或者是达到了预设的最大迭代次数。在整个过程中,关键的是要密切监控模型在验证集上的表现,以此作为是否进行剪枝的依据。通过这种方式,后剪枝有助于平衡模型的复杂度和泛化能力,最终得到一个既不过于简单,又不过于复杂的决策树模型。