• AI4 决策树的生成与训练-信息增益


    1. # -*- coding: UTF-8 -*-
    2. from math import log
    3. import pandas as pd
    4. dataSet = pd.read_csv('dataSet.csv', header=None).values.tolist()
    5. # 给定一个数据集,calcInfoEnt可以用于计算一个数据集的信息熵,可直接调用
    6. # 也可不使用,通过自己的方式计算信息增益
    7. def calcInfoEnt(data):
    8. numEntres = len(data)
    9. labelcnt = {} # 用于统计正负样本的个数
    10. for item in data:
    11. if item[-1] not in labelcnt:
    12. labelcnt[item[-1]] = 0
    13. labelcnt[item[-1]] += 1
    14. infoEnt = 0.0
    15. for item in labelcnt: # 根据信息熵的公式计算信息熵
    16. curr_info_entr = float(labelcnt[item]) / numEntres
    17. infoEnt = infoEnt - curr_info_entr * log(curr_info_entr, 2)
    18. return infoEnt
    19. # 返回值 infoEnt 为数据集的信息熵
    20. # 给定一个数据集,用于切分一个子集,可直接用于计算某一特征的信息增益
    21. # 也可不使用,通过自己的方式计算信息增益
    22. # dataSet是要划分的数据集,i 代表第i个特征的索引index
    23. # value对应该特征的某一取值
    24. def create_sub_dataset(dataSet, i, value):
    25. res = []
    26. for item in dataSet:
    27. if item[i] == value:
    28. curr_data = item[:i] + item[i + 1:]
    29. res.append(curr_data)
    30. return res
    31. def calc_max_info_gain(dataSet): # 计算所有特征的最大信息增益,dataSet为给定的数据集
    32. n = len(dataSet[0]) - 1 # n 是特征的数量,-1 的原因是最后一列是分类标签
    33. total_entropy = calcInfoEnt(dataSet) # 整体数据集的信息熵
    34. max_info_gain = [0, 0] # 返回值初始化
    35. # code start here
    36. best_feature=-1
    37. for i in range(n):
    38. featList=[example[i] for example in dataSet]
    39. uniqueVals=set(featList)
    40. newEntropy=0.0
    41. for value in uniqueVals:
    42. subDataSet=create_sub_dataset(dataSet,i,value)
    43. prob=len(subDataSet)/float(len(dataSet))
    44. newEntropy+=prob*calcInfoEnt(subDataSet)
    45. infoGain=total_entropy-newEntropy
    46. if(infoGain>max_info_gain[1]):
    47. max_info_gain[1]=infoGain
    48. max_info_gain[0]=i
    49. best_feature=1
    50. # code end here
    51. return max_info_gain
    52. if __name__ == '__main__':
    53. info_res = calc_max_info_gain(dataSet)
    54. print("信息增益最大的特征索引为:{0},对应的信息增益为{1}".format(info_res[0], info_res[1]))

  • 相关阅读:
    算法04 模拟算法之一维数组相关内容详解【C++实现】
    vuex详解
    算法笔记:0-1背包问题
    李迟2022年11月工作生活总结
    申请外观设计专利多少钱?
    一篇博客搞定移动端布局
    天地无用 - 修改朋友圈的定位: 高德地图 + 爱思助手
    十一、统一网关GateWay(搭建网关、过滤器、跨越解决)
    Redis 有序集合操作实战(全)
    Python爬虫
  • 原文地址:https://blog.csdn.net/kling_bling/article/details/126365047