构建决策树根节点的案例

# 决策树的构建方式有多种,这里为了区分方便,只展示根据个别节点划分后的信息增益。

"""
   不同概率分布对信息熵的影响
"""
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

你可能感兴趣的:(机器学习,Python基础语言,决策树,python)