数据集划分——信息熵

  上一节我们学习knn,kNN的最大缺点就是无法给出数据的内在含义,而使用决策树处理分类问题,优势就在于数据形式非常容易理解。

  决策树的算法有很多,有CART、ID3和C4.5等,其中ID3和C4.5都是基于信息熵的,也是我们今天的学习内容。

1. 信息熵

  熵最初被用在热力学方面的,由热力学第二定律,熵是用来对一个系统可以达到的状态数的一个度量,能达到的状态数越多熵越大。香农1948年的一篇论文《A Mathematical Theory of Communication》提出了信息熵的概念,此后信息论也被作为一门单独的学科。

  信息熵是用来衡量一个随机变量出现的期望值,一个变量的信息熵越大,那么他出现的各种情况也就越多。信息熵越小,说明信息量越小。

  对于信息的定义,可以这样理解,如果待分类的事务划分在多个分类之中,则符号xi的信息定义为

    I(xi) = -log2p(xi)   其中p(xi) 是选择该分类的概率

  为了计算熵,我们需要计算所有类别所有可能值包含的信息期望值,通过下面的公式可得:

     ,其中n是分类的数目

2. 计算信息熵

  这里有个小例子,通过2个特征:有无喉结,有无长胡子,来划分男人和女人

  

  使用python实现简单计算信息熵,程序如下:

from math import log

#创建简单数据集
def creatDataset():
    dataSet = [[1,1,‘yes‘],[1,1,‘yes‘],[1,0,‘no‘],[0,1,‘no‘],[0,1,‘no‘]]
    labels = [‘no surfacing‘,‘flippers‘]
    return dataSet,labels

#计算信息熵
def calcShannonEnt(dataSet):
    numEntries = len(dataSet)
    labelCounts = {}
    for vec in dataSet:
        currentLabel = vec[-1]
        if currentLabel not in labelCounts.keys():  #为所有可能的分类建立字典
            labelCounts[currentLabel] = 0
        labelCounts[currentLabel] += 1
    shannonEnt = 0.0
    for key in labelCounts:
        prob = float(labelCounts[key])/numEntries
        shannonEnt -= prob * log(prob,2)
    return shannonEnt 

#简单测试
myDat,labels = creatDataset()
print myDat
print calcShannonEnt(myDat)

  测试结果如下:

[[1, 1, ‘yes‘], [1, 1, ‘yes‘], [1, 0, ‘no‘], [0, 1, ‘no‘], [0, 1, ‘no‘]]
0.970950594455

  得到熵之后,我们就可以按照获取最大信息熵的方法来划分数据集。

数据集划分——信息熵

时间: 2024-10-09 19:48:30

数据集划分——信息熵的相关文章

数据集划分——train set, validate set and test set

先扯点闲篇儿,直取干货者,可以点击这里. 我曾误打误撞的搞过一年多的量化交易,期间尝试过做价格和涨跌的预测,当时全凭一腔热血,拿到行情数据就迫不及待地开始测试各种算法. 最基本的算法是技术指标类型的,原生的技术指标,改版的技术指标,以技术指标为特征构造机器学习算法,都做过.不论哪种方法,都绕不开一件事--如何使用历史数据验证算法的性能. 当时我是纯纯的小白,对数据集划分完全没有概念,一个很自然的想法就是拿全量数据跑回测,看资金曲线的年华收益.最大回撤.sharpe什么的.那时国内很多量化平台正在

sklearn数据集划分

sklearn数据集划分方法有如下方法: KFold,GroupKFold,StratifiedKFold,LeaveOneGroupOut,LeavePGroupsOut,LeaveOneOut,LeavePOut,ShuffleSplit,GroupShuffleSplit,StratifiedShuffleSplit,PredefinedSplit,TimeSeriesSplit, ①数据集划分方法——K折交叉验证:KFold,GroupKFold,StratifiedKFold, 将全部

如何把数据集划分成训练集和测试集

本文内容来自周志阳<机器学习> 问题: 对于一个只包含\(m\)个样例的数据集\(D=\{(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\),如何适当处理,从\(D\)中产生训练集\(S\)和测试集\(T\)? 下面介绍三种常见的做法: 留出法 交叉验证法 自助法 留出法(hold-out) 留出法直接将数据集\(D\)划分为两个互斥的集合,其中一个集合作为训练集\(S\),留下的集合作为测试集\(T\),即\(D=S \cup T, S \cap T=\emptys

留出法、K折交叉验证、留一法进行数据集划分

from sklearn import datasets from sklearn import model_selection #引入sklearn库中手写数字的数据集 digits = datasets.load_digits() #留出法 X_train, X_test, y_train, y_test = model_selection.train_test_split(digits.data, digits.target, test_size = 0.2, shuffle = True

决策树算法(四)——选取最佳特征划分数据集

写在前面的话 咦,好神奇,我今天发现我莫名其妙的成了小三.原来我被卖了还不知道,还帮人家宣传博客和微信公众账号.我放弃了自己规划好的人生,然后决定跟另一个在一起,然后发现原来他有女朋友.我今天有点头大哎. 哈哈哈哈哈.原来被劈腿也会被我遇到呢. 可怜了我这个系列的博客,写的这么好却没有人知道欣赏.就像我这么好,哈哈哈,我好不要脸,却.... 如果您有任何地方看不懂的,那一定是我写的不好,请您告诉我,我会争取写的更加简单易懂! 如果您有任何地方看着不爽,请您尽情的喷,使劲的喷,不要命的喷,您的槽点

第五节 算法的分类介绍和数据集的划分

""" 机器学习算法分类: 监督学习(有目标值) 分类(目标值是离散型数据):K-近邻算法.贝叶斯分类.决策树与随机森林.逻辑回归.神经网络 回归(目标值是连续型数据):线性回归.岭回归 无监督学习(无目标值):聚类 K-means 机器学习一般会把数据集划分为训练集(3/4)和测试集(1/4),可以使用sklearn中的train_test_split模块进行自动分类 """ # 使用sklearn自带的鸢尾花数据集进行数据划分 from sk

sklearn训练感知器用iris数据集

简化版代码 1 from sklearn import datasets 2 import numpy as np 3 4 #获取data和类标 5 iris = datasets.load_iris() 6 X = iris.data[:,[2,3]] 7 y = iris.target 8 9 #测试样本和训练样本三七分 10 from sklearn.model_selection import train_test_split 11 X_train,X_test,y_train,y_te

机器学习之sklearn数据集

数据集划分 机器学习一般的数据集会划分为两个部分: 训练数据:用于训练,构建模型 测试数据:在模型检验时使用,用于评估模型是否有效 sklearn数据集划分API sklearn.model_selection.train_test_split x 数据集的特征值 y 数据集的标签值 test_size 测试集的大小,一般为float random_state 随机数种子,不同的种子会造成不同的随机采样结果.相同的种子采样结果相同. return 训练集特征值,测试集特征值,训练标签,测试标签(

VOC数据集 目标检测

最近在做与目标检测模型相关的工作,很多都要求VOC格式的数据集. PASCAL VOC挑战赛 (The PASCAL Visual Object Classes )是一个世界级的计算机视觉挑战赛, PASCAL全称:Pattern Analysis, Statical Modeling and Computational Learning,是一个由欧盟资助的网络组织.很多模型都基于此数据集推出.比如目标检测领域的yolo,ssd等等. voc数据集结构 看下目录结构 :~/git_project