id3算法c语言实现,从ID3到C5.0的故事:算法详解及实践应用

原标题:从ID3到C5.0的故事:算法详解及实践应用

35b818a0427589bf1d41b1499d38cdf3.png

在前面,我们分别概述性地介绍了决策树的基本知识:

23684b5f29b182e03cf6156f381c7f40.png

1.算法概述

ID3(Iterative Dichotomiser3)算法可以说决策树算法中最著名的代表,它在1979年,由澳大利亚的计算机科学家,罗斯.昆兰(J.R.Quinlan)所发表出来。ID3算法在发表后,就引起了整个工业界的大量关注,并且其他科学家也根据ID3相继提出了ID4,ID5等等的相关算法。

d0a52dde41d604003ba33b9a85a7be78.png

考虑到ID4等名称已经被占用,昆兰只好在1993年的ID3算法的更新上,使用了C4.5(Classifier 4.5)这个名称,而后根据C4.5进一步推出了商业化的版本C5.0。C5.0作为商业化版本,主要在计算速度和运行内存上进行改进,但由于商业化版本并没进一步提供具体算法细节,因此后续主要介绍ID3及C4.5算法。

在前面决策树概述中,我们说到,我们可以通过集合的“纯度”来进行划分条件的选择。而ID3算法则使用了信息熵这一度量指标来衡量集合的纯度。熵(Entropy)这个概念最早出现在热力学中,是由德国物理学家及数学家鲁道夫·尤利乌斯·埃马努埃尔·克劳修斯所提出,它的物理意思表示该体系的混乱程度,简单地说,如果该体系下的分子运动杂乱程度增加,该体系的熵也随着增加。在熵这个概念普及之后,在1948年,信息论之父克劳德·艾尔伍德·香农提出了信息熵的概念。类比下来,我们可以认为信息熵这一度量是用来描述信息的“混乱”程度或者说信息的不确定度。

关于信息熵的通俗理解可以查看如下文章:

回到ID3算法中,不妨假设我们的样本集合D中含m类样本,其中每一类样本的比例分别为p(k)(k=1,2,…,m),则集合D的信息熵我们定义为:

ae5488fadd2d6c43ca0b58ce489bd918.png

计算时,定义有

Ent(D)越大,集合D的不纯程度越高,Ent(D)越小,集合D的纯度越高。因此也有一些文献中提到信息熵用以衡量样本集合的“不纯”纯度。另外不难证明,当存在某p(k)=1时,Ent(D),取得最小值,纯度达到最高;另外可以证明,当存在n种情况都是等可能发生的情况下,即:

6128e1887c31aa009300aeff6f264851.png

信息的不确定度越大,Ent(D)达到最大。

显然,对于父节点,我们需要选择一个最佳划分条件,使得利用这个划分条件划分后的子集纯度更高,即划分后的信息熵达到最小。假如我们选择了变量C对集合D进行划分为n个子集,每个子集的信息熵为:

b1ef330188ace3e667382190c690e78a.png

而所有子集的信息熵则可以表示为:

75f0a9d16d831930cd9e665c83553057.png

其中,N是父节点样本数量,n是该测试条件的分组数量(如学历可以分为:初中,高中,本科,硕士及以上,则n=4),N(Di)则是每个分组子集的样本数量。Ent(D|C)也就是集合D在已知随机变量C条件下的条件熵。

为了验证测试条件C的效果,则需要比较父结点与子女结点间的纯度差异,这种差异越大,说明该测试条件越好,而信息增益Gain则是这种差异的判断标准:

41f27072d425512ecfabfc52ff9caffe.png

接下来,我们回到决策树算法概述中谈到的例子,看电影问题。

55aeffd24f925a44516df6331bacc130.png

浩彬老撕重新收集了样本数据进行举例说明决策树的生成,该数据包含了12个样本,除了ID字段外,我们希望通过这个人决策当天是否属于周末以及工作完成情况来判断当天他是否外出看电影。

47f92a6e29f513c5600d9d3d5d886906.png

根据公式,可以计算得到根节点的信息熵为:

4ee742138a5f661290106fd6f8021de8.png

接下来我们分别计算利用属性集中不同划分条件进行划分后的信息增益,以“今天是否周末”这个变量为例,进行划分后分成子集D1(看电影,看电影,看电影,看电影,看电影,不看电影)及子集D2(不看电影,不看电影,不看电影,不看电影),因此对应子集D1的正例比例p(11)=5/6,反例比例p(12)=1/6。对应子集D1的正例比例P(21)=0,反例比例P(22)=1。所以对于“今天是否周末”这个划分条件划分后的每个子集的信息熵为:

efb334bed33eebd2156af36a2625108f.png

因此我们可以计算得到对应的信息增益为:

56305e087bfa33d436736be7c00974bb.png

同样,我们可以计算得到划分条件为“今天心情如何?”时对应的信息增益为:

53b93e48104a8e5cf55b26d53cc58f66.png

可以看到,选择“今天心情如何”这一划分条件,我们获得更高的信息增益。但值得注意的是,利用信息增益的公式,多路划分的熵将倾向于更小。这是因为二分类的划分实际上就是把多路划分的一些属性合并,这必然会提高子集“不纯”,因此这就会导致划分类别较多的输入变量更加容易被选为划分条件。

留意到电影决策数据中有“ID”这一字段,假如我们使用这一字段作为输入选择划分条件的话,我们发现我们的分类纯度可以达到最高(因为每个子集仅有一个样本)!但显然,这样的划分条件对于我们进行预测是毫无作用的。因此为了避免利用公式陷于过多划分的“陷阱”,C4.5算法采用增益率来评估划分:

49ff29e1e2cc040d14678f7b7d760b10.png

其中,Ent(C)用于修正由于多划分带来的偏差,这就可以看成选择划分属性带来的“代价”。回到例子中,我们可以计算得到:

bbbd1feb9640813fc72983adcc2441f1.png

可以看到,当我们对划分条件的信息增益加上了“代价”的考虑,类别较多的划分条件信息增益率减少了,因此C4.5算法选择了“今天是否周末”这一划分条件而不是“今天心情如何”。

2. 应用实践

在本例当中,我们使用某银行信贷数据进行客户违约分析。该数据集包含了850条记录,其中目标变量是违约情况(1代表是,0代表否),其他变量包括ID,年龄,学历水平居住时间,任职年限,家庭收入(千美元),信用卡债务(千美元),其他债务(千美元)以及总债务与收入比(%)。

相关数据文件可通过如下链接下载:

链接: https://pan.baidu.com/s/1b1LOcQ 密码: 6fms

模型流如下所示:

1c4be480fd5be8d2b29cc7b4c19a039f.png

1.数据读取:

我们使用【Statistics文件】节点读取数据,并且接入【类型】节点进行对变量的设定,具体设置如下:

(1)把“违约情况”这一字段的角色设为“目标”;

(2)把“ID”这一字段的角色设为“无”;

(3)其他字段设为输入;

0369a4301c7053587ba6bc2f44bd4618.png

2.前期数据处理:

设定好类型节点后,留意到本数据中有部分样本记录存在缺失值,因此在分析前我们需要对该部分的记录进行处理,在本例中,我们选择把缺失数据进行过滤。因此在设定类型节点后,我们加入【选择】节点,输入:@NULL(违约情况)丢弃空值。

3.划分训练集与测试集:

接下来连上【分区】节点,具体设置如下,我们选择70%的样本作为训练集,30%的样本作为测试集:

ec0c80a710b137009ff75edd91cf9b76.png

4.构建模型:

在准备好以上的工作后,接下来我们可以开始建立模型了。选中【C5.0】节点,并将其添加到流。

7fbd2a40416bc22b58b1d0f183d43f7d.png

5.得到结果:

根据选项设置后运行模型,运行得出结果。点开金黄色的【模型块】查看模型结果。首先看到的是【模型】选项卡,左边显示模型的规则结果,右边则是显示预测变量重要性。

f68fdafc639c33c614dfafd4a3d67dee.png

为了更全面查看模型结果,我们可以选择【查看器】选项卡,在该选项卡下,我们可以根据需要选择决策树的不同展现方式。

0acdff0c667a089ca2351147174d9d9c.png

6.结果评估:

最后,为了准确得到模型预测结果评估,我们在模型节点后添加‘分析’节点(在输出选型卡下),其中勾选‘重合矩阵(用于字符型目标字段)’,点击运行。

19806233ff4865d9a8d7c5b3829845c3.png

通过分析结果,我们可以看到C5.0在训练集及在测试集上的预测准确率,训练集的准确率高达89.61%,而测试集虽然略有下降,但还是达到77.99%。

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值