有一天,小明无聊,对宿舍玩CS的舍友进行统计,结果刚记下四行,被舍友认为影响发挥,给踢到床下去了,让我们看看可怜的小明的记录:
-----------------------------
武器 | 子弹数量 | 血 | 行为
-----------------------------
机枪 | 多 | 少 | 战斗
机枪 | 少 | 多 | 逃跑
小刀 | 少 | 多 | 战斗
小刀 | 少 | 少 | 逃跑
-----------------------------
为了对得起小明记录的这四条记录,我们对其进行决策树分析,从数据中看:
1. 如果一个玩家子弹很多,那么即使血少他也会战斗,如果子弹少的话,即使血多,他也会逃跑隐蔽起来;
2. 那我们再看子弹少的情况下,武器靠刀子,当血多时候,他还是会打一打得,但是血少,就立即逃跑隐蔽了。
这是我们大脑直觉上去分析,既然本文我是想聊一聊决策树,那么我们就用决策树来对小明的这些数据小试牛刀一下,顺便来慰藉一下小明(从小到大我们已经看过无数的小明了,这里再借用一下大度的小明)。
我们现在将数据分为两块:
X = {武器类型,子弹数量,血}
Y = {行为}
我们建立这颗决策树的目的就是,让计算机自动去寻找最合适的映射关系,即:Y = f(X),所谓听上去大雅的“数据挖掘”学科,干得也差不多就是这回事,X我们称之为样本,Y我们称之为结果(行为/类)。
样本是多维的,X = {x1,x2,...xn},如本例:X = {x1=武器类型,x2=子弹数量,x3=血},我们就是要通过这些不同维度的观测记录数据,和应对的不同结果,找到规律(映射关系),举个例子:
X = {天气,温度,湿度,女友约会} -> Y = {是否答应兄弟下午去打篮球}
X = {老妈说你是胖子,老婆说你是胖子,自己上秤评估自己体重} -> Y = {去办健身卡减肥}
这样来说,X的多维不同的数据,大个比方,更像是很多大臣,那么我们就是要根据这些大臣的意见,来决策,如本例:
>> 左大臣:武器类型
>> 中大臣:子弹数量
>> 右大臣:血
这些大臣每个人都有想法,左右着皇帝继续战斗还是撤退,但是三个也不能全信,那么我们就要根据他们的陈年老帐(训练样本)来评判他们的话语的重要性,当然,优先级高的肯定话语是有重量的,我们先提前来预览一下这个例子训练出来的决策树的样子:
这 个根据小明的数据训练出来的决策树是不是和我们刚才拍脑门分析出来的结果差不多呢?看,子弹多就开打,子弹少,在看看用什么武器,如果又没子弹又用机枪, 那铁定跑,如果用小刀,在掂量一下自己血厚不厚,厚则打,不厚则逃,看来决策树分析的结果还是可以的啊,接下来,我们来研究研究,计算机(这个只会重复人 们给它设定的代码的家伙)是如何实现这样的分析的。
既然是三个大臣提意见{左大臣:武器类型,中大臣:子弹数量,右大臣:血},那么我们要分析一下历史数据(训练数据)他们哪个话更靠谱:
我们先单纯的看看左大臣的历史战绩(统计训练样本):
机枪 -> 战斗
机枪 -> 逃跑
小刀 -> 战斗
小刀 -> 逃跑
用机枪,你战斗逃跑的概率都是50%,用刀子,你亦似打似逃!看来这个大臣立场不坚定啊!
再看看中大臣的:
子弹多 -> 战斗
子弹少 -> 逃跑
子弹少 -> 战斗
子弹少 -> 逃跑
子弹多,你战斗概率是100%,子弹少,你33.3%打,你66.6%撤!这位大臣似乎坚定了一些。
再看看右大臣的:
血少 -> 战斗
血多 -> 逃跑
血多 -> 战斗
血少 -> 逃跑
和左大臣一样,立场不坚定,50:50啊!
这样,中大臣的话的重量就提升了,因此决策书的第一层就重用中大臣吧(中大臣变成一品大员)
计算机是怎么来做到这一步的呢?且让我一步一步讲:
决策树训练中,有一个很重要的尺子,来衡量大臣的可信度,这个尺子,就是信息论的熵(Entropy),这个熵是何许人也,竟然朝廷大臣的可信度竟然用次来衡量,让我们对他做个自我介绍吧:
熵, 洋名为(Entropy),乃测量信息的混乱程度为职,纵横科学界各门学术之中,为人低调,俭朴,就一个很短的公式:E = sum(-p(I)*log(p(I))),I=1:N(N类结果,如本例两种,战斗或逃跑),当信息一致,所有样本都属于一个类别I,那么熵为0,如果 样本完全随机,那么熵为1,表明这个臣子对这种状态的预测就是胡言乱语。
OK,熵,告诉我你对这个数据的看法:
E(机枪) = -(1/2)Log2(1/2) - (1/2)Log(1/2) = 0.5 + 0.5 = 1
E(小刀) = -(1/2)Log2(1/2) - (1/2)Log(1/2) = 0.5 + 0.5 = 1
E(子弹多) = -(1/1)Log2(1/1) - (0/1)Log(0/1) = 0 + 0 = 0
E(子弹少) = -(1/3)Log2(1/3) - (2/3)Log(2/3) = 0.5283 + 0.39 = 0.9183
E(血多) = -(1/2)Log2(1/2) - (1/2)Log(1/2) = 0.5 + 0.5 = 1
E(血少) = -(1/2)Log2(1/2) - (1/2)Log(1/2) = 0.5 + 0.5 = 1
那么我们怎么用这个熵来衡量大臣(每维数据)的可信度呢,这里还要再引出一位仁兄,其是熵的上级,他熟知熵的能力,很会用熵,他就是信息增益(Information Gain),我们来看看这位上级是如何用熵来衡量的:
Gain(Sample,Action) = E(sample) - sum(|Sample(v)|/Sample * E(Sample(v)))
OK,Information Gain,说说你是怎么评估这个例子的三位大臣的!
Gain(武器类型) = E(S) - (2/4)*E(机枪) - (2/4)*E(小刀) = 1 - (2/4)*1 - (2/4)*1 = 0
Gain(子弹数量) = E(S) - (1/4)*E(子弹多) - (3/4)*E(子弹少) = 1 - (1/4)*0 - (3/4)*0.9183 = 0.3113
Gain(血量) = E(S) - (2/4)*E(血多) - (2/4)*E(血少) = 1 - (2/4)*1 - (2/4)*1 = 0
接着,计算机通过信息增益结果,选择最大的,作为一品大员
且看一品大员对子弹多的情况下料事如神(暂且不说本例样本少),但是其在子弹少的情况下,决策还是不行的,那么,再用同样的方法,再去选择二品,三品,这就是决策树的训练,呵呵,不知有没有帮助各位理解