1.什么是决策树
决策树是基于树结构来进行决策的,这也是人类面临决策问题时的一种很自然的处理机制。
具体的来说人们要认识一个事物的本质或者说要对一个事情进行判断,就需要考虑很多问题,然后综合考虑得到决策,这其实就是决策树的体现。举一个例子,我们对“这是一个好瓜吗”这样的问题进行决策时,通过一系列的判断进行决策,先要看看“它是什么颜色“,若是青绿色,再看它的根蒂是什么样的状态,之后再对其他属性进行同样的判断,最后就能得到我们的结论,这是个好瓜。
一颗决策树包含一个根节点,若干个内部节点和若干个叶节点,根节点包含了样本全集,叶节点对应于决策结果,其他的每个结点对应一个属性测试。从根节点到每个叶节点的路径对应了一个判定测试序列。
2. 怎么构建决策树
从给定的训练数据集中,依据特征选择的准则,递归的选择最优划分特征,并根据此特征将训练数据分割,使得各子数据集有一个最好的分类的过程。
或者换句话说就是有那么多特征,我们先基于哪个特征进行判断比较好呢。这就涉及到了特征的选择。而特征选择的目的是使用某特征对数据集划分之后,各数据子集的纯度比划分前的数据集的纯度高,或者说不确定性更低。我们进行划分的方法有信息增益,信息增益率,基尼系数等。我们可以对每个划分后的数据集计算其熵值,根据熵值来判断这个数据集的纯度,这个时候我们就可以对数据集根据各个属性进行划分,然后看对哪种属性划分得到的子集纯度更高,这样就得到了当前的最优划分特征。
总结一下:就是先得到原始数据集,然后判断出哪个属性是最好的划分属性(这个过程需要不断测试各个属性划分后的结果和相应的熵值,最终得到结果),再基于最好的划分属性值划分数据集。第一次划分之后,数据将被向下传递到树分支的下一个节点,在这个节点熵,我们可以再次划分数据。因此我们可以用递归的方法解决。递归结束的条件是:程序遍历完所有划分数据集的属性,或者每个分支下的所有实例都具有相同的实例。
这里可以看出来我们结束有两个条件,其中第二个结束条件还需要考虑其他的问题,如果我们已经处理完了所有的属性了,但是此时叶节点中仍不都是同一类的,这时我们需要决定如何定义该叶子节点。我们可以使用多数表决的方法来确定该叶子节点的分类。
3.怎么画出决策树
我们知道了决策树怎么生成的,我们可以将生成结果用图像表示,从而更加清晰直白。
第一步:画出树的单个节点 通过文本注释和箭头起点终点来画出单个节点(函数plotNode)
第二步:画出整个决策树
此时我们还要知道有多少个叶节点,以便正确确定x轴的长度;我们还要知道树的层数,以便正确确定y轴的长度。为了得到这两个量,所以又写了两个函数(函数getNumberleaves()和getTreeDepth())
我们还有一个函数用来在父子节点之间填文本信息的(plotMidtext())
main.py文件
from sklearn import datasets#引入数据集,sklearn包含众多数据集
from sklearn.model_selection import train_test_split#将数据分为测试集和训练集
from sklearn.neighbors import KNeighborsClassifier#利用邻近点方式训练数据
import trees
import treePlotter
def main():
"""
Function: 主函数
Args: 无
Returns: 无
"""
#打开文件
fr = open('lenses.txt')
lenses = [inst.strip().split('\t') for inst in fr.readlines()]
lensesLabels = ['age', 'prescript', 'astigmatic&#