西瓜书 习题4.3 编程实现信息熵决策树、绘制决策树、解决matplotlib中文乱码问题

就照着西瓜书P74的伪代码,把这段代码翻译成python就好了,这里决策树的实现没有参考其他人的代码,是我纯原创的。

项目github地址:

https://github.com/qdbszsj/Decision-Tree-based-on-information-entropy

这里要先说一下我的数据结构,D是一个list,里面是数据集的行索引,一共17个数据,那么D里的list元素取值范围就是从0到16,A也是一个list,大小固定,是n=10个元素,用过的或者不能用的属性位置标记为-1,这里数据结构其实可以修改,本来以为那两个小数的数据要在A里存成浮点数的,后来写的时候发现不需要,但是暂时先这么写了,复杂度差不了多少,所以A里的元素只有两种状态:-1和1,分别代表不可用和可用。

树结点的数据结构,title表示从上到下指向自己的那条线的意义,一开始根节点没有指向自己的线,那么就是“root”,v就是当前结点需要显示的东西,children是一个list,里面一开始是空,存储儿子结点。

然后就是最重要的函数:生成一颗决策树。先初始化一个结点,(1)如果D里的样本都是同一类别,那么就直接把当前node标记一下结果,return就行了,这书P74页里都写着很明白。(2)然后如果没有可用的A,也就是说A是空集,或者选出的D里的这些个体拥有的所剩的A属性都相同,那么就把node标记为D里样本数最多的类别,return 。

之后就要求A里面那些属性,用哪个属性能得到最大的信息熵增益,就是我这里的choose the best attribute 。这里就是分别求每个属性的信息熵,然后选取(公式4.2)若干个Gain(D,a)里最大的那个,这里值相同时说是随机选取,我这里没有用随机数,后一个严格大于前一个才更新。求Gain(D,a)的时候,分为两种情况,一种是针对密度、含糖率这种的连续值,另一种是针对普通的属性值。求连续值的gain的时候,就依据公式4.7,把D里的连续值排个序,取相邻的数的中点,作为划分点,然后找到能使得gain最大的划分点(公式4.8)这里我直接把划分出的熵和划分点的数值都作为返回值传了出来,免得下面要用然后再求。这里书中说有人求划分点的时候,直接拿原始数据的值作为临界值一个个划分,不求相邻数据的中点,怎么说呢,这样子写很严谨,但是我觉得有欠拟合的风险,我这样取中点的做法又有点过拟合的风险,这里是一个对于模型来说可调的小参数。

然后求出了熵增益最大的属性后,我们就可以生成以a划分的子结点了,这里书上的情况(3)说如果子结点为空就return,我觉得应该是continue而不是return,因为可能的子结点要全写上啊,即便是空也要当做子结点,只不过不用再往下递归了。

# -*- coding: utf-8 -*-
'''
data importion
'''
import numpy as np  # for matrix calculation
import pandas as pd

# load the CSV file as a numpy matrix
#separate the data with " "(blank,\t)

dataset = pd.read_csv('/home/parker/watermelonData/watermelon_3.csv', delimiter=",")
Attributes=dataset.columns
print(Attributes)
m,n=np.shape(dataset)
dataset=np.matrix(dataset)
for i in range(m):
    if dataset[i,n-1]=="是":dataset[i,n-1]=1
    else:dataset[i,n-1]=0
    dataset[i,7]=round(dataset[i,7],3)
    dataset[i, 8] = round(dataset[i, 8], 3)

attributeSet=[]
for i in range(n):
    curSet=set()
    for j in range(m):
        curSet.add(dataset[j,i])
    attributeSet.append(curSet)

print(dataset)

#precision for float numbers
EPS=0.000001

#D is a ID list with values in [0,16], A is a list with the size of 10,
# if attribute i is used,the position i is -1,else is a positive number
#the density and
  • 14
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值