机器学习(周志华)西瓜书 课后习题4.3 信息熵决策树算法——python实现(包括树的可视化)
算法原理
1.信息熵
2.信息增益
我们所以要做的就是不断地从当前剩余的属性当中选取最佳属性对样本集进行划分。
算法的伪代码
数据集
Python实现
由于基于信息增益的决策树算法一般适用于离散属性,若要处理连续属性则必须将其按照一定规则转为离散属性。所以在接下来的代码实现当中并未处理连续属性
1. 信息熵的计算
def entropy(D):
count=D.shape[0]
Ent=0.0
temp=D['好瓜'].value_counts()
for i in temp:
Ent-=i/count*np.log2(i/count)
return round(Ent, 3)
2. 信息增益的计算
def cal_gain(D,Ent,A):
'''
D:剩余的样本集
Ent:对应的信息熵
A:剩余的属性集合
'''
gain = []
count=D.shape[0]
for i in A:
temp=0
for j in attribute[i]:
temp+=D[(D[i]==j)].shape[0]/count*entropy(D[(D[i]==j)])
gain.append(round(Ent-temp,3))
return np.array(gain)
3.决策树的生成
def same_value(D, A):
for key in A:
if key in attribute and len(D[key].value_counts()) > 1:
return False
return True
def choose_largest_example(D):
count = D['好瓜'].value_counts()
return '是' if count['是'] >= count['否'] else '否'
def choose_best_attribute(D,A):
Ent=entropy(D)
gain=cal_gain(D,Ent,A)
return A[gain.argmax()]
def TreeGenerate(D, A):
Count = D['好瓜'].value_counts()
if len(Count) == 1:
return D['好瓜'].values[0]
if len(A) == 0 or same_value(