决策树代码部分

决策树实战的原始的直观理解为if-else的逻辑结构


def predict(x1, x2, x3):
    if x3 >= 97.5:
        return 1
    else:
        if x1 == 1:
            return 1
        else:
            if x2 == 0:
                return 0
            elif x2 == 1:
                return 1
            else:
                return 0

# 无房产、单身、年收入55K
predict(0,0,55)
print(predict(0,0,55))

输出0,这就是最基本的决策树,然而决策树的关键在于,用最少的条件得到最终的结果

第二: 决策树的构建过程

# -- encoding:utf-8 --
"""
Create on 19/3/10
"""

import sys
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):
    """
    错误率的公式
    :param p:
    :return:
    """
    return 1 - np.max(p)


def h(p):
    """
    决策树中对于纯度的衡量
    :param p:
    :return:
    """
    return gini(p)
    # return entropy(p)


"""
是,单身,125,否
否,已婚,100,否
否,单身,100,否
是,已婚,110,否
是,离婚,60,否
否,离婚,95,是
否,单身,85,是
否,已婚,75,否
否,单身,90,是
是,离婚,220,否
"""


# 一、第一个判断节点的选择
# 1.0 计算整个数据集的纯度(样本数10个,3个是,7个否)
h0 = h([0.7, 0.3])
# 1.1 计算以房产作为分割点的时候条件熵(遍历数据计算x1为是和否的概率)
# 第一个分支: 是;样本数目:4,全部为否
p11 = 0.4
h11 = h([1.0])
# 第二个分支:否;样本数目:6,3个是,3个否
p12 = 0.6
h12 = h([0.5, 0.5])
h1 = p11 * h11 + p12 * h12
g1 = h0 - h1
# todo:信息增益率

print("以房产作为划分特征的时候,信息增益为:{}".format(g1))

# 1.2 计算以婚姻情况作为分割点的时候条件熵(遍历数据计算x2为单身、离婚、已婚的概率)
# 第一个分支: 单身;样本数目:4,2个是,2个否
p21 = 0.4
h21 = h([0.5, 0.5])
# 第二个分支:离婚;样本数目:3,1个是,2个否
p22 = 0.3
h22 = h([1.0 / 3, 2.0 / 3])
# 第三个分支: 已婚,样本数目:3,3个否
p23 = 0.3
h23 = h([1.0])
h2 = p21 * h21 + p22 * h22 + p23 * h23
g2 = h0 - h2
print("以婚姻作为划分特征的时候,信息增益为:{}".format(g2))

# 1.3. 以年收入80作为划分值
# 第一个分支: 小于等于80;样本数目:2,2个否
p31 = 0.2
h31 = h([1.0])
# 第二个分支:大于80;样本数目:8,3个是,5个否
p32 = 0.8
h32 = h([3.0 / 8, 5.0 / 8])
h3 = p31 * h31 + p32 * h32
g3 = h0 - h3
print("以年收入80作为划分特征的时候,信息增益为:{}".format(g3))

# 1.4. 以年收入97.5作为划分值
# 第一个分支: 小于等于97.5;样本数目:5,3个是,2个否
p41 = 0.5
h41 = h([2.0 / 5, 3.0 / 5])
# 第二个分支:大于97.5;样本数目:5,5个否
p42 = 0.5
h42 = h([1.0])
h4 = p41 * h41 + p42 * h42
g4 = h0 - h4
print("以年收入97.5作为划分特征的时候,信息增益为:{}".format(g4))
# sys.exit()
print("=" * 100)
# 二、针对于左子树继续划分(年收入小于等于97.5的数据;样本数目:5,3个是,2个否)
h0 = h41

# 2.1 计算以房产作为分割点的时候条件熵
# 第一个分支: 是;样本数目:1,全部为否
p11 = 0.2
h11 = h([1.0])
# 第二个分支:否;样本数目:4,3个是,1个否
p12 = 0.8
h12 = h([0.75, 0.25])
h1 = p11 * h11 + p12 * h12
g1 = h0 - h1
print("以房产作为划分特征的时候,信息增益为:{}".format(g1))
# 2.2 计算以婚姻情况作为分割点的时候条件熵(遍历数据计算x2为单身、离婚、已婚的概率)
# 第一个分支: 单身;样本数目:2,2个是
p21 = 0.4
h21 = h([1.0])
# 第二个分支:离婚;样本数目:2,1个是,1个否
p22 = 0.4
h22 = h([0.5, 0.5])
# 第三个分支: 已婚,样本数目:1,1个否
p23 = 0.2
h23 = h([1.0])
h2 = p21 * h21 + p22 * h22 + p23 * h23
g2 = h0 - h2
print("以婚姻作为划分特征的时候,信息增益为:{}".format(g2))

print("=" * 100)
# 三、针对于右子树继续划分(年收入大于97.5的数据;样本数目:5,5个否 --> 不需要划分)
# 四、针对于第一个分支的子树继续划分(单身的数据;样本数目:2,2个是 --> 不需要划分)
# 五、针对于第二个分支的子树继续划分(离婚的数据;样本数目:2,1个是 1个否)
# TODO: 自己补全
# 六、针对于第三个分支的子树继续划分(已婚的数据;样本数目:1,1个否 --> 不需要划分)

结果为:

C:\Users\adcar\Anaconda3\envs\torchgpu1.10.2\python.exe D:/决策树/03_决策树构建过程代码理解_01.py
以房产作为划分特征的时候,信息增益为:0.12000000000000005
以婚姻作为划分特征的时候,信息增益为:0.08666666666666667
以年收入80作为划分特征的时候,信息增益为:0.04500000000000004
以年收入97.5作为划分特征的时候,信息增益为:0.18000000000000005
====================================================================================================
以房产作为划分特征的时候,信息增益为:0.17999999999999994
以婚姻作为划分特征的时候,信息增益为:0.27999999999999997
====================================================================================================

进程已结束,退出代码为 0

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值