1. C4.5算法
前一篇文章机器学习算法–决策树ID3–python实现 讲述了决策树的基本概念和最经典的ID3算法。
在那篇文章中,我没有谈到ID3算法的缺陷,更多的是侧重于介绍决策树的算法和概念。但其实,ID3算法存在这么几个缺陷:
1.信息增益准则对可取数值数目较多的属性有所偏好;
比如,如果在原来的数据中加入[序号]这一属性,运行ID3算法后,我们会发现序号被作为最优属性首先被划分。但常识告诉我们,序号根本和样本类别毫无关系。
2.只能处理离散变量的属性,对于类似于身高、体重、年龄、工资这样存在无限可能的连续数值毫无办法。
为了优化并解决以上2个问题,著名的C4.5算法被提出。
1.1 解决类似于"序号"这样的干扰
C4.5决策树算法不直接使用信息增益(Information gain)划分最优属性,而是采用增益率(gain ratio)。其定义为:
G a i n _ r a t i o ( D , a ) = G a i n ( D , a ) I V ( a ) , Gain\_ratio(D,a)=\dfrac{Gain(D,a)}{IV(a)}, Gain_ratio(D,a)=IV(a)Gain(D,a),
其中
I V ( a ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ l o g 2 ∣ D v ∣ ∣ D ∣ IV(a)=-\sum_{v=1}^{V}\dfrac{|D^v|}{|D|}log_2\dfrac{|D^v|}{|D|} IV(a)=−v=1∑V∣D∣∣Dv∣log2∣D∣∣Dv∣
成为属性a的固有值。由表达式可知,Gain(D,a)所表示的仍然是信息增益,与ID3算法中的Gain(D,a)并无差别,但重点在于IV(a)这一项:如果属性a的可能取值数目越多(即V越大),则IV(a)的值通常会越大,那么最终的Gain_ratio的值会相应减小,以此来解决上文提到的问题。
1.2 增加对连续变量的处理模块
- 首先,要在处理每一个属性之前,判断该属性的值是字符/字符串(这意味该属性的值是离散的)还是整型/浮点型(这意味该属性的只是回归的、连续的),两种类型的值要分别进行处理。
if type(featVals[0]).__name__=='float' or type(featVals[0]).__name__=='int':
...
if type(dataSet