当前位置:   article > 正文

【机器学习】【决策树】C4.5算法,详解+python代码实现_机器学习c4.5代码

机器学习c4.5代码

ID3算法只有树的生成,所以该算法生成的树容易产生过拟合,C4.5在生成的过程,用信息增益比来选择特征。

ID3算法以信息增益作为划分训练数据集的特征,存在缺点:偏向于选择特征值较多的特征。

C4.5算法使用信息增益比(information gain ratio),可以对ID3算法这一缺点进行校正

注意:先计算数据集所有特征的信息增益比的平均值,然后找到信息增益比大于平均值的特征,然后从这些特征中找最大信息增益比的特征作为子树的根节点,否则结束子树的生成。

1.使用的样本集

  1. '''''
  2. 提供训练样本集
  3. 每个example由多个特征值+1个分类标签值组成
  4. 比如第一个example=['youth', 'no', 'no', '1', 'refuse'],此样本的含义可以解读为:
  5. 如果一个人的条件是:youth age,no working, no house, 信誉值credit为1
  6. 那么此类人会被分类到refuse一类中,即在相亲中被拒绝
  7. 每个example的特征值类型为:
  8. ['age', 'working', 'house', 'credit']
  9. 每个example的分类标签class_label取值范围为:'refuse'或者'agree'
  10. '''
  11. data_list = [['youth', 'no', 'no', '1', 'refuse'],
  12. ['youth', 'no', 'no', '2', 'refuse'],
  13. ['youth', 'yes', 'no', '2', 'agree'],
  14. ['youth', 'yes', 'yes', '1', 'agree'],
  15. ['youth', 'no', 'no', '1', 'refuse'],
  16. ['mid', 'no', 'no', '1', 'refuse'],
  17. ['mid', 'no', 'no', '2', 'refuse'],
  18. ['mid', 'yes', 'yes', '2', 'agree'],
  19. ['mid', 'no', 'yes', '3', 'agree'],
  20. ['mid', 'no', 'yes', '3', 'agree'],
  21. ['elder', 'no', 'yes', '3', 'agree'],
  22. ['elder', 'no', 'yes', '2', 'agree'],
  23. ['elder', 'yes', 'no', '2', 'agree'],
  24. ['elder', 'yes', 'no', '3', 'agree'],
  25. ['elder', 'no', 'no', '1', 'refuse']]
  26. feat_list = ['age', 'working', 'house', 'credit']

2. 运行得到的样本集的决策树

每个特征值的字典中有一个gain_ratio关键字和对应value,使用gain_ratio选择子树的根节点。

下面是样本集的统计信息字典,为中间结果不作为绘制决策树使用,为生成决策树树字典而生:

=============== samples statistic dict ===================
len( samples statistic dict ): 6
type( samples statistic dict ): <class 'dict'>
np.shape( samples statistic dict ): ()
len(dict_shape): 0
samples statistic dict = {
         samples_ent :  0.9709505944546686
         samples_cnt :  15
         credit :{
                 cond_ent :  0.6079610319175832
                 2 :{
                         agree : {'p_self': 0.6666666666666666, 'cnt': 4}
                         ent :  0.9182958340544896
                         p_self :  0.4
                         cnt :  6
                         refuse : {'p_self': 0.3333333333333333, 'cnt': 2}
                         }
                 info_gain :  0.36298956253708536
                 gain_ratio :  0.2318538812872422
                 3 :{
                         agree : {'p_self': 1.0, 'cnt': 4}
                         ent :  0.0
                         p_self :  0.26666666666666666
                         cnt :  4
                         refuse : {'p_self': 0.0, 'cnt': 0}
                         }
                 1 :{
                         agree : {'p_self': 0.2, 'cnt': 1}
                         ent :  0.7219280948873623
                         p_self :  0.3333333333333333
                         cnt :  5
                         refuse : {'p_self': 0.8, 'cnt': 4}
                         }
                 }
         house :{
                 no :{
                         agree : {'p_self': 0.3333333333333333, 'cnt': 3}
                         ent :  0.9182958340544896
                         p_self :  0.6
                         cnt :  9
                         refuse : {'p_self': 0.6666666666666666, 'cnt': 6}
                         }
                 cond_ent :  0.5509775004326937
                 info_gain :  0.4199730940219749
                 yes :{
                         agree : {'p_self': 1.0, 'cnt': 6}
                         ent :  0.0
                         p_self :  0.4
                         cnt :  6
                         refuse : {'p_self': 0.0, 'cnt': 0}
                         }
                 gain_ratio :  0.4325380677663126
                 }
         working :{
                 no :{
                         agree : {'p_self': 0.4, 'cnt': 4}
                         ent :  0.9709505944546686
                         p_self :  0.6666666666666666
                         cnt :  10
                         refuse : {'p_self': 0.6, 'cnt': 6}
                         }
                 cond_ent :  0.6473003963031123
                 info_gain :  0.32365019815155627
                 yes :{
                         agree : {'p_self': 1.0, 'cnt': 5}
                         ent :  0.0
                         p_self :  0.3333333333333333
                         cnt :  5
                         refuse : {'p_self': 0.0, 'cnt': 0}
                         }
                 gain_ratio :  0.3524465495205019
                 }
         age :{
                 youth :{
                         agree : {'p_self': 0.4, 'cnt': 2}
                         ent :  0.9709505944546686
                         p_self :  0.3333333333333333
                         cnt :  5
                         refuse : {'p_self': 0.6, 'cnt': 3}
                         }
                 cond_ent :  0.8879430945988998
                 elder :{
                         agree : {'p_self': 0.8, 'cnt': 4}
                         ent :  0.7219280948873623
                         p_self :  0.3333333333333333
                         cnt :  5
                         refuse : {'p_self': 0.2, 'cnt': 1}
                         }
                 info_gain :  0.08300749985576883
                 gain_ratio :  0.05237190142858302
                 mid :{
                         agree : {'p_self': 0.6, 'cnt': 3}
                         ent :  0.9709505944546686
                         p_self :  0.3333333333333333
                         cnt :  5
                         refuse : {'p_self': 0.4, 'cnt': 2}
                         }
                 }
         }
======

生成的决策树字典:

=============== samples decision-tree dict ===================
len( samples decision-tree dict ): 1
type( samples decision-tree dict ): <class 'dict'>
np.shape( samples decision-tree dict ): ()
len(dict_shape): 0
samples decision-tree dict = {
         house :{
                 no :{
                         working : {None: 'refuse', 'yes': 'agree'}
                         }
                 yes :  agree
                 }
         }

======

根据决策树字典绘制的决策树:


3.代码

  1. # -*- coding: utf-8 -*-
  2. """
  3. @author: 蔚蓝的天空Tom
  4. Talk is cheap,show me the code
  5. Aim:C4.5算法生成决策树(字典存储), 并绘制决策树图形
  6. """
  7. import numpy as np
  8. import math
  9. import matplotlib.pyplot as plt
  10. varnamestr = lambda v,nms: [ vn for vn in nms if id(v)==id(nms[vn])][0]
  11. class CUtileTool(object):
  12. '''提供有用的方法 比如dump_list方法&#x
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/719984
推荐阅读
相关标签
  

闽ICP备14008679号