# 决策树的构建方式有多种,这里为了区分方便,只展示根据个别节点划分后的信息增益。
""" 不同概率分布对信息熵的影响 """ 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:\myprogram\anaconda\python.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