决策树C4.5算法 c语言实现,决策树之ID3、C4.5、C5.0

决策树之ID3,说一个例子,就会明白,拿

Tom M .mitchen 的《Machine Learing》第三章中的例子。

a4c26d1e5885305701be709a3d33442f.png

我们先解释一下这张表,表中有14条实例数据,就是我们的训练数据,其中Outlook,Temperature,Humidity

,Wind称作条件属性,PlayTennis 称作是决策属性(标签)。

每一个属性都有各自的值记做:Value(Outlook)={Sunny,OverCast,Rain},Value(Temperature)={Hot,Mild,Cool},Value(Humidity)={High,Normal},Value(Wind)={Strong,Weak},Value(PlayTennis)={NO,Yes}。

第一个重要的概念:Entropy。

我们数一下 决策属性PlayTennis,一共有两个类别:Yes,No。Yes的实例数是

9,No的实例数是 5。计算决策属性的Entropy(熵):

a4c26d1e5885305701be709a3d33442f.png,

计算结果为:0.940286

这里的决策属性S的值只有两个值(Yes,No),当然可以有多个值(s1,s2,s3,...,sk),这些决策属性的值的概率分别为:p1,p2,p3,...,pk所以决策属性的Entroy的计算公式:

a4c26d1e5885305701be709a3d33442f.png

第二个重要的概念:information

gain(信息增益)

我们只拿Outlook条件属性举例,其他的属性一样:

Value(Outlook)={Sunny,OverCast,Rain}:

Outlook是sunny的实例数为5(其中Yes的个数为2,No的个数为3),占总的实例数为5/14,那么针对sunny的Entropy,

a4c26d1e5885305701be709a3d33442f.png

计算结果为:0.97095

Outlook是OverCast的实例数为4(其中Yes的个数为4,No的个数为0),占总的实例数为4/14,那么针对Overcast的Entropy,

a4c26d1e5885305701be709a3d33442f.png

计算结果为:0

Outlook是Rain的实例数为5(其中Yes的个数为3,No的个数为2),占总的实例数为5/14,那么针对Rain的Entropy,

a4c26d1e5885305701be709a3d33442f.png

计算结果为:0.97095

那么最后针对Outlook条件属性的information

gain为:

a4c26d1e5885305701be709a3d33442f.png

计算结果为:0.24675

所以针对某一条件属性的information gain为:

a4c26d1e5885305701be709a3d33442f.png

那么其他三个条件属性Temperature、Humidity、Wind的信息增益为:

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

我们看到Outlook的信息增益是最大的,所以作为决策树的一个根节点。即:

a4c26d1e5885305701be709a3d33442f.png

然后,从Outlook下面出来三个树枝,最左边的Sunny,我们从Outlook是Sunny的实例数据中,找到信息增益最大的那一个,依次类推。

—————————————————————————————————————————————————————————————————————————————

决策树之C4.5

上面讨论的决策树的ID3算法,属性只能是枚举型的(离散的),当然属性值可以是连续的数值型,但是需要对这些数据进行预处理,变为离散型的,才可以运用ID3算法。

所以Ross

Quinlan又提出了C4.5算法,能够处理属性是连续型的。而且,在C4.5算法中,又提出了两个新的概念:

分离信息(Split Information)和信息增益率(Information

gain ratio)

首先,给出分离信息的计算方法,数学符号表达式为:

a4c26d1e5885305701be709a3d33442f.png

解释为:数据集通过条件属性A的分离信息。上面一个例子,数据集通过Outlook这个条件属性的分离信息,Outlook有三个属性值分别为:Sunny,Overcast,Rain,它们各占5,4,5,所以:

a4c26d1e5885305701be709a3d33442f.png

再次,给出信息增益率的公式:

a4c26d1e5885305701be709a3d33442f.png

上面这个例子如:数据集S针对Outlook的信息增益率,

a4c26d1e5885305701be709a3d33442f.png

分子和分母这两个值都已经求出来,选择信息增益率最大的那个属性,作为节点。

—————————————————————————————————————————————————————————————————————————————

决策树之C5.0

这是决策树C4.5的商用算法,在内存管理等方面,给出了改进。比如在商用软件SPSS中,就有该算法。

___________________________________________________________________________________________________________________________________

注意上述三个算法只能做分类,不能做回归,下一篇博文CART类似于C4.5,但可以做回归。

1.算法引入 先举一个简单的例子来介绍一下决策树到底是个什么东西。(参考:) 一个母亲要给女儿介绍对象,所以有了如下的对话: 女儿:多大年纪了? 女儿:多大年纪了? 母亲:26。 女儿:长的帅不帅? 母亲:挺帅的。 女儿:收入高不? 母亲:不算很高,中等情况。 女儿:是公务员不? 母亲:是,在税务局上班呢。 女儿:那好,我去见见。 这个女孩的判断过程就是一个决策树,她根据自己设置的一些标准(属性)来对男方做是或者否的判断,可以大致用以下图来表示: a4c26d1e5885305701be709a3d33442f.png

实际上,决策树的原理就是:根据样本的属性,生成一系列的规则,来对样本进行判断。每一个根节点就是属性分裂点,每一个叶子节点就是判别结果。决策树既可以处理离散变量,也可以处理连续变量。

2.决策树的学习过程 一颗决策树的生成过程主要分为以下三步: (1)特征选择:特征选择是指从众多的特征中选择一个特征作为当前分裂的节点的分裂标准。如何选择分裂的标准,这是决策树的核心部分,也是众多决策树算法的不同点,后面会详细叙述。 (2)决策树生成:根据选择的特征评估标准,从上至下递归的生成子节点,直到数据集不能再分裂为止,整个过程就是一个递归。 (3)树剪枝:通过缩小树结构规模,缓解过拟合,有预剪枝和后剪枝两种。

3.几种不同的决策树算法 (1)ID3:以信息增益度量为属性选择,选择分裂后信息增益最大的属性进行分裂(

从信息论知识中我们知道,期望信息越小,信息增益越大,从而纯度越高) 注:期望信息越小,就是了解或者发生这件事情的所需要的信息越少,是不是意味着这件事情更容易发生,也就是分类越准确。 设D为用来分裂的属性,D的熵(entropy)为: a4c26d1e5885305701be709a3d33442f.png

 Pi:表示i类在整个训练集中的概率(可以认为是频率,也是i类的占比)。该式表示,我们要判断一个样本属于i类,所需要的平均信息量。 按照D属性分裂后的熵: a4c26d1e5885305701be709a3d33442f.png

 j:第j类,结果求和 |Dj/D|:属性的记录占总样本的比例 信息增益是二者的差值,前者减去后者,保证信息增益为正数: a4c26d1e5885305701be709a3d33442f.png

 ID3每次分裂时,计算每个属性的增益,然后按照最大增益的属性分裂。举一个比较经典的例子: a4c26d1e5885305701be709a3d33442f.png 其中s、m和l分别表示小、中和大。 设L、F、H和R表示日志密度、好友密度、是否使用真实头像和账号是否真实,下面计算各属性的信息增益。 a4c26d1e5885305701be709a3d33442f.png

 因此日志密度的信息增益是0.276。用同样方法得到H和F的信息增益分别为0.033和0.553。因为F具有最大的信息增益,所以第一次分裂选择F为分裂属性,分裂后的结果如下图表示: a4c26d1e5885305701be709a3d33442f.png

后面节点的分裂过程一样 缺点: ID3存在一个问题,偏向多值属性。也就是说,若某个属性所取的不同值越多,那么越有可能拿它来做分裂属性。例如,如果存在唯一标识,ID3会选择它作为分裂属性,这样的分裂是没有意义的。什么意思呢?假如我想知道一群人中的收入的高低,给出的属性有每个人的名字,平时消费的高低等,ID3会根据名字进行分裂,这样的出来的结果能判断一个人的收入高低么?这样分裂的目标就不是我们所需要的了。

(2)C4.5算法 C4.5是ID3的改进算法(具体为啥叫这名,好像是说C4和C5都被用了,然后就叫了这个,但为啥不叫C6,这我也不知道)。它使用信息增益率来选择属性,克服了ID3偏向多值属性的缺点,公式: a4c26d1e5885305701be709a3d33442f.png

C4.5既可以处理离散值又可以处理连续值,离散值和ID3一样。 在C4.5中,对连续属性的处理如下: 1、对特征的取值进行升序排序 2、两个特征取值之间的中点作为可能的分裂点,将数据集分成两部分,计算每个可能的分裂点的信息增益(InforGain)。优化算法就是只计算分类属性发生改变的那些特征取值。 3、选择修正后信息增益(InforGain)最大的分裂点作为该特征的最佳分裂点 4、计算最佳分裂点的信息增益率(Gain Ratio)作为特征的Gain

Ratio。注意,此处需对最佳分裂点的信息增益进行修正:减去log2(N-1)/|D|(N是连续特征的取值个数,D是训练数据数目,此修正的原因在于:当离散属性和连续属性并存时,C4.5算法倾向于选择连续特征做最佳树分裂点) (3)CART CART算法的全称是Classification And Regression

Tree,采用的是Gini指数(选Gini指数最小的特征s)作为分裂标准,同时它也是包含后剪枝操作。ID3算法和C4.5算法虽然在对训练样本集的学习中可以尽可能多地挖掘信息,但其生成的决策树分支较大,规模较大。为了简化决策树的规模,提高生成决策树的效率,就出现了根据GINI系数来选择测试属性的决策树算法CART 4.树剪枝 决策树很容易造成过拟合,有时会过分拟合数据中的噪声和孤立点,减缓过拟合的方法一般使用树剪枝,分为预剪枝和后剪枝。 预剪枝:根据一些原则及早的停止树增长,如树的深度,节点中样本数,不纯指标下降的最大深度等,核心问题是如何事先指定树的最大深度。 后剪枝:通过在完全生长的树上减去分支,删除节点。方法有很多种,如:代价复杂性剪枝,最小误差剪枝等(实际上就是剪枝-检验-和剪枝前对比-是否剪枝) 5.几点补充说明 (1)如果属性用完了咋办?即所有属性用完了,但有的子集还是不纯集,即集合内的元素不属于同一类别。 一般对这些子集进行多数表决,用该子集中的最多的类别作为节点类别。

你可能感兴趣的:(决策树C4.5算法,c语言实现)