Efficient C4.5 理解
原创内容,转载注明出处
为了完成数据挖掘课上的 展示任务,三个同学一小组读懂一篇论文。我们选择了《Efficient C4.5》,一片2002年发表在IEEE上的文章。主要是数据挖掘课上老师介绍了ID3决策树,想更深入一点介绍一下C4.5。
这篇文章完成的主要任务就是对C4.5在属性为连续值得情况下的对划分阈值的选择上进行时间和空间上的优化。算法提出了三种strategy,不同情况下选择不同的strategy,以使真个算法在各个情况下都有最出色的表现。
先说说传统的C4.5,在每次对决策树按照属性进行分枝的时候计算按照不同属性划分的信息增益。信息增益的公式就不说了,但是从公式可以发现,对于离散值,直接根据数值进行划分即可,比如性别为男女,计算按照性别划分的信息增益的时候需计算划分为男和女后的信息熵,计算信息增益。那么问题来了,如果属性是年龄,那么该如何划分呢?本文优化的就是这个划分点的选择。传统的方法是,比如年龄有10,20,25,30,34(用快排进行排序),那么需要计算划分点为15,23,28,32的信息增益。例如按照<=15,>15分成两类。这里要分清楚论文中threshold和local threshold的区别,这里找到的15是local threshold,是在当前节点中找到的,而threshold是在整个训练集中找到小于local threshold的那些值中最大的,比如整个训练集中有12,是小于15的最大的,那么threshold就是12,local threshold的计算只是为了找到这个threshold。那么这个遍历就成了整个算法中最浪费时间的步骤。
在根节点,对所有连续的属性按值进行排序,存在DV[a]中,a代表连续属性。DV[a][i]=v[i],这样就可以在DV[a]数组中进行二分查找了。
第一种stragegy就是将线性查找变成了二分查找。
第二种将计算local threshold时使用的快排换成了counting sort 的排序方法,就是很简单的计数排序。
第三种使用了一种rain forest算法,用来计算信息增益,用一个数组AVC[c][i]记录属性值index为i的case weight之和,case weight是c4.5与id3的一个区别之处,为了处理缺失值,case weight最开始都是1,当分裂的时候缺失值的case被复制到了每个孩子节点中,他们的case weight正比于孩子节点中value已知的case和父节点value已知的case的比例(有多大的可能性是在这个孩子节点中)。主要是为了计算local threshold时计算在某一点划分的信息增益。这样AVC数组中就包含了所有计算信息增益的信息。可以计算出local threshold,并且不需要排序就可以找到threshold啦。
论文的最后将这三种方法比较,得到每种方法适用的情况,使整个算法最优。