决策树算法——熵与信息增益(Python3实现)

时间:2024-03-19 12:36:30

1、熵、条件熵与信息增益

(1)熵(entropy)

决策树算法——熵与信息增益(Python3实现)

 

(2)条件熵(conditional entropy)

 

决策树算法——熵与信息增益(Python3实现)

 

(3)信息增益(information gain)

决策树算法——熵与信息增益(Python3实现)

 

2、信息增益算法实现流程

决策树算法——熵与信息增益(Python3实现)

决策树算法——熵与信息增益(Python3实现)

 

2、数据集以及每个特征信息增益的计算

2.1贷款申请样本数据表

                                                                    表5.1 贷款申请样本数据表

1

青年

一般

2

青年

3

青年

4

青年

一般

5

青年

一般

6

中年

一般

7

中年

8

中年

9

中年

非常好

10

中年

非常好

11

老年

非常好

12

老年

13

老年

14

老年

非常好

15

老年

一般

 

2.2根据信息增益准则选择最优特征

决策树算法——熵与信息增益(Python3实现)

决策树算法——熵与信息增益(Python3实现)

决策树算法——熵与信息增益(Python3实现)

3、Python3实现熵与信息增益选择最优特征

  在编写代码之前,我们先对数据集进行属性标注。

  • 年龄:0代表青年,1代表中年,2代表老年;
  • 有工作:0代表否,1代表是;
  • 有自己的房子:0代表否,1代表是;
  • 信贷情况:0代表一般,1代表好,2代表非常好;
  • 类别(是否给贷款):no代表否,yes代表是。

代码实现如下:

 
  1. # -*- coding: UTF-8 -*-

  2. from math import log

  3.  
  4.  
  5. """

  6. 函数说明:创建测试数据集

  7. """

  8. def createDataSet():

  9. dataSet = [[0, 0, 0, 0, 'no'], #数据集

  10. [0, 0, 0, 1, 'no'],

  11. [0, 1, 0, 1, 'yes'],

  12. [0, 1, 1, 0, 'yes'],

  13. [0, 0, 0, 0, 'no'],

  14. [1, 0, 0, 0, 'no'],

  15. [1, 0, 0, 1, 'no'],

  16. [1, 1, 1, 1, 'yes'],

  17. [1, 0, 1, 2, 'yes'],

  18. [1, 0, 1, 2, 'yes'],

  19. [2, 0, 1, 2, 'yes'],

  20. [2, 0, 1, 1, 'yes'],

  21. [2, 1, 0, 1, 'yes'],

  22. [2, 1, 0, 2, 'yes'],

  23. [2, 0, 0, 0, 'no']]

  24. labels = ['年龄', '有工作', '有自己的房子', '信贷情况'] #分类属性

  25. return dataSet, labels #返回数据集和分类属性

  26.  
  27.  
  28. """

  29. 函数说明:计算给定数据集的经验熵(香农熵)

  30. Parameters:

  31. dataSet - 数据集

  32. Returns:

  33. shannonEnt - 经验熵(香农熵)

  34. """

  35. def calcShannonEnt(dataSet):

  36. numEntires = len(dataSet) #返回数据集的行数

  37. labelCounts = {} #保存每个标签(Label)出现次数的字典

  38. for featVec in dataSet: #对每组特征向量进行统计

  39. currentLabel = featVec[-1] #提取标签(Label)信息

  40. if currentLabel not in labelCounts.keys(): #如果标签(Label)没有放入统计次数的字典,添加进去

  41. labelCounts[currentLabel] = 0

  42. labelCounts[currentLabel] += 1 #Label计数

  43. shannonEnt = 0.0 #经验熵(香农熵)

  44. for key in labelCounts: #计算香农熵

  45. prob = float(labelCounts[key]) / numEntires #选择该标签(Label)的概率

  46. shannonEnt -= prob * log(prob, 2) #利用公式计算

  47. return shannonEnt #返回经验熵(香农熵)

  48.  
  49.  
  50. """

  51. 函数说明:按照给定特征划分数据集

  52.  
  53. Parameters:

  54. dataSet - 待划分的数据集

  55. axis - 划分数据集的特征

  56. value - 需要返回的特征的值

  57. """

  58. def splitDataSet(dataSet, axis, value):

  59. retDataSet = [] #创建返回的数据集列表

  60. for featVec in dataSet: #遍历数据集

  61. if featVec[axis] == value:

  62. reducedFeatVec = featVec[:axis] #去掉axis特征

  63. reducedFeatVec.extend(featVec[axis+1:]) #将符合条件的添加到返回的数据集

  64. retDataSet.append(reducedFeatVec)

  65. return retDataSet #返回划分后的数据集

  66.  
  67.  
  68. """

  69. 函数说明:选择最优特征

  70. Parameters:

  71. dataSet - 数据集

  72. Returns:

  73. bestFeature - 信息增益最大的(最优)特征的索引值

  74. """

  75. def chooseBestFeatureToSplit(dataSet):

  76. numFeatures = len(dataSet[0]) - 1 #特征数量

  77. baseEntropy = calcShannonEnt(dataSet) #计算数据集的香农熵

  78. bestInfoGain = 0.0 #信息增益

  79. bestFeature = -1 #最优特征的索引值

  80. for i in range(numFeatures): #遍历所有特征

  81. #获取dataSet的第i个所有特征

  82. featList = [example[i] for example in dataSet]

  83. uniqueVals = set(featList) #创建set集合{},元素不可重复

  84. newEntropy = 0.0 #经验条件熵

  85. for value in uniqueVals: #计算信息增益

  86. subDataSet = splitDataSet(dataSet, i, value) #subDataSet划分后的子集

  87. prob = len(subDataSet) / float(len(dataSet)) #计算子集的概率

  88. newEntropy += prob * calcShannonEnt(subDataSet) #根据公式计算经验条件熵

  89. infoGain = baseEntropy - newEntropy #信息增益

  90. print("第%d个特征的增益为%.3f" % (i, infoGain)) #打印每个特征的信息增益

  91. if (infoGain > bestInfoGain): #计算信息增益

  92. bestInfoGain = infoGain #更新信息增益,找到最大的信息增益

  93. bestFeature = i #记录信息增益最大的特征的索引值

  94. return bestFeature #返回信息增益最大的特征的索引值

  95.  
  96.  
  97. if __name__ == '__main__':

  98. dataSet, features = createDataSet()

  99. entropy=calcShannonEnt(dataSet)

  100. bestfeature=chooseBestFeatureToSplit(dataSet)

  101. print("训练集的熵为:%f"%(entropy))

  102. print("最优特征索引值:" + str(bestfeature))

输出结果为:

 

决策树算法——熵与信息增益(Python3实现)

 

补充:

信息增益比(增益率)

决策树算法——熵与信息增益(Python3实现)

 

基尼指数

决策树算法——熵与信息增益(Python3实现)

决策树算法——熵与信息增益(Python3实现)