一个完整决策树的构建案例

"""
    数据样本展示:
        #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)
"""
  找分割点,若先计算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
print('\n')
print('根据信息增益率大的列属性作为构建决策树的起始分割点')

# 根据初步分割点计算每个分割点的信息熵,得出以x3左子树为分割点作为第2层根节点;
h0_2 = h31_2   # 根节点的信息熵
# 针对于左子树继续划分找分割点,若先计算x2的信息增益;x2的概率占比:4个单身,3个已婚,3个离婚
# 第二步:找第二层的分割节点,若先计算x2的信息增益;x2的概率占比:4个单身,3个已婚,3个离婚
# x2的左子树:2个单身: 都是----是
p21 = 0.4
h21 = h([1.0])
# x2的中子树,1个已婚: 是
p22 = 0.3
h22 = h([1.0])
# x2的右子树,小于97.5且离婚的样本数目:1个是,1个否
p23 = 0.3
h23 = h([0.5, 0.5])
# x2的信息增益度:h2 = p21 * h21 + p22 * h22 + p23 * h23, g2 = h0 - h2
h2 = p21 * h21 + p22 * h22 + p23 * h23
g2 = h0_2 - h2
print("=" * 100)
print('以x2在x3条件下作为子树分割点的信息增益率:{}'.format(g2))

# 第3步:找第3层的分割节点,若计算x1的信息增益;x1的概率占比:4个有房产,6个无房产
# 第3层根节点的信息熵是:x2的右子树,小于97.5且离婚的样本信息熵
h0_3 = h23
# x1的左子树; x1的概率占比:4个有房产
p31 = 0.4
# (前提条件:小于等于97.5且已离婚的样本划分)且有房产:1个
h31 = h([1.0])
# x1的右子树,(前提条件:小于等于97.5且已离婚的样本划分)且无房产:1个
p32 = 0.6
h32 = h([1.0])
# x1(在x2,x3条件下)的信息增益度:h3 = p31 * h31 + p32 * h32, g2 = h0 - h2
h3 = p31 * h31 + p32 * h32
g3 = h0_3 - h3
print("=" * 100)
print('以x1在x2,x3条件下作为子树分割点的信息增益率:{}'.format(g3))

E:\myprogram\anaconda\python.exe E:/XX/机器学习课程/决策树操作/genral.py
--------------------------------------------决策树常用判定方式和构建决策树步骤----------------------------------
=========================================================================
以年收入97.5作为划分特征的时候,信息增益为:0.3958156020033584


根据信息增益率大的列属性作为构建决策树的起始分割点
=========================================================================
以x2在x3条件下作为子树分割点的信息增益率:0.6709505944546685
=========================================================================
以x1在x2,x3条件下作为子树分割点的信息增益率:1.0

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