# 决策树的构建方式有多种,这里为了区分方便,只展示根据个别节点划分后的信息增益。
"""
不同概率分布对信息熵的影响
"""
import numpy as np
def entropy(p):
"""
信息熵的计算公式
:param p:
:return:
"""
return np.sum([-t * np.log2(t) for t in p])
print(entropy([0.25, 0.25, 0.25, 0.25]))
print('n')
print(entropy([0.95, 0.15, 0.05, 0.05]))
print('n')
print(entropy([0.5, 0.5]))
print('n')
print(entropy([5.0 / 8, 3.0 / 8]))
E:myprogramanacondapython.exe E:/XX机器学习课程/决策树操作/genral.py
2.0
0.9130382009852551
1.0
0.954434002924965
print('----------------------决策树常用判定方式和构建决策树步骤--------------- ')
"""
1. 常用3种评价概率分布对系统不确定性的影响;
2. 信息熵的计算过程:
2.1 将所有的特征属性(x1, x2, x3)看做一个一个树节点,对样本数据进行判断初始根节点的选择。
2.2 计算整个数据集节点的纯度信息。
2.3 重复使用第2步,找出最优特征以及该特征的最优划分方式,得出最终子节点N1,N2...Nm。
2.4 对子节点分别进行2,3步,直到每个子节点都足够“纯”。
"""
# 案例示例
"""
数据样本展示:
#x1,x2,x3, Y
是,单身,125,否
否,已婚,100,否
否,单身,100,否
是,已婚,110,否
是,离婚,60,否
否,离婚,95,是
否,单身,85,是
否,已婚,75,否
否,单身,90,是
是,离婚,220,否
"""
import numpy as np
import pandas as pd
def entropy(p):
"""
信息熵的计算公式
:param p:
:return:
"""
return np.sum([-t * np.log2(t) for t in p])
def gini(p):
"""
Gini系数的计算公式
:param p:
:return:
"""
return 1-np.sum([t * t for t in p])
def error(p):
"""
错误率de公式
:param p:
:return:
"""
return 1-np.max(p)
def h(p):
"""
决策树中对节点纯度的衡量
:param p:
:return:
"""
return entropy(p)
# return gini(p)
# return error(p)
# 第一步:先计算标签Y概率占比:7个是,3个否
h0 = h([0.7, 0.3])
# 第二步:找分割点,若先计算x1的信息增益;x1的概率占比:4个是,6个否
# 4个是: x1的左子树
p11 = 0.4
h11 = h([1.0])
# 6个否:x1的右子树
p12 = 0.6
h12 = h([0.5, 0.5])
# x1的信息增益度:h1 = p11*h11+p12*h12, g = h0 - h1
h1 = p11 * h11 + p12 * h12
g1 = h0 - h1
print("=" * 100)
print('以有无房产作为分割点的信息增益率:{}'.format(g1)) # 以有无房产作为分割点的信息增益率:0.2812908992306927
# 4个单身: x2的左子树
p21 = 0.4
h21 = h([0.5, 0.5])
# 3个已婚: x2的中子树
p22 = 0.3
h22 = h([1.0])
# 3个离婚: x2的右子树
p23 = 0.3
h23 = h([1.0/3, 2.0/3])
# x2的信息增益度:h2 = p21 * h21 + p22 * h22 + p23 * h23, g2 = h0 - h2
h2 = p21 * h21 + p22 * h22 + p23 * h23
g2 = h0 - h2
print("=" * 100)
print('以x2(单身,已婚,离婚)作为分割点的信息增益率:{}'.format(g2)) # 以x2(单身,已婚,离婚)作为分割点的信息增益率:0.2058021490143458
"""
找分割点,若先计算x3的信息增益;x3的概率占比:要设置分届阈值,因为它是连续特征
以年收入80作为x3划分值
"""
# 第二步:找分割点,若先计算x3的信息增益;x3的概率占比:要设置分届阈值,因为它是连续特征:假设>80,<=80
# <=80: x3的左子树
p31 = 0.2
h31 = h([1.0])
# >80: x3的右子树:5个否,3个是
p32 = 0.8
h32 = h([5.0/8, 3.0/8])
# x3的信息增益度:h3 = p31 * h31 + p32 * h32, g3 = h0 - h3
h3 = p31 * h31 + p32 * h32
g3 = h0 - h3
print("=" * 100)
print('以年收入80作为划分特征的时候,信息增益为:{}'.format(g3))
# 以年收入80作为划分特征的时候,信息增益为:0.11774369689072062
"""
找分割点,若先计算x3的信息增益;x3的概率占比:要设置分届阈值,因为它是连续特征
以年收入97.5作为x3的划分值
"""
# 第一步:先计算标签Y概率占比:7个是,3个否
h0 = h([0.7, 0.3])
# 第二步:找分割点,若先计算x3的信息增益;x3的概率占比:要设置分届阈值,因为它是连续特征:假设>97.5,<=97.5
# <=97.5: x3的左子树:2个否,3个是
p31_2 = 0.5
h31_2 = h([2.0/5, 3.0/5])
# >97.5: x3的右子树:都是否
p32_2 = 0.5
h32_2 = h([1.0])
# x3的信息增益度:h3_2 = p31_2 * h31_2 + p32_2 * h32_2; g3_2 = h0 - h3_2
h3_2 = p31_2 * h31_2 + p32_2 * h32_2
g3_2 = h0 - h3_2
print("=" * 100)
print('以年收入97.5作为划分特征的时候,信息增益为:{}'.format(g3_2))
# 以年收入97.5作为划分特征的时候,信息增益为:0.3958156020033584
最后
以上就是想人陪书本最近收集整理的关于构建决策树根节点的案例的全部内容,更多相关构建决策树根节点内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复