1. 为什么要剪枝
还记得决策树的构造过程吗?为了尽可能正确分类训练样本,节点的划分过程会不断重复直到不能再分,这样就可能对训练样本学习的“太好”了,把训练样本的一些特点当做所有数据都具有的一般性质,从而导致过拟合。这时就可以通过剪枝处理去掉一些分支来降低过拟合的风险。
剪枝的基本策略有“预剪枝”(prepruning)和“后剪枝”(post-pruning):
预剪枝是在决策树的生成过程中,对每个结点划分前先做评估,如果划分不能提升决策树的泛化性能,就停止划分并将此节点记为叶节点;
后剪枝是在决策树构造完成后,自底向上对非叶节点进行评估,如果将其换成叶节点能提升泛化性能,则将该子树换成叶节点。
那么怎么判断泛化性能是否提升呢?这时需要将数据集分为训练集和验证集,利用训练集构造决策树,利用验证集来评估剪枝前后的验证集精度(即正确分类的比例)。
下面我们把之前的西瓜数据集划分为训练集和验证集,之后在分别详细演示预剪枝和后剪枝的处理过程。
首先利用训练集数据,构造一个未做剪枝处理的决策树,以便于与剪枝后的决策树做对比。
注意:这里构造的决策树与《机器学习》中的不一样,因为色泽、根蒂、脐部三个属性的信息增益是相等的,都可以作为最优划分属性。
2. 预剪枝
我们先学习预剪枝的过程:
(1)根据信息增益准则,选取“色泽”作为根节点进行划分,会产生3个分支(青绿、乌黑、浅白)。
对根节点“色泽”,若不划分,该节点被标记为叶节点,训练集中正负样本数相等,我们将其标记为“是”好瓜(当样本最多的类不唯一时,可任选其中一类,我们默认都选正类)。那么训练集的7个样本中,3个正样本被正确分类,验证集精度为3/7*100%=42.9%。
对根节点“色泽”划分后,产生图中的3