从前,小夕种了一棵树,种在了小夕的小屋后面~
为什么要种这棵树呢?因为呀,它可以帮小夕总结历史经验,然后帮小夕对当前的局势做出决策~这样小夕就可以安心给大家写文章啦~
这棵树是这样的。
一开始,小夕买了一颗小树苗,把它栽到地上。
然后呢,小夕不给它浇水,也不给他浇肥料,而是让他吃历史经验。比如呢,今天,小夕让它帮小夕识别出图片中的生物是喵还是驴。所以呢,这里的历史经验就是一大堆喵和驴的图片,并且小夕给它标注好了每张图片是喵还是驴。
可是由于树没有眼睛呀,不能直接观察图片。所以呢,小夕帮它把图片转化成了特征,也就是用几个特征来描述每张图片。
于是小夕选了如下几个特征来描述每张图片:
1、头是否是长条形
2、身上有没有毛
3、有没有发现胡须
4、丑不丑
5、萌不萌
所以,比如小夕就会对下面这张图片:
转化为[False True False False True]的特征向量(即,不是长条头、有毛、没发现胡须、不丑、萌)
然后小夕一口气给上千张图片提取完了特征,当然,这些图片都是标注好类别的。
小夕就把它们丢给小夕心爱的小树苗啦~
诶?那小树苗要怎么生长呢?
小夕问小树苗:
小树苗喝了口水,说:
我每一步的生长都是非常慎重的,我从不会多长个枝丫或者少长个枝丫。每个样本这不是有五个特征嘛,我呢,就会从中挑选出最有价值的一个特征,来作为我第一次生长的分支。”
小夕接着问:
“那小树要怎么挑选特征呢?
小树苗说:
“你看啊,比如你挑出来的第二个特征,“身上有没有毛”,这就是很糟糕的特征。为什么呢?我们就来看“有没有毛”这个特征。我数了一下,在所有有毛的动物中,50%的动物是喵,50%的动物是驴。而在所有没有毛的动物中,也是50%的动物是喵,50%的动物是驴。所以“有没有毛”这个特征的任何一个取值下,所有类别的样本数一样,是完全等概率的,这样的特征完全无法用来做分类啊。因为不管这个特征的值是什么,它所映射的各个类别都是等概率的。所以这个类别是最糟糕的。”
小树苗喝了口水,接着说:
但是你用的第三个特征,“有没有胡须”,就非常棒。我统计了一下,有胡须的动物中,喵占了92%,驴占了8%。而没有胡须的动物中,喵占了20%,驴占了80%。这样,如果给我一张未知类别的样本,只需要看“有没有胡须”这个特征的话,基本就可以判断出这个样本的类别是什么了!比如说这个样本的这个特征的值恰好是“没有胡须”,那么我就有80%的把握说这是一头驴!当然,如果恰好这个样本的特征的值是“有胡须”,我就有92%的把握说这个样本时一只喵!这么棒的特征,当然是首选的啦!所以,我下面要长的枝丫就是叫做“有没有胡须枝丫”!
小夕:
我可能买了一棵假树苗。
我。。。应该懂你的意思了。你说的选择最优特征的方法实际就是计算条件熵的过程。对于你说的“有没有毛”这个很糟糕的特征,由于这个特征的每个取值下,各个类别都是完全等概率分布的,所以是最无序的,最随机的特征,我们称为“条件熵最大的特征”。熵最大就是1,所以计算出的“有没有毛”这个特征的条件熵肯定是1。
而你说的“有没有胡须”这个特征,它的每个取值下,类别分布很随机,也就是说很有序(想象一下,最有序的状态就是每个取值下,所有样本都是同一个类别,多么有序啊。而类别等概率分布的时候,就是每个特征下鱼龙混杂的时候,啥类别都有,乱糟糟的),这种很有序的特征,计算出的条件熵肯定很小。最有序的情况下,条件熵就是0啦。
小树:
好了。但是,我的分类目标是达到100%的准确率。所以,我要进一步挑选特征了!
基于有胡须的那个分支,我会将这个分支里的样本重新计算各个特征的条件熵(当然胡须这个特征除外),像之前一样选择条件熵最大的特征作为下一个枝丫!
一直重复这个过程,直到哪一个枝丫下的全部样本都是同一个类别了,这个枝丫就不再继续分裂了。
最终,小树长成了大树。
这时,小夕忙着给大家写文章呢,但是小夕的一个好闺蜜小娅拿着一张图片过来了,她想让小夕帮她看看这是驴还是喵。
但是小夕很忙呀,没空理她,就让她拿着图片问后院的决策树啦~
然后小娅去问决策树这是啥,决策树说:“它有胡须吗?”
小娅说:“有!”
树:“它萌吗?”
小娅:“一点也不萌!”
树:“它是长脸吗?”
小娅:“是长脸!”
树:“那这就是只驴!”
留下一脸懵逼的小娅在树下凌乱( ̄∇ ̄)
这棵神奇的树叫什么呢?
这棵树的专业说法叫“ID3决策树”,为什么是ID3呢?因为它是通过计算条件熵来选择最优特征的。其他经典决策树如C4.5决策树、CART决策树等与ID3的区别仅在于最优特征选择的算法。
然后对本文总结一下,本文经过了如下步骤,这也是一个简单的机器学习/数据挖掘任务的经典流程。
1、对已标注类别的数据集进行数据预处理与特征提取
2、训练决策树(分类器/机器学习模型)
3、对未知类别的数据集进行数据预处理与特征提取
4、利用决策树对未知类别样本的类别做出决策
想要详细了解ID3决策树选择最优特征的过程(即计算条件熵)的同学,可以Google或者百度一下“条件熵”或者查阅《数据挖掘导论》等机器学习相关的书籍;
想要详细了解如何代码实现ID3决策树的同学,可以搜索各种CSDN博客或者查阅《机器学习实战》等侧重代码实现的书籍;
对于如何提高决策树的泛化能力(防止过拟合)等优化技巧,或者其他类型的决策树,可以看《数据挖掘导论》等经典书籍~