美文网首页
香农熵-计算最好的数据集划分方式

香农熵-计算最好的数据集划分方式

作者: ButtersoO | 来源:发表于2018-07-20 18:23 被阅读0次

对于以下数据

data = [
# 不浮出水面是否可以生存, 有脚蹼, 属于鱼类
        1, 1, 'yes',  # 究竟什么鱼满足这个条件我很好奇
        1, 1, 'yes',  # 
        1, 0, 'no',  # 海胆
        0, 1, 'no',  # 鸭子
        0, 1, 'no' ] # 企鹅

计算出 “不浮出水面是否可以生存”与“有脚蹼”这两个特征值,哪个与是否属于鱼类更相关。
以下算法的原理是:拿出指定的特征值,计算剩下的数据的熵,熵越大,也就是数据越混乱,说明被拿出的数据越重要
代码如下

# -*- encoding:utf-8 -*-
import math
import numpy as np
__author__ = 'Butters'


def get_gain(p):
    """
    信息增益值
    """
    return -math.log(p, 2)


def get_ent(*p):
    """
    熵
    """
    return sum([i * get_gain(i) for i in p])


def test():
    data = [
        # 不浮出水面是否可以生存, 有脚蹼, 属于鱼类
        1, 1, 'yes',  # 究竟什么鱼满足这个条件我很好奇
        1, 1, 'yes',  # 
        1, 0, 'no',  # 海胆
        0, 1, 'no',  # 鸭子
        0, 1, 'no' ] # 企鹅
    dataset = np.reshape(data, (5, 3))
    chooseBestFeatureToSplit(dataset)


def calcShannonEnt(dataset):
    print '=====>data set is'
    print dataset
    numEntries = len(dataset)
    labelCounts = {}
    for featVec in dataset:
        feat = featVec[-1]
        if feat not in labelCounts:
            labelCounts[feat] = 0
        labelCounts[feat] += 1
    shannonEnt = get_ent(*[float(labelCounts[key]) / float(numEntries) for key in labelCounts])
    print 'shannon ent is ', shannonEnt
    return shannonEnt


def splitDataset(dataset, axis, value):
    """
    获取dataset里的第axis轴值等于 value的
    :param dataset:
    :param axis:第axis列特征值
    :param value:
    :return:
    """
    m = np.array([row for row in dataset if row[axis] == value])
    return np.delete(m, axis, axis=1)


def chooseBestFeatureToSplit(dataset):
    numFeatures = len(dataset[0]) - 1  # 2
    baseEntries = calcShannonEnt(dataset)
    print 'base entries is', baseEntries
    bestInfoGain = 0.0
    bestFeature = -1
    for i in xrange(numFeatures):
        featList = [example[i] for example in dataset]
        featSet = set(featList)  # 获取取值范围
        print 'feat set is', featSet
        tempEntry = 0.0
        for value in featSet:
            subDataset = splitDataset(dataset, i, value)
            prob = float(len(subDataset)) / float(len(dataset))
            tempEntry += (prob * calcShannonEnt(subDataset))
        infoGain = baseEntries - tempEntry
        print '-----------after calculate ----------'
        print tempEntry
        if infoGain > bestInfoGain:
            bestInfoGain = infoGain
            bestFeature = i
    print 'best feature is', bestFeature
    print 'best info gain is', bestInfoGain


if __name__ == '__main__':
    test()

运行结果:

best feature is 0
best info gain is 0.419973094022

所以第0个特征值是我们要的。
我们可以通过简单的逻辑来验证一下,5个例子中:

  • 满足 “不浮出水面也能生存”的是鱼, “不浮出水面不能生存”的不是鱼条件的有4个。
  • 满足 "有脚蹼"的是鱼, “没脚蹼“的不是鱼条件的有3个。
    所以第0个特征值确实是要重要一些.

以上部分代码来源于《机器学习实战》,略有简化与修改

相关文章

  • 《机器学习入门》笔记 - 决策树

    决策树 计算香农熵 建一组假数据 划分数据集 寻找最好的划分方式 寻找最多数的标签 创建决策树 使用文本注解绘制节...

  • 香农熵-计算最好的数据集划分方式

    对于以下数据 计算出 “不浮出水面是否可以生存”与“有脚蹼”这两个特征值,哪个与是否属于鱼类更相关。以下算法的原理...

  • 机器学习:决策树算法代码详细注释笔记

    计算给定数据集的香农熵 按照给定特征划分数据集 选择数据集最好的分类属性 获取分类集中概率最大的分类 创建决策树递...

  • 4.6 应用实例

    4.6.1 香农熵的计算 在学习决策树时,最重要的步骤是构建决策树。其中,最重要的步骤是根据属性划分数据集,其中先...

  • 决策树(二)

    划分数据集 分类算法除了需要测量信息熵,还需要划分数据集,度量花费数据集的熵,以便判断当前是否正确地划分了数据集。...

  • 决策树算法

    原理 通过选择最好的特征来划分数据集,对数据子集继续划分,直到数据子集中是相同的类别;划分数据集的特征可以通过计算...

  • 决策树

    熵的定义 计算给定数据集的熵 数据集格式 进行测试计算,添加了第三个名为maybe的分类,熵增加。(熵越高,则混合...

  • 香农熵

    香农熵,又称信息熵,熵,可以用来代表某数据集合的不一致性。熵的值越高,则代表数据集的不一致性越高。 熵与概率的关系...

  • python与机器学习(二.决策树与随机森林)

    香农熵 变量的不确定性越大,熵也就越大,把它搞清楚所需要的信息量也就越大。例如,在一个数据集dataset中,da...

  • 信息熵(香农熵)、条件熵、信息增益的简单了解

    信息熵(香农熵) 1948年,香农提出了 “信息熵(entropy)”的概念信息熵是消除不确定性所需信息量的度量,...

网友评论

      本文标题:香农熵-计算最好的数据集划分方式

      本文链接:https://www.haomeiwen.com/subject/mvbqmftx.html