机器学习-决策树算法

来源:互联网 发布:java模糊查询 编辑:程序博客网 时间:2024/05/21 06:17
首先,决策树算法解决的是一个分类问题。它是为了解决预测目标对象属于哪一个预设分类的问题。比如说,我不知道明天是否要出门,于是我将预设分类为出门和不出门。我会根据天气预报的明天的天气情况来决定我最终的预设分类是哪个。决策树就是如此,它会根据已有数据及其属性,来将预测的目标对象归属到预设分类中。

第二,决策树的组成。决策树有内部节点、外部节点和边。内部节点表示预测的条件,比如说上例中我们预测是否要出门,根据的是天气,在此,天气就称为属性(特征),是内部节点。外部节点,就是上例中的出门和不出门,就是预设分类。边表示属性的取值。


第三,决策树的属性的选择。即决策树内部节点的选择。比如说,还以出门与不出门为例,训练集里面有三个属性,天气、路程,这些属性都会作为决策树的内部节点存在,但是这些属性分别放置在决策树的哪一层呢?这就是我们说的内部节点的选择问题。
为说明这个问题,我们先举两个例子。比如说,第一种情况,我投硬币猜正面反面,正面反面的概率都是1/2,那么我很难猜到投硬币的结果是正面还是反面。第二种情况,我跟泰森比赛打拳,姑且我们将泰森赢的概率记成99.9%,我赢的概率记成0.1%,如此我们可以准确的预测比赛打拳的结果,毫无疑问泰森会赢。如此,因为第一种情况,我们无法准确的预测结果,所以我们把第一种情况称为系统混乱程度大;第二种情况可以准确预测结果,因此我们把第二种情况称为系统混乱程度小,即系统稳定程度高。
在属性选择上,我们会优先选择混乱程度小的属性,尽可能将混乱程度小的属性放在决策树的上层,优先判断稳定的属性。比如,预测明天出门还是不出门,两个属性,天气和路程,把哪个属性放在上层呢?假如训练集里面天气属性:晴天出门的概率是0.8,雨天出门的概率是0.2;路程属性:路程超过10公里出门的概率是0.6,路程小于等于10公里的出门概率是0.4 。那么可以看出天气属性的混乱程度更小,更加稳定,所以我们把天气属性放在决策树的上层,而把路程属性放在决策树的下层,优先考虑天气因素对预测结果的影响。

第四,混乱程度的度量。有两个标准可以衡量系统的混乱程度,信息熵和Gini系数。
在说信息熵之前,先说一下信息量。举个例子,如果现在是夏天,新闻报道明天回下雪,那么这个信息是爆炸性的,很多人都会关注,这个信息很有价值,则这个信息的信息量就大。如果现在是夏天,新闻报道明天不会下雪,那么大家都会认为不下雪在夏天很正常,没有多少人会去关注这个事情,这个信息就没有多少价值,我们就认为这个信息的信息量小。从这个例子可以看出来,事件的概率越小,则该事件的信息量就越大;事件发生的概率越大,则该事件的信息量就越小。信息量的大小与概率成反比。
香农定义的一个事件的信息信息量为:
I(X) = log(1/p) 其中p为事件X发生的概率(log以2为底)。
信息熵:Entropy。一个随机变量 X 可以代表n个随机事件,对应的随机变为X=xi, 那么熵的定义就是 X的加权信息量。
H(x) = p(x1)I(x1)+...+p(xn)I(x1) 
        = p(x1)log(1/p(x1)) +.....+p(xn)log(1/p(xn))
        = -p(x1)log(p(x1)) - ........-p(xn)log(p(xn))
其中p(xi)代表xi发生的概率

例如有32个足球队比赛,每一个队的实力相当,那么每一个对胜出的概率都是1/32
那么 要猜对哪个足球队胜出 非常困难,
这个时候的熵H(x) = 32 * (1/32)log(1/(1/32)) = 5
同样,Gini系数,或者基尼不纯度也表示混乱程度。
基尼不纯度的大概意思是 一个随机事件变成它的对立事件的概率
例如,一个随机事件X ,P(X=0) = 0.5 ,P(X=1)=0.5
那么基尼不纯度就为 P(X=0)*(1 - P(X=0)) + P(X=1)*(1 - P(X=1)) = 1- [P(x=0)*P(x=0) + P(x=1)*P(x=1)] = 0.5
一个随机事件Y ,P(Y=0) = 0.1 ,P(Y=1)=0.9
那么基尼不纯度就为P(Y=0)*(1 - P(Y=0)) + P(Y=1)*(1 - P(Y=1)) = 0.18
很明显 X比Y更混乱,因为两个都为0.5 很难判断哪个发生。而Y就确定得多,Y=0发生的概率很大, 而基尼不纯度也就越小。 所以基尼不纯度也可以作为衡量系统混乱程度的标准。

第五,决策树的构建算法-Hunt
该算法是ID3算法、C4.5算法和CART算法的基础。以寻找局部最优解的方式构建决策树。
基本步骤:
1、将所有的记录看成是一个节点
2、找到每一个属性的最佳分割点,遍历每一个属性,选择使孩子节点数据最纯的那个属性
3、得到孩子节点N1和N2,再N1和N2按照步骤2遍历,直到停止条件为止
如此,涉及到三个问题:
1、怎么分割属性;2、怎么选择属性;3、停止条件是什么。
回答第一个问题:对于属性值是离散的,不存在找分割点的问题。对于属性值是连续的:首先,确定候选分割点,候选分割点一般是两个相邻属性值的中间点,例如一组连续的属性值(首先排序,可以降低复杂度)是10、20、30、40、50、60,那么候选分割点为(5)、15、25、35、45、55、(65)。之后在每个候选分割点处计算分割后的稳定程度,选取稳定程度最高的候选分割点作为正式的分割点。
第二个问题:在上文第三点、第四点已经交代,优先选择稳定程度高的,即信息熵和Gini系数小的。
第三个问题:最正常的停止方式是,当已经没有属性可以供父节点进行分裂的时候就会停止。然而,这种方式往往会因为描述的过于详细,而出现过拟合现象。过拟合示例:
所以实际中,会自定义停止的条件,如
1、当节点的数据量小于一个指定的数量时,不继续分裂。因为数据量太小,容易把噪声数据强化。
2、熵或者基尼值小于阀值。当熵或者Gini系数达到一定小时,说明此时系统稳定程度已经很高了,没有必要继续往下分裂。同时,这样也可以提高算法的性能。
3、达到指定的节点深度。如此可以提高算法性能。

第六,决策树的构建算法-ID3
ID3算法是在Hunt算法基础上,采用了以信息增益为准则,选择信息增益最大的属性(特征)。
信息增益
举例:满足什么情况才去玩高尔夫
DayTemperatrueOutlookHumidityWindyPlayGolf?07-05hotsunnyhighfalseno07-06hotsunnyhightrueno07-07hotovercasthighfalseyes07-09coolrainnormalfalseyes07-10coolovercastnormaltrueyes07-12mildsunnyhighfalseno07-14coolsunnynormalfalseyes07-15mildrainnormalfalseyes07-20mildsunnynormaltrueyes07-21mildovercasthightrueyes07-22hotovercastnormalfalseyes07-23mildrainhightrueno07-26coolrainnormaltrueno07-30mildrainhighfalseyes
总体D的信息熵:
P(yes) = Num(yes) / ( Num(yes) + Num(no) ) = 9/14
P(no) = Num(no) / ( Num(yes) + Num(no) ) = 5/14
H(D) = - P(yes)*logP(yes) - P(no)*logP(no) = - 9/14*log(9/14) - 5/14*log(5/14)

条件熵:比如此处求特征为outlook的条件熵 H(D|outlook):
P(yes|sunny) = 3/5
P(no|sunny) = 2/5
H(sunny) = -P(yes|sunny)*logP(yes|sunny) -P(no|sunny)*logP(no|sunny) = - 3/5*log(3/5) - 2/5*log(2/5)

P(yes|rain) = 3/5
P(no|rain) = 2/5
H(rain) = -P(yes|rain)*logP(yes|rain) -P(no|rain)*logP(no|rain) = - 3/5*log(3/5) - 2/5*log(2/5)

P(yes|overcast) = 1
P(no|overcast) = 0
H(overcast) = -P(yes|overcast)*logP(yes|overcast) -P(no|overcast)*logP(no|overcast) = - 1*log(1) - 0*log(0)

P(sunny) = 5/14
P(rain) = 5/14
P(overcast) = 4/14
条件熵(加权计算) H(D|outlook) = P(sunny)*H(sunny) + P(rain)*H(rain) + P(overcast)*H(overcast)
信息增益:Gain = H(D) - H(D|outlook)

第七,决策树的构建算法-C4.5
ID3算法存在一个问题,就是偏向于多值属性,因为属性的值多,他的分支就多,分支多则子节点的条件熵就小,但实际情况分支过多会造成过拟合问题,因此需要对多值属性进行适当惩罚。所以,C4.5使用信息增益率代替信息增量,解决了这个问题。
信息增益比:
首先需要计算属性A的内部信息
仍然以上表为例:
属性Outlook的信息量 IntI(Outlook) = - Num(sunny)/Num(Outlook)*log(Num(sunny)/Num(Outlook)) - Num(rain)/Num(Outlook)*log(Num(rain)/Num(Outlook)) - Num(overcast)/Num(Outlook)*log(Num(overcast)/Num(Outlook))
= - 5/14*log(5/14) - 5/14*log(5/14) -4/14*log(4/14)
则信息增益率 Gr = Gain / Intl = H(D) - H(D|outlook) / Intl(Outlook)

第八,决策树的构建算法-CART
在属性分割上,CART采用二元划分法,所以得到的结果是一棵二叉树。采用二叉树的原因:1、ID3和C4.5据属性值分割数据,之后该特征不会再起作用,这种快速切割的方式会影响算法的准确率。2、对于连续的属性分割,ID3和C4.5会扫描排序,在性能上有所损失。
在属性选择上,CART采用的是Gini系数。原因时Gini系数计算较为简单,可以提高性能。
Gini系数的计算,我们仍以上表为例,计算Outlook的Gini系数:
首先把Outlook属性划分为Sunny和not_sunny
之后分别计算sunny和not_sunny下的Gini系数:
Gini(sunny) = 1 - num(yes)/num(sunny) * num(yes)/num(sunny) - num(no)/num(sunny) * num(no)/num(sunny) = 1 - 3/5 * 3/5 - 2/5 * 2/5
Gini(not_sunny) =1 - num(yes)/num(not_sunny) * num(yes)/num(not_sunny) - num(no)/num(not_sunny) * num(no)/num(not_sunny) = 1 - 7/9 * 7/9 - 2/9 * 2/9
再加权,得到outlook属性的Gini系数:
Gini(outlook) = num(sunny) / num(oulook) * Gini(sunny) + num(not_sunny) / num(oulook) * Gini(not_sunny) = 5/14 * Gini(sunny) + 9/14 * Gini(not_sunny)
原创粉丝点击