机器学习算法及实战——决策树(一)

决策树是附加概率结果的一个树状的决策图,是直观的运用统计概率分析的图法。机器学习中决策树是一个预测模型,它表示对象属性和对象值之间的一种映射,树中的每一个节点表示对象属性的判断条件,其分支表示符合节点条件的对象。树的叶子节点表示对象所属的预测结果。

常用的决策树算法有ID3,C4.5和CART。它们都是采用贪心(即非回溯的)方法,自顶向下递归的分治方法构造。这几个算法选择属性划分的方法各不相同,ID3使用的是信息增益,C4.5使用的是信息增益率,而CART使用的是Gini基尼指数


1.描述

1.1 引入

没有比一幅图更能描述问题实质的了。

上图是一棵结构简单的决策树,用于预测贷款用户是否具有偿还贷款的能力。贷款用户主要具备三个属性:是否拥有房产,是否结婚,平均月收入。每一个内部节点都表示一个属性条件判断,叶子节点表示贷款用户是否具有偿还能力。例如:用户甲没有房产,没有结婚,月收入 5K。通过决策树的根节点判断,用户甲符合右边分支 (拥有房产为“否”);再判断是否结婚,用户甲符合左边分支 (是否结婚为否);然后判断月收入是否大于 4k,用户甲符合左边分支 (月收入大于 4K),该用户落在“可以偿还”的叶子节点上。所以预测用户甲具备偿还贷款能力。

1.2 算法基础

一棵决策树包含一个根节点、若干个内部节点和叶节点;叶节点对应于决策结果,其他每个节点则对应于一个属性测试;每个节点包含的样本集合根据测试的结果被划分到子节点中根节点包含样本全集。从根节点到每个叶节点的路径对应了一个判定测试序列。

输入:训练集$D = {(x_1,y_1),(x_2, y_2),...,(x_m, y_m)}$
      属性集$A = {a_1,a_2,...,a_d}$
过程:函数TreeGeneration(D, A)
1. 生成节点 node
2. if D 中样本全属于统一类别 C then //情形1
3.     将node标记为C类叶节点; return
4. end if
5. if $A = \emptyset $ OR D 中样本在 A 上取值相同 then  //情形2
6.     将node标记为叶节点,其类别标记为D中样本数最多的类;return
7. end if
8. 从 A 中选出最优划分属性$a_*$;
9. for $a_{*} $ 的每一个值 $a_{*} ^v$ do
10.    为node生成一个分支;令$D_v$表示D在$a_*$上取值为$a_{*} ^v$的样本子集;
11.    if $D_v$ 为空 then     //情形3
12.        将分支标记为叶节点,其类别标记为D中样本最多的类;return
13.    else
14.        以$TreeGenerate(D_v, A\{a_*})$ 为分支节点
15.    end if
16. end for
输出:以node为根节点的一颗树

显然决策树生成过程是一个递归的过程。在算法中有三种情形会导致递归返回:

  1. 当前节点包含的样本全属于同一类别,无需划分
  2. 当前属性集为空,或是所有样本在所有属性集上取值相同,无法划分
  3. 当前节点包含的样本集合为空,不能划分

2情形:把当前节点标记为叶节点,并将其类别设定为该节点所含样本最多的类别
3情形:同样把当前节点标记为叶节点,但将其类别设定为其父节点所含样本最多的类别。

这两种情形处理实质不同,2是利用当前节点的后验分布,而3则是把父节点的样本分布当做当前节点的先验分布。


2.划分选择

划分选择也就是从哪个属性开始划分是最优的。树的每一层都面临着最优划分选择。

2.1 信息熵

熵被用来衡量一个随机变量出现的期望值。熵越大,一个变量的不确定性就越大(也就是可取的值很多),把它搞清楚所需要的信息量也就越大,熵是整个系统的平均消息量。 信息熵是信息论中用于度量信息量的一个概念。一个系统越是有序,信息熵就越低;反之,一个系统越是混乱,信息熵就越高。所以,信息熵也可以说是系统有序化程度的一个度量。

熵(Entropy)的计算公式

熵定义为信息的期望值。先看看信息的定义:

 l(x_i)=-log_2p(x_i)

其中,p(x_i)是选择该分类的概率。对D中的元组所有分类所有可能值的信息期望,即熵,计算公式如下:

 Entropy=H(D)=E(I(D))=-\sum_i^{n} p_ilog_2(p_i),           p_i是D中任意元组属于类C_i非零概率。

熵越大,说明系统越混乱,携带的信息就越少。熵越小,说明系统越有序,携带的信息就越多。信息的作用就是在于消除不确定性。

ID3划分特征使用的就是信息增益IG。一个属性的信息增益越大,表明属性对样本的熵减少的能力就更强,该属性使得数据所属类别的不确定性变为确定性的能力越强。信息增益在统计学中称为互信息,互信息是条件概率与后验概率的比值,化简之后就可以得到信息增益。所以说互信息其实就是信息增益。计算方法【互信息=熵-条件熵】。熵描述的是不确定性。熵越大,不确定性就越大,条件熵H(B|A)描述的是在A给定的条件下B的不确定性,如果条件熵越小,表示不确定性就越小,那么B就越容易确定结果。所以使用熵减去条件熵,就得到了信息增益,他描述的不确定性的降低程度,可以用来度量两个变量的相关性。比如,在给定一个变量的条件下,另一个变量它的不确定性能够降低多少,如果不确定性降低得越多,那么它的确定性就越大,就越容易区分,两者就越相关。注:期望信息越小,分区的纯度越高。

信息增益计算

首先计算特征A对数据集D的经验条件熵H(D|A),在数学上就是条件概率分布(Condition Probability).

H(D|A)=\sum_j\dfrac{|D_j|}{|D|}\times H(D_j),项\dfrac{|D_i|}{|D|}充当第 j 个分区的权重

引入条件熵,在信息论中主要是为了消除结果的不确定性。然后计算信息增益

Gain(A) = H(D) - H(D|A)

其中,Gain(A)即为所求的信息增益。

一个熵的例子:

对游戏活跃用户进行分层,分为高活跃、中活跃、低活跃,游戏A按照这个方式划分,用户比例分别为20%,30%,50%。游戏B按照这种方式划分,用户比例分别为5%,5%,90%。那么游戏A对于这种划分方式的熵为:

同理游戏B对于这种划分方式的熵为:

游戏A的熵比游戏B的熵大,所以游戏A的不确定性比游戏B高。用简单通俗的话来讲,游戏B要不就在上升期,要不就在衰退期,它的未来已经很确定了,所以熵低。而游戏A的未来有更多的不确定性,它的熵更高。

信息增益例子:

假设有下表样本

第一列为QQ,第二列为性别,第三列为活跃度,最后一列用户是否流失。我们要解决一个问题:性别和活跃度两个特征,哪个对用户流失影响更大?我们通过计算信息熵可以解决这个问题。

按照分组统计,我们可以得到如下信息:

其中Positive为正样本(已流失),Negative为负样本(未流失),下面的数值为不同划分下对应的人数。那么可得到三个熵:

整体熵:

性别熵:

性别信息增益:

同理计算活跃度熵:

活跃度信息增益:

活跃度的信息增益比性别的信息增益大,也就是说,活跃度对用户流失的影响比性别大。在做特征选择或者数据分析的时候,我们应该重点考察活跃度这个指标。

2.2 信息增益率

在决策树中,ID3属性划分标准使用的是信息增益,C4.5使用的是信息增益率。

C4.5算法继承了ID3算法的优点,并在以下几方面对ID3算法进行了改进:

  • 用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足;
  • 在树构造过程中进行剪枝;
  • 能够完成对连续属性的离散化处理;
  • 能够对不完整数据进行处理。

C4.5算法有如下优点:产生的分类规则易于理解,准确率较高。其缺点是:在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效。另外,C4.5只适合于能够驻留于内存的数据集,当训练集大得无法在内存容纳时程序无法运行。

另外,无论是ID3还是C4.5最好在小数据集上使用,决策树分类一般只试用于小数据。当属性取值很多时最好选择C4.5算法,ID3得出的效果会非常差,因为使用信息增益划分时它倾向于取值多的属性。

计算信息增益率时,用到了分裂信息计算公式:

Split_H(D|A)=-\sum\dfrac{|D_j|}{|D|}\times log_2(\dfrac{|D_j|}{|D|})

信息增益率定义为:

Gain_Rate(A)=\dfrac{Gain(A)}{Split_H(D|A)}

选择具有最大增益率的特征作为分裂特征。

2.3 基尼指数Gini index

基尼指数主要在CART算法中用到,随机森林中用到的属性划分标准也是它。Gini index划分是二元的,它度量的是数据分区或训练元组集D的不纯度,表示的是一个随机选中的样本在子集中被分错的可能性。计算方式如下:

Gini(D)=1-\sum p^{2}_i,其中,p_i是D中元组数以C_i类的概率,对m个类计算和。

Gini指数越大,不纯度越大,越不容易区分。假设A有v个不同的值出现在特征D中,它的二元划分有2^v - 2种(除去自己和空集)。当考虑二元划分裂时,计算每个结果分区的不纯度加权和。比如A有两个值,则特征D被划分成D1和D2,这时Gini指数为:

上面的式子表示的是不确定性的大小。对于每个属性,考虑每种可能的二元划分,对于离散值属性,选择该属性产生最小Gini指数的自己作为它的分裂信息


https://en.wikipedia.org/wiki/Decision_tree

https://www.cnblogs.com/pinard/p/6050306.html

https://www.ibm.com/developerworks/cn/analytics/library/ba-1507-decisiontree-algorithm/index.html

https://blog.csdn.net/guomutian911/article/details/78599450

http://www.csuldw.com/2015/05/08/2015-05-08-decision%20tree/

猜你喜欢

转载自blog.csdn.net/keithic/article/details/81238730