决策时是一个分类算法。本文主要讲了一下决策树的构造以及用绘图的形式把决策树绘画出来。
决策树的构造
本文使用ID3算法来划分数据集,通过计算每一个特征的香农熵来选取最优划分数据集的特征,之后在递归的构造决策树来遍历每一个特征。
下面公式是计算香农熵,p(xi)是选择该分类的概率 ,n是分类的数目。
算法步骤:
- 利用calcShannonEnt函数计算原始数据的原始香农熵,即最后的一个特征来划分计算出来的香农熵,如下方的’yes’,’no’的特征计算出来的香农熵。
- 利用 chooseBestFeatureToSplit函数来计算每一个特征的香农熵,选取最大的香农熵的那一个特征来进行数据划分和构造决策树.
- 利用splitDataSet函数将该特征去掉的数据集继续遍历递归的计算每个特征的香农熵构造决策树。
决策树的存储:
- 使用字典来构造存储决策树的信息,之后可以用pickle模块来存储决策树。
下面是构造决策树的具体代码。 使用的是python3。
1 | # -*- coding: UTF-8 -*- |
决策树的树形图绘制
构造出决策树了然而字典的表示形式不易于理解,接下来使用Matplotlib库创建树形图。
1 | # coding:utf-8 |
总结
决策树的优点
决策树易于理解和解释,可以可视化.
几乎不需要数据预处理。其他方法经常需要数据标准化,创建虚拟变量和删除缺失值。决策树还不支持缺失值。
- 使用树的花费(例如预测数据)是训练数据点(data points)数量的对数。
- 可以同时处理数值变量和分类变量。其他方法大都适用于分析一种变量的集合。
- 可以处理多值输出变量问题。
- 使用白盒模型。如果一个情况被观察到,使用逻辑判断容易表示这种规则。相反,如果是黑盒模型(例如人工神经网络),结果会非常难解释。
- 即使对真实模型来说,假设无效的情况下,也可以较好的适用。
决策树的缺点
决策树可能会产生过多的数据集划分,从而产生过度匹配数据集的问题,可以通过裁剪决策树,合并相邻的无法产生大量信息增益的叶节点,从而消除过度匹配问题。
决策树学习可能创建一个过于复杂的树,并不能很好的预测数据。也就是过拟合。修剪机制(现在不支持),设置一个叶子节点需要的最小样本数量,或者数的最大深度,可以避免过拟合。
- 决策树可能是不稳定的,因为即使非常小的变异,可能会产生一颗完全不同的树。这个问题通过decision trees with an ensemble来缓解。
- 学习一颗最优的决策树是一个NP-完全问题under several aspects of optimality and even for simple concepts。因此,传统决策树算法基于启发式算法,例如贪婪算法,即每个节点创建最优决策。这些算法不能产生一个全家最优的决策树。对样本和特征随机抽样可以降低整体效果偏差。
- 概念难以学习,因为决策树没有很好的解释他们,例如,XOR, parity or multiplexer problems.
- 如果某些分类占优势,决策树将会创建一棵有偏差的树。因此,建议在训练之前,先抽样使样本均衡。
还有其他决策树的构造算法,最流向的是C4.5和CART。本文是ID3构造算法。
本文参考:https://blog.csdn.net/c406495762/article/details/76262487