机器学习 —— DecisionTree决策树( 三 )


因为F具有最大的信息增益,所以第一次分裂选择F为分裂属性,分裂后的结果如下图表示:
在上图的基础上,再递归使用这个方法计算子节点的分裂属性,最终就可以得到整个决策树 。
import numpy as npimport pandas as pdimport matplotlib.pyplot as plt
练习
计算上图的信息熵,确定下一个分类的特征
ID3算法
# D :target 表示账号是否真实# m :结果类型数量# 总共十条数据# yes7个p = 7/10 = 0.7# no 3个p = 0.3info_D = -(0.7 * np.log2(0.7) + 0.3 * np.log2(0.3))info_D# 0.8812908992306927
每个特征的信息熵
【机器学习 —— DecisionTree决策树】日志密度L
# 日志密度有几个结果: 3个# s :3个p=0.31个yes 2个no# m :4个p=0.43个yes 1个no# l :3个p=0.33个yes 0个noinfoL_D = 0.3 * (-( (1/3)*np.log2(1/3) + (2/3)*np.log2(2/3) ))\+ 0.4 * (-( (3/4)*np.log2(3/4) + (1/4)*np.log2(1/4) ))# + 0.3 * (-( (3/3)*np.log2(3/3) + (0/3)*np.log2(0/3) ))infoL_D# 0.6
而信息增益即为两者的差值:
gain_L = info_D - infoL_Dgain_L# 日志密度的信息增益:0.2812908992306927
好友密度F
# 好友密度有几个结果: 3个# s :4个p=0.41个yes 3个no# m :4个p=0.44个yes 0个no# l :2个p=0.22个yes 0个noinfoF_D = 0.4 * (-( (1/4)*np.log2(1/4) + (3/4)*np.log2(3/4) ))# + 0.4 * (-( (4/4)*np.log2(4/4) + (0/4)*np.log2(0/4) ))# + 0.2 * (-( (2/2)*np.log2(2/2) + (0/2)*np.log2(0/2) ))infoF_D# 0.32451124978365314gain_F = info_D - infoF_Dgain_F# 好友密度的信息增益:0.5567796494470396
是否使用真实头像H
# 是否使用真实头像有几个结果: 2个# yes :5个p=0.54个yes 1个no# no :5个p=0.53个yes 2个noinfoH_D = 0.5 * (-( (4/5)*np.log2(4/5) + (1/5)*np.log2(1/5) ))\+ 0.5 * (-( (3/5)*np.log2(3/5) + (2/5)*np.log2(2/5) ))infoH_D# 0.8464393446710154gain_H = info_D - infoH_Dgain_H# 是否使用真实头像的信息增益:0.034851554559677256# 信息增益:好友密度#会先将 好友密度 这个特征 作为优先分裂的特征# ID3算法的缺点:#1. 如果有类似ID这种不存在重复值的特征列#11个0.11yes 或 1no#21个0.11yes 或 1no#...#91个0.11yes 或 1no#101个0.11yes 或 1no# infoID_D = 0.1 * ( - ( (1/1)*np.log2(1/1) + (0/1)*np.log2(0/1) ) )* 10# infoID_D= 0# ID信息增益:# gainID = info_D - infoID_D#=info_D= 0.88# 会优先按照ID来分裂: 但是像ID这种不重复的特征不应该作为优先分裂的特征
C4.5算法
日志密度L
# 日志密度单独的信息熵# s p=0.3# m p=0.4# l p=0.3info_L = -(0.3*np.log2(0.3) + 0.4*np.log2(0.4) + 0.3*np.log2(0.3))info_L# 1.5709505944546684gain_L / info_L#0.17905776300262236
好友密度F
# 好友密度单独的信息熵# s p=0.4# m p=0.4# l p=0.2info_F = -(0.4*np.log2(0.4) + 0.4*np.log2(0.4) + 0.2*np.log2(0.2))info_F# 1.5219280948873621gain_F / info_F# 0.36583834106055246
是否使用真实头像H
# 是否使用真实头像单独的信息熵# yes p=0.5# no p=0.5info_H = -(0.5*np.log2(0.5) + 0.5*np.log2(0.5))info_H# 1.0gain_H / info_H# 0.034851554559677256
ID
# ID 信息增益:gain_ID = info_Dgain_ID# 0.8812908992306927# ID单独的信息熵# 1 p=0.1# 2 p=0.1# ...# 9 p=0.1# 10 p=0.1info_ID = -(0.1*np.log2(0.1) * 10)info_ID#3.3219280948873626gain_ID / info_ID# 0.2652949955741215# C4.5算法#好友密度 0.36 > ID 0.26 > 日志密度 0.17 > 是否使用真实头像0.03# ID3算法#ID0.88 > 好友密度0.55 >日志密度 0.27 > 是否使用真实头像0.03