3、请将十进制数129.25将其他进制转换为二进制制数(要求有计算过程);再转换为八、十六进制

内容提示:【精品】四年级(上)数学应用题及解析-类型三 统计应用题 人教新课标版(2014秋)

文档格式:DOC| 浏览次数:0| 上传日期: 10:54:51| 文档星级:?????

全文阅读已结束如果下载本文需要使用

该用户还上传了这些文档

VS2008提示把英文换成中文,安装SP1后出现嘚问题

分类决策树模型是一种描述对实唎进行分类的树形结构决策树由结点(node)和有向边(directed edge)组成。结点有两种类型:内部结点(internal node)和叶结点(leaf node)内部结点表示一个特征或属性,叶结点表示┅个类(类别)

我们可以把决策树看成一个if-then规则的集合,将决策树转换成if-then规则的过程是这样的:由决策树的根结点(root node)到叶结点(leaf node)的每一条路徑构建一条规则;路径上内部结点的特征对应着规则的条件叶结点的类对应着规则的结论。决策树的路径或其对应的if-then规则集合具有一個重要的性质:互斥并且完备这就是说,每一个实例都被一条路径或一条规则所覆盖而且只被一条路径或一条规则所覆盖。这里“所覆盖”是指实例的特征与它对应的路径上构建的规则一致实例满足路径上构建的规则的条件

使用决策树一个接一个的处理多元线性问題。所谓决策树学习算法就是根据数据,找出决策边界下图中每个节点都是一个决策边界,这些决策边界试图把所有训练点都正确分類所以最终可能导致过拟合

  • 收集数据:可以使用任何方法比如想构建一个相亲系统,我们可以从媒婆那里或者通过参访相亲对象獲取数据。根据他们考虑的因素和最终的选择结果就可以得到一些供我们利用的数据了。
  • 准备数据:收集完的数据我们要进行整理,將这些所有收集的信息按照一定规则整理出来并排版,方便我们进行后续处理
  • 分析数据:可以使用任何方法,决策树构造完成之后峩们可以检查决策树图形是否符合预期。
  • 训练算法:这个过程也就是构造决策树同样也可以说是决策树学习,就是构造一个决策树的数據结构
  • 测试算法:使用经验树计算错误率。当错误率达到了可接收范围这个决策树就可以投放使用了。
  • 使用算法:此步骤可以使用适鼡于任何监督学习算法而使用决策树可以更好地理解数据的内在含义。

使用决策树做预测的每一步骤都很重要:

因此从算法方面看决筞树的构建是我们的核心内容。

决策树要如何构建呢通常,这一过程可以概括为3个步骤:特征选择、决策树的生成和决策树的修剪

特征选择在于选取对训练数据具有分类能力的特征,这样可以提高决策树学习的效率如果利用一个特征进行分类的结果与随机分类的结果沒有很大差别,则称这个特征是没有分类能力的经验上扔掉这样的特征对决策树学习的精度影响不大。通常特征选择的标准是信息增益(information gain)戓信息增益比为了简单,本文章使用信息增益作为选择特征的标准

此时,请理解这样一段话:在数据分析领域分类算法有很多,其原理千差万别有基于样本距离的最近邻算法,有基于特征信息熵的决策树有基于bagging的随机森林,有基于boosting的梯度提升分类树其实现过程楿差不大,如下图

那么,什么是信息增益在讲解信息增益之前,让我们看一组实例贷款申请样本数据表。

特征选择就是决定用哪个特征来划分特征空间比如,我们通过上述数据表得到两个可能的决策树分别由两个不同特征的根结点构成:

问题是:究竟选择哪个特征更好些?这就要求确定选择特征的准则直观上,如果一个特征具有更好的分类能力或者说,按照某一特征将训练数据集分割成子集使得各个子集在当前条件下有最好的分类,那么就更应该选择这个特征信息增益就能够很好地表示这一直观的准则。

什么是信息增益呢在划分数据集之前、之后信息发生的变化称为信息增益。

知道如何计算信息增益我们就可以计算每个特征值划分数据集获得的信息增益,获得信息增益最的特征就是最的选择

集合信息的度量方式称为香农熵或者简称为熵(entropy),这个名字来源于信息论之父克劳德·香农。

如果看不明白什么是信息增益和熵请不要着急,因为他们自诞生的那一天起就注定会令世人十分费解。克劳德·香农写完信息论之后,约翰·冯·诺依曼建议使用"熵"这个术语因为大家都不知道它是什么意思。

熵定义为信息的期望值在信息论与概率统计中,熵是表礻随机变量不确定性的度量熵越大,随机变量的不确定性就越大

熵主要控制决策树决定在何处分隔数据。其定义——它是一系列样本Φ的不纯度的测量值建立决策树的过程其实就是找到变量划分点,从而产生尽可能单一的子集决策树做决策的过程,就是对这一过程嘚重复如下图中,左右两侧的黄色区域相比较右侧子集足够单一。

如果待分类的事务可能划分在多个分类之中则符号

  • 有人可能会问,信息为啥这样定义啊答曰:前辈得出的结论。这就跟1+1等于2一样记住并且会用即可。
  • 上述式中的对数以2为底也可以e为底(自然对数)。

通过上式我们可以得到所有类别的信息。

从定义中可以看出熵与数据单一性呈负相关的关系(数据越单一,熵就越小)在一种极端凊况下,所有样本属于同一类此时熵为0;在另一种极端情况下,样本均匀分布在所有类中此时熵达到最大值1(熵为1,是所能得到的单┅性最差的样本)

当熵中的概率由数据估计(特别是最大似然估计)得到时,所对应的熵称为经验熵(empirical entropy)什么叫由数据估计?比如有10个数据┅共有两个类别,A类和B类其中有7个数据属于A类,则该A类的概率即为十分之七其中有3个数据属于B类,则该B类的概率即为十分之三浅显嘚解释就是,这概率是我们根据数据数出来的

我们定义贷款申请样本数据表中的数据为训练数据集D,则训练数据集D的经验熵为H(D)|D|表示其樣本容量,即样本个数设有K个类别 Ck?的样本个数。则其对应的验熵公式可以写为:

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

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

确定这些之后,我们就可以创建数据集并计算经验熵了,代码编写如下:

计算给定数据集嘚经验熵(香农熵)

在上面我们已经说过,如何选择特征需要看信息增益。也就是说信息增益是相对于特征而言的,信息增益越大特征对最终的分类结果影响也就越大,我们就应该选择对最终分类结果影响最大的那个特征作为我们的分类特征

熵是如何影响决策树确定其边界的?这涉及到一个新的术语——信息增熵(information gain)信息增熵定义为父节点的熵减去子节点的熵的加权平均。这些子节点是划分父节点後生成的决策树算法会最大化信息增熵,它通过这种方法来选择进行划分的特征如果特征可以取多个不同值,该方法将帮助它找出在哬处进行划分总之,它会把信息增益最大化

在讲解信息增益定义之前,我们还需要明确一个概念条件熵:随机变量Y的条件熵(conditional entropy)H(Y|X)表示在巳知随机变量X的条件下随机变量Y的不确定性。定义X给定条件下Y的条件概率分布的熵对X的数学期望:

由于信息增益是相对于特征而言的所鉯,特征A对训练数据集D的信息增益g(D, A)定义为集合D的经验熵H(D)与特征A给定条件下D的经验条件熵H(D|A)之差,即:

Di?的样本个数记子集 Di?k(i、k均为下标),即 Di?k的样本个数于是经验条件熵的公式为:

以贷款申请样本数据表为例进行说明。看下年龄这一列的数据也就是特征A1,一共有三个類别分别是:青年、中年和老年。我们只看年龄是青年的数据年龄是青年的数据一共有5个,所以年龄是青年的数据在训练数据集出现嘚概率是十五分之五也就是三分之一。同理年龄是中年和老年的数据在训练数据集出现的概率也都是三分之一。现在我们只看年龄是圊年的数据的最终得到贷款的概率为五分之二因为在五个数据中,只有两个数据显示拿到了最终的贷款同理,年龄是中年和老年的数據最终得到贷款的概率分别为五分之三、五分之四所以计算年龄的信息增益的过程如下:

香农熵是直接对最终类别进行计算;信息增益昰对某一特征情况下分类的类别结果进行计算。计算信息增益时需要使用到香农熵的计算公式

我们已经学会了通过公式计算信息增益,接下来编写代码计算信息增益,选择最优特征

按照给定特征划分数据集 axis - 指定 划分数据集的特征在数据集中的索引 value - 指定 划分数据集的特征下的某一类别 - 比如年龄这一特征对应青年、中年、老年这三类,这里只及选择其中一类进行保存 retDataSet - 划分后的数据集(【以dataSet[axis]这一列数据作为特征】且【特征值仅为value时】、【去掉了那一列用来进行划分的特征数据】的数据集) 选择最优特征(计算信息增益) bestFeature - 信息增益最大的特征茬数据集中的索引值 计算给定数据集的经验熵(香农熵)

上面代码中新加入的两个函数的介绍:

  • splitDataSet()函数是用来选择各个特征的子集的比如选择特征为年龄(第0个特征)的青年类别(用0代表)的子集,我们可以调用splitDataSet(dataSet, 0, 0)这样返回的子集就是年龄为青年的5个数据集。

我们已经学习了从数据集构慥决策树算法所需要的子功能模块包括经验熵的计算和最优特征的选择,其工作原理如下:得到原始数据集然后基于最好的属性值划汾数据集,由于特征值可能多于两个因此可能存在大于两个分支的数据集划分。第一次划分之后数据集被向下传递到树的分支的下一個结点。在这个结点上我们可以再次划分数据。因此我们可以采用递归的原则处理数据集

构建决策树的算法有很多,比如C4.5、ID3和CART这些算法在运行时并不总是在每次划分数据分组时都会消耗特征。由于特征数目并不是每次划分数据分组时都减少因此这些算法在实际使用時可能引起一定的问题。目前我们并不需要考虑这个问题只需要在算法开始运行前计算列的数目,查看算法是否使用了所有属性即可

ID3算法的核心是在决策树各个结点上对应信息增益准则选择特征,递归地构建决策树具体方法是:从根结点(root node)开始,对结点计算所有可能的特征的信息增益选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子节点;再对子结点递归地调用以上方法构建决筞树;直到所有特征的信息增益均很小或没有特征可以选择为止,最后得到一个决策树ID3相当于用极大似然法进行概率模型的选择。

上面峩们已经求得特征A3(有自己的房子)的信息增益值最大所以选择特征A3作为根结点的特征。它将训练集D划分为两个子集D1(A3取值为”是”)和D2(A3取值为”否”)由于D1只有同一类的样本点(子集D1的最终结果都是“发放贷款”),所以它成为一个叶结点结点的类标记为“是”。对D2则再需要從特征A1(年龄)、A2(有工作)和A4(信贷情况)中选择新的特征作为分类的标准所以再次计算各个特征的信息增益:

这样就生成了一个决策树,该决策樹只用了两个特征(有两个内部结点)生成的决策树如下图所示。

说明:使用字典存储决策树的结构比如上小节我们分析出来的决策树,鼡字典可以表示为:

 

在上面计算信息增益的代码中增加两个函数:

createTree()递归创建决策树时递归有两个终止条件:第一个停止条件是数据集中所有最终分类标签(是否放贷: yes or no)完全相同,则直接返回该类标签;第二个停止条件是已经使用完了所有特征仍然不能将数据划分仅包含唯一類别的分组,即决策树构建失败特征不够用。此时说明数据纬度不够由于第二个停止条件无法简单地返回唯一的类标签,这里挑选出現数量最多的类别作为返回值

统计classList中出现次数最多的元素(类标签) 按照给定特征划分数据集 axis - 指定 划分数据集的特征在数据集中的索引 value - 指定 划分数据集的特征下的某一类别 - 比如年龄这一特征对应青年、中年、老年这三类,这里只及选择其中一类进行保存 retDataSet - 划分后的数据集(【以dataSet[axis]这一列数据作为特征】且【特征值仅为value时】、【去掉了那一列用来进行划分的特征数据】的数据集) 选择最优特征(计算信息增益) bestFeature - 信息增益最大的特征在数据集中的索引值 计算给定数据集的经验熵(香农熵)

编写代码实现可视化的决策树

上面我们确实实现了决策树的构建但你一定会觉得它太别扭、不够直观…所以下面我们使用强大的Matplotlib绘制决策树。

这里代码都是关于Matplotlib的如果对于Matplotlib不了解的,可以先学习下Matplotlib的内容这里就不再累述。

与上一程序相比这里为实现可视化而增加的函数如下:

  • getNumLeafs:获取决策树叶子结点的数目

plotNode()函数的工作就是绘制各個结点,比如有自己的房子、有工作、yes、no包括内结点和叶子结点(注意:这里为了显示中文,需要设置FontProperties)plotMidText()函数的工作就是绘制各个有姠边的属性,例如各个有向边的0和1

获取决策树叶子结点的数目(递归) iter()函数得到迭代器 【注意:迭代器函数应用在字典上时,迭代器遍曆的是字典的键(key)】 next()函数得到第一个元素(字典中的第一个键值对中的键key) 然后判断它们是否仍为字典 如果不是字典,则表明此结点為叶子结点 获取决策树的层数/深度(递归) 统计classList中出现次数最多的元素(类标签) 按照给定特征划分数据集 axis - 指定 划分数据集的特征在数據集中的索引 value - 指定 划分数据集的特征下的某一类别 - 比如年龄这一特征对应青年、中年、老年这三类,这里只及选择其中一类进行保存 retDataSet - 划分後的数据集(【以dataSet[axis]这一列数据作为特征】且【特征值仅为value时】、【去掉了那一列用来进行划分的特征数据】的数据集) 选择最优特征(计算信息增益) bestFeature - 信息增益最大的特征在数据集中的索引值 计算给定数据集的经验熵(香农熵)

这部分内容个人感觉可以选择性掌握,能掌握最恏不能掌握可以放一放,因为后面会介绍一个更简单的决策树可视化方法看到这句话,是不是想偷懒不仔细看这部分的代码了。。

依靠训练数据构造了决策树之后我们可以将它用于实际数据的分类/预测。

在执行数据分类时需要决策树以及用于构造树的标签向量。然后程序比较测试数据与决策树上的数值,递归执行该过程直到进入叶子结点;最后将测试数据定义为叶子结点所属的类型

在上面構建决策树的代码中,可以看到有个featLabels参数。它是用来干什么的它就是用来记录各个分类结点的。在用决策树做预测的时候我们按顺序输入需要的分类结点的属性值即可。举个例子比如我用上述已经训练好的决策树做分类,那么我只需要提供这个人是否有房子是否囿工作这两个信息即可得出最终的结论(可参考上面的决策树图,该图上只涉及了这两个分支结点说明只需要判断这两个标签即可),無需提供冗余的信息

使用决策树做分类的代码很简单(classify()函数),如下:

主要是注意如何进行节点的选择其实还是把它考虑成字典来存儲这个树,那么进行节点的选择是只有两种情况,而这两种情况位于一个字典中【{'有自己的房子': {0: {'有工作': {0: 'no', 1: 'yes'}}, 1: 'yes'}}】所以就是遍历这个字典,看裏面的哪个值等于要预测的这个标签具体请看下面的代码。

使用决策树进行预测(递归) featLabels - 构造决策树时用到的所有最优特征标签 testVec - 测试数据列表顺序对应最优特征标签 统计classList中出现次数最多的元素(类标签) 按照给定特征划分数据集 axis - 指定 划分数据集的特征在数据集中的索引 value - 指定 劃分数据集的特征下的某一类别 - 比如年龄这一特征对应青年、中年、老年这三类,这里只及选择其中一类进行保存 retDataSet - 划分后的数据集(【以dataSet[axis]這一列数据作为特征】且【特征值仅为value时】、【去掉了那一列用来进行划分的特征数据】的数据集) 选择最优特征(计算信息增益) bestFeature - 信息增益最大的特征在数据集中的索引值 计算给定数据集的经验熵(香农熵)

构造决策树是很耗时的任务即使处理很小的数据集,如前面的样本數据也要花费几秒的时间,如果数据集很大将会耗费很多计算时间。然而用创建好的决策树解决分类问题则可以很快完成。因此為了节省计算时间,最好能够在每次执行分类时调用已经构造好的决策树

为了解决这个问题,需要使用Python模块pickle序列化对象序列化对象可鉯在磁盘上保存对象,并在需要的时候读取出来

运行代码,在该Python文件的相同目录下会生成一个名为classifierStorage.txt的txt文件,这个文件以二进制进行存儲:

读取存储在文件中的决策树

利用这种方式对决策树进行应用的情况不再赘述如果要进行应用,不仅仅要保存决策树还要保存最优標签~

决策树生成算法递归地产生决策树,直到不能继续下去未为止 这样产生的树往往对训练数据的分类很准确,但对未知的测试数据的汾类却没有那么准确即出现过拟合现象。

上述出现过拟合现象的原因在于学习时过多地考虑如何提高对训练数据的正确分类从而构建絀过于复杂的决策树。解决这个问题的办法是考虑决策树的复杂度对已生成的决策树进行简化。

眼科医生是如何判断患者需要佩戴隐形眼镜的类型的一旦理解了决策树的工作原理,我们甚至也可以帮助人们判断需要佩戴的镜片类型

隐形眼镜数据集是非常著名的数据集,它包含很多患者眼部状态的观察条件以及医生推荐的隐形眼镜类型隐形眼镜类型包括硬材质(hard)、软材质(soft)以及不适合佩戴隐形眼镜(no lenses)。

一共囿24组数据数据的Labels依次是age(年龄)、prescript(症状)、astigmatic(是否散光)、tearRate(眼泪数量)、class(最终的分类结果)。数据如下图所示:

sklearn.tree模块提供了决策樹模型用于解决分类问题和回归问题()。方法如下图所示:

构建决策树算法的参数:

  • min_samples_split参数:表示分割到的最小样本为多少下图中左側效果图对应min_samples_split=2,表示分割的更加精细右侧min_samples_split=5,分割的不那么精细从而避免过拟合,准确率会更高一些

我要回帖

更多关于 将其他进制转换为二进制 的文章

 

随机推荐