自编程实现决策树(使用ID3算法)

本文记录了作者不使用sklearn库,而是通过Python自编实现ID3决策树的过程。从数据读取、计算信息熵和信息增益,到处理数据划分问题,再到理解并构建决策树的思路和代码实现,详细阐述了整个过程。最终,作者成功地用自编代码构建了决策树,并进行了测试。

自编程实现决策树(使用ID3算法)

不使用sklearn中的决策树方法,根据以下数据集自己编写决策树构建程序(建议用python语言)。

Tid Refund Marital Status Taxable Income Cheat
1 yes single 125k no
2 no married 100k no
3 no single 70k no
4 yes married 120k no
5 no divorced 95k yes
6 no married 60k no
7 yes divorced 220k no
8 no single 85k yes
9 no married 75k no
10 no single 90k yes

过程记录

一开始不知道要从哪里开始下手,自己开始逐步摸索,首先将老师给的数据存到了Excel表格中,之后通过pandas的read_excel()函数读入,并拿到了各属性列的数据,但是之后就没大有思路了(怪自己没有将本次实验内容与老师上课所讲内容好好结合),于是在百度上搜索自编程实现决策树,发现可以用ID3算法实现,于是就去仔细看了下ID3算法是什么,发现就是老师上课讲的内容根据信息熵计算信息增益,然后选取信息增益最大的进行分类,重复此过程!ID3算法数值分析过程这篇博客讲的过程十分清晰,之后开始着手写信息熵和信息增益的计算

import pandas as pd
import numpy as np

def get_entropy(data, name):
    # 找出该属性列的唯一值
    data_items =  data[name].unique().tolist()

    entropy_items = 0

    for item in data_items:
        # 对每个不同item属性值求信息熵
        data_item = data[data[name] == item]
        sums_item_no = data_item[data_item['Cheat'] == 'no'].shape[0]
        sums_item_yes = data_item[data_item['Cheat'] == 'yes'].shape[0]
        sums_item_no_p = sums_item_no / (sums_item_no + sums_item_yes)
        sums_item_yes_p = sums_item_yes / (sums_item_no + sums_item_yes)
        # 计算不同item属性值的信息熵
        if sums_item_no_p == 0 or sums_item_yes_p == 0:  # 这里要处理子数据集为空的情况;这里暂未处理
            entropy_item = 0

        else:
            entropy_item = -np.log2(sums_item_no_p) * sums_item_no_p - np.log2(sums_item_yes_p) * sums_item_yes_p
        # 计算改item属性值所占概率
        item_p = data_item.shape[0] / sums
        # 计算信息增益
        entropy_items += item_p * entropy_item
    return entropy_items


if __name__ == '__main__':
    inputfile = 'D:\shujuwajue\data.xls'
    data = pd.read_excel(inputfile, index_col=u'Tid')

    # 找出各属性列的唯一属性值
    refunds = data['Refund'].unique().tolist()
    print(refunds)
    marital_status = data['Marital Status'].unique().tolist()
    print(marital_status)
    taxable_income = data['Taxable Income'].unique().tolist()
    print(taxable_income)
    cheat = data['Cheat'].unique().tolist()
    print(cheat)

    # 总记录数
    sums = data.shape[0]
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值