《李宏毅机器学习》task7

一、信息论基础

熵是用来衡量一个系统混论程度的物理量,代表一个系统中蕴含多少信息量,信息量越大表明一个系统不确定性就越大,就存在越多的可能性。

  • 信息熵便是信息的期望值,可以记作:
    在这里插入图片描述
  • 条件熵
    在这里插入图片描述
  • 信息增益
    在这里插入图片描述
  • 信息增益率
    在这里插入图片描述
  • 基尼指数
    -

二、决策树的不同分类算法

算法 支持模型 树结构 特征选择 连续值处理 缺失值处理 剪枝
ID3 分类 多叉树 信息增益 不支持 不支持 不支持
C4.5 分类 多叉树 信息增益比 支持 支持 支持
CART 分类/回归 二叉树 基尼系数,均方差 支持 支持 支持
  • ID3
    由于期望信息越小,信息增益越大,从而纯度越高,因此ID3算法的核心思想就是以信息增益度量属性选择,选择分裂后信息增益最大的属性进行分裂。
  • C4.5
    ID3算法存在一个问题,就是偏向于多值属性,例如,如果存在唯一标识属性ID,则ID3会选择它作为分裂属性,这样虽然使得划分充分纯净,但这种划分对分类几乎毫无用处。ID3的后继算法C4.5使用增益率(gain ratio)的信息增益扩充,试图克服这个偏倚。
  • CART
    ID3中根据属性值分割数据,之后该特征不会再起作用,这种快速切割的方式会影响算法的准确率。CART是一棵二叉树,采用二元切分法,每次把数据切成两份,分别进入左子树、右子树。而且每个非叶子节点都有两个孩子,所以CART的叶子节点比非叶子多1。相比ID3和C4.5,CART应用要多一些,既可以用于分类也可以用于回归。CART分类时,使用基尼指数(Gini)来选择最好的数据分割的特征,gini描述的是纯度,与信息熵的含义相似。CART中每一次迭代都会降低GINI系数。

三、计算信息熵

import numpy as np
import pandas as pd

def cancShannonEnt(dataSet):
  '''
  :param dataSet: dataSet
  :return: shannonEnt
  '''
  # 计算公式前,注意数据的格式(array)
  numEntries = len(dataSet)   # 获取数据的行数
  labelCounts = { }    # 设置字典数据格式,想要存储的数据格式为:类别:频数
  for featVec in dataSet:   # 获取数据集每一行的数据
      currentLabel = featVec[-1]   # 获取特征向量的最后一列
      # 检查字典中key是否存在
      # 如果key不存在
      if currentLabel not in labelCounts.keys():
          # 将当前的标签存于字典中,并将频数置为0
          labelCounts[currentLabel] = 0
      # 如果key存在,在当前的键值上+1
      labelCounts[currentLabel] +=1

  # 数据已准备好,计算熵
  shannonEnt = 0.0          # 初始化信息熵
  for key in labelCounts:   # 遍历出数据中所的类别
      pro = float(labelCounts[key]) /numEntries
      shannonEnt -= pro * np.log2(pro)  # 计算信息熵
  return shannonEnt                       # 返回信息熵

dataSet = pd.read_csv('watermelon_3a.csv')
dataSet = np.array(dataSet.values)
shannon = cancShannonEnt(dataSet)
print(shannon)

结果:
在这里插入图片描述

版权声明:本文为devcy原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/devcy/article/details/90952536