决策树

       决策树是一种比较流行的机器学习算法。它之所以如此流行,其中的一个重要原因就是它不需要了解机器学习的知识,就能搞明白决策树是如何工作的。

       决策树经常被用来处理分类问题。那么它与之前讲过的k-近邻算法比起来,有什么优势呢?第一,k-近邻算法的时间复杂度高,执行效率比较低,但是决策树的时间复杂度不高。第二,k-紧邻算法无法给出数据的内在含义,但是决策树却可以给出数据的基础结构信息。所以,一般情况下,决策树比k-近邻算法更加适用。

       决策树的工作原理很简单,与“20个问题”的游戏规则很相似:参与游戏的一方在脑海里想一个事物,其他玩家向他提问,问题的答案只能用对或错回答。问问题的人通过推断分析,逐步缩小待猜事物的范围。

       下面给出一个简单的流程图形式的决策树帮助大家理解:

决策树_第1张图片


       上面的流程图模拟了一个邮箱分类系统,它首先检查发件人的邮箱地址。如果地址是[email protected],则将该邮件分类为“无聊时阅读的邮件”。如果不是这个地址,那么就检查邮件中是否包含单词“足球”,如果包含则将邮件分类为“需要及时处理的邮件”,否则就分类为“垃圾邮件”。

       那么我们应该如何像上面一样划分数据集来构造决策树呢?首先在当前数据集上找到对划分起决定性作用的特征,然后把原始数据集划分为几个数据子集,这些数据子集会分在在第一个决策点的所有分支上。如果某个分支下的数据属于同一类型,那么就不需要进一步对数据子集进行划分,否则需要重复划分数据子集。当然了,可能会有人问,“如果数据集按照所有的特征划分完之后,还是有某个分支上的数据不属于同一个类型怎么办?”。这个时候我们就只能采用“少数服从多数”的原则给这个分支分类。

       决策树最重要的一个步骤就是如何找到数据集上哪个特征在划分数据分类时起决定性作用。在这里,我们使用信息论划分数据集,通过求数据集的香农熵的变化来判断哪个特征最好。在数据划分之前和之后熵的变化称为信息增益,获得信息增益最高的特征就是最好的选择。我这里不会对信息论的内容作过多的讲解,大家只需要知道数据划分之前的熵减去按照某个特征划分数据之后的熵的差值最大的那个特征就是最好的。

       下面我会通过一个简单的例子来告诉大家如何求熵。首先给出熵的计算公式:



构建一个判断是否属于鸟类分类系统:

决策树_第2张图片

在上面的例子中xi表示是否属于鸟类



       第一,计算划分数据之前的熵,我们用x1表示属于鸟类,x2表示不属于鸟类。例子中一共有5组数据,其中前2组属于鸟类,后3组不属于鸟类。所以p(x1)=0.4,p(x2)=0.6。那么我们就能很容易的算法出划分数据之前的熵H=0.970951。

       第二,假设按照第一个特征“是否有翅膀”来划分数据,因为该特征的取值为“是”和“否”,所以把数据集划分为两类。第1类包括数据1、2、3,第2类包括数据4,5。我们按照上述方式分别求出第1类的熵H11=0.918296,第2类的熵H12=0。又因为第1类包含3个数据,第2类包含2个数据,所以划分后的数据的熵H1=3/5*H11+2/5*H12=0.550978。

       第三,假设按照第二个特征“是否会飞”来划分数据,同理,可以求得划分后的数据的熵H2=0.8。

       第四,判断哪种分类的信息增益最多。按照第一个特征划分的信息增益为H-H1=0.419973,按照第二个特征划分的信息增益为H-H2=0.170951。所以第一个特征在划分数据集时起决定性作用。

       我们仍然使用上面的例子来看看决策树是如何构造的。我们已经知道了第一次划分数据集时第一个特征起决定性作用,所以第一次划分就把第一个特征作为判断条件。此时,数据分为两个子集,第1个子集包括数据1、2、3,第2个子集包括数据4、5。我们可以发现第2个子集中的数据都是“不属于鸟类”的,所以不用再继续划分了,但是第1个子集仍然需要继续划分。因为现在只剩下一个特征了,所以我们直接选择该特征作为划分依据,否则仍然需要像之前一样找到在该子集上对划分起决定性作用的特征。按照第二个特征划分完数据之后,我们就构造好决策树了。

       我们可以编写算法画出决策树来分析我们之前构造好的决策树是否正确。

决策树_第3张图片


       相信大家已经知道了如何构造决策树。那么我们就可以按照开发机器学习应用程序的6个步骤来编写决策树算法并使用决策树解决实际问题。在使用编程语言构造决策树时,需要使用到递归,因为我们不知道数据集需要划分几次,也许1次,也许2次,也许更多次。那么判断递归结束的条件是什么?刚刚,子丰已经在前面说过了,在这里再强调一次。结束条件:要么是所有的叶子节点上的数据都属于同一个类型,要么是所以的特征都全部用来分类了,再也没有其他特征可用于分类,此时如果叶子节点上的数据仍然不属于同一个类型,那么就按照“少数服从多数”的原则。

       尽管,决策树是一个比较流行的算法,但它仍然有一些不足之处。首先,在特征和目标变量的取值方面有一些要求,必须只能有有限个。只有这样才能有有限个分支,不然算法就会失去意义。其次,决策树可能会造成过度匹配的问题,即决策树的叶子节点太多了。为了减少过度匹配,我们也有一些办法,其中一个办法就是裁剪决策树,去掉一些不必要的叶子节点。如果叶子节点只能增加少许信息,那么可以删掉该节点,或者并入到其它叶子节点中。

你可能感兴趣的:(学习,决策树,机器学习算法,分类算法,信息论划分数据集,香农熵划分数据集)