一、决策树剪枝
1.为什么要进行剪枝?
原因:上一篇博客是使用ID算法构建的决策树,而ID3算法构建的决策树可能存在以下问题:
① 不能对连续数据进行处理,只能通过连续数据离散化进行处理;
② 采用信息增益容易偏向取值较多的特征,准确率不如信息增益率;
③没有采用剪枝,决策树的结构可能过于复杂,容易出现过拟合。
2.什么是剪枝?
概念:剪枝主要是解决决策树出现的“过拟合”现象。剪枝就是通过某种判断,避免一些不必要的遍历过程。剪枝剪枝又分为预剪枝和后剪枝。
预剪枝:预剪枝,就是将即将发芽的分支“扼杀在萌芽状态”即在分支划分前就进行剪枝判断,如果判断结果是需要剪枝,则不进行该分支划分。
后剪枝(自底向上):在分支划分之后,通常是决策树的各个判断分支已经形成后,才开始进行剪枝判断。
二、代码实现
1.数据集准备:在上一篇文章的数据下改进新的数据集:
动物名称 | 食性 | 毛发 | 生活环境 | 哺乳动物 |
猫科 | 肉 | 短毛 | 草原 | 是 |
爬行 | 肉 | 无 | 森林 | 否 |
爬行 | 杂 | 无 | 水里 | 否 |
两栖 | 草 | 多毛 | 草原 | 是 |
两栖 | 草 | 短毛 | 草原 | 是 |
猫科 | 杂 | 多毛 | 森林 | 是 |
两栖 | 草 | 无 | 森林 | 是 |
两栖 | 杂 | 无 | 水里 | 否 |
飞行 | 肉 | 无 | 水里 | 否 |
爬行 | 肉 | 无 | 水里 | 是 |
飞行 | 杂 | 短毛 | 森林 | 否 |
爬行 | 肉 | 无 | 森林 | 否 |
猫科 | 草 | 无 | 森林 | 是 |
爬行 | 肉 | 无 | 水里 | 否 |
飞行 | 草 | 无 | 森林 | 否 |
两栖 | 杂 | 无 | 水里 | 否 |
两栖 | 草 | 短毛 | 草原 | 是 |
猫科 | 肉 | 多毛 | 草原 | 是 |
飞行 | 杂食 | 短毛 | 海边 | 否 |
2.没有剪枝前的决策树
#树的可视化 decisionNodeStyle = dict(boxstyle="sawtooth", fc="0.8") leafNodeStyle = {"boxstyle": "round4", "fc": "0.8"} arrowArgs = {"arrowstyle": "<-"} # 画节点 def plotNode(nodeText, centerPt, parentPt, nodeStyle): createPlot.ax1.annotate(nodeText, xy=parentPt, xycoords="axes fraction", xytext=centerPt , textcoords="axes fraction", va="center", ha="center", bbox=nodeStyle, arrowprops=arrowArgs) # 添加箭头上的标注文字 def plotMidText(centerPt, parentPt, lineText): xMid = (centerPt[0] + parentPt[0]) / 2.0 yMid = (centerPt[1