机器学习算法|决策树C4.5--python实现

本文介绍了C4.5决策树算法,作为ID3算法的改进,它解决了偏好数值较多属性和处理连续变量的问题。C4.5通过增益率避免了对属性取值数量的偏好,并添加了对连续变量的处理模块。文章详细阐述了算法的思路,包括如何划分最优属性以及如何处理连续变量,并给出了算法的Python实现框架。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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=1VDDvlog2DDv
成为属性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[0][bestFeat]).__name__=='str':
...

*如果你事先已经对离散值做了整数型数值替换表示,那么可以根据具体情况进行修改上述判断语句。

  • 其次,要增添一个根据连续变量属性分割数据集的函数:
def splitContinuousDataSet(dataSet,i,value,direction):
    subDataSet=[]
    for one in dataSet:
        if direction==0:
            if one[i]>value:
                reduceData=one[:i]
                reduceData
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值