决策树

ok

就这样的

信息熵是用来描述信息混乱程度或者说确定程度的一个值 。混乱程度越高,熵越大;混乱程度越低,熵越小。
  整个样本集合的熵如下:
       在这里插入图片描述

离散

现在要做的是挑出这个“树根”,挑出“树根”的原则是这一个点挑出来一刀切下去,要尽可能消除不确定性,最好一刀下去就把两个类分清楚,如果不行才会选择在下面的子节点再切一次,切的次数越少越好。从熵的定义来看,不难看出,熵越大说明信息混乱程度越高,做切割时越复杂,要切割若干次才能完成;熵越小说明信息混乱程度越低,做切割时越容易,切割次数也就越少。
所以试试看究竟用哪个字段做树根能够使得消除信息混杂的能力最强。

连续

试试用“年龄”字段看是否能取得最大的信息增益,但是“年龄”字段比较麻烦,它是一个连续型的字段,不像上述“学历”字段,就是3个枚举值。这种方法通常是在这个字段上找一个最佳的分裂点,然后一刀切下去,让它的信息增益最大。
在一个连续的字段上可以尝试用如下做法。
先把这个字段中的值做一个排序,从小到大。
  年龄:25、25、28、28、29、30、33、34、35、36、40、46。
  这一刀可以在任意两个数字之间切下去,切分点就是这两个数字加和再平均,如25和25之间就是25,30和33之间就是31.5。要用与用“学历”字段分割类似的方法去做切割。如果有n个数字,那么就有n-1种切法,究竟哪种好只能一个一个地试。但是也可以选择中位点,然后一个一个往两边去试。
  如果猜测这个字段值大小确实对最终决策有比较大的影响,如确实年龄是一个很重要的问题,大于某个值就直接淘汰了,小于某个值就有很大机会,那么从中位点往两边试,第一次第v个点(中位点),第二次v-1个点,第三次v+1个点,第四次v-2个点,第五次v+2个点,以此类推。每一次切割都会产生一个信息熵,一共v-1个信息熵,当发现某一个点m比它左右两边的m-1和m+1点的信息熵都要小时,就认为找到了这个点。但是这个前提条件太强了,要求确实存在一个分水岭式的分割点。

import math

# 学历分类中大专、本科、硕士占比
education = (2.0 / 12, 5.0 / 12, 5.0 / 12)
# 大专分类中相亲占比
junior_college = (1.0 / 2, 1.0 / 2)
# 本科分类中相亲占比
undergraduate = (3.0 / 5, 2.0 / 5)
# 硕士分类中相亲占比
master = (4.0 / 5, 1.0 / 5)
# 学历各分类中相亲占比
date_per = (junior_college, undergraduate, master)


# “相亲”字段划分规则下的熵
def info_date(p):
    info = 0
    for v in p:
        info += v * math.log(v, 2)
    return info


# 使用“学历”字段划分规则下的熵
def infoA():
    info = 0
    for i in range(len(education)):
        info += -education[i] * info_date(date_per[i])
    return info


print(infoA())

import math

# 学历分类中大专、本科、硕士占比
education = (2.0 / 12, 5.0 / 12, 5.0 / 12)
# 大专分类中相亲占比
junior_college = (1.0 / 2, 1.0 / 2)
# 本科分类中相亲占比
undergraduate = (3.0 / 5, 2.0 / 5)
# 硕士分类中相亲占比
master = (4.0 / 5, 1.0 / 5)
# 学历各分类中相亲占比
date_per = (junior_college, undergraduate, master)


# “相亲”字段划分规则下的熵
def info_date(p):
    info = 0
    for v in p:
        info += v * math.log(v, 2)
    return info


# 使用“学历”字段划分规则下的熵
def infoA():
    info = 0
    for i in range(len(education)):
        info += -education[i] * info_date(date_per[i])
    return info


print(infoA())

尝试不同划分 得到不同的熵,寻找最佳切割。

方法

第一步,找到信息增益最大的字段A和信息增益最大的切分点v(不管是连续类型还是枚举类型)。
第二步,决定根节点的字段A和切分点v。
第三步,把字段A从所有待选的字段列表中拿走,再从第一步开始找。注意这时相当于决策已经走了一步了,如果在根节点上已经分裂成两个分支,那么每一个分支各自又形成一个完整的决策树的选择过程,注意不同点。不同的是:可选的字段不一样了,因为A字段被去掉了;此外,在这个分支上的样本也比原来少了,因为两个分支分割了整个样本,使得一个部分分支只拥有样本的一部分。
  还可以用==“减枝法”==进行树的修剪,有“前减枝”和“后剪枝”两种方法。“前剪枝”就是提前终止树的构造,如只用了2个字段,两层树就已经构造完整个树了,保持了树的精简性。“后剪枝”就是等树完全构造完,如建模一共使用7个字段,全都用上,这样就形成了一个7层的树,如果一个分支下分类已经比较“纯粹”了,就没必要再通过其他条件分支来进行细化,那么整个枝可以直接减掉变成一个叶。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值