python机器学习算法.mobi_机器学习之ID3算法详解及python代码实现

在生活中我们经常会用到决策树算法,最简单的就是二叉树了;相信大家也会又同样的困扰,手机经常收到各种短信,其中不乏很多垃圾短信、此时只要设置这类短信为垃圾短信手机就会自动进行屏蔽、减少被骚扰的次数,同时正常短信又不会被阻拦。类似这种就是决策树的工作原理,决策树的一个重要任务是为了理解数据中所含的信息,可以使用决策树不熟悉的数据集合,并从中体取一系列规则,这些机器根据数据集创建规则的过程,就是机器学习的过程。

决策树优缺点:

优点:计算复杂度不高,输出结果易于理解、即对模型的输出结果的可解释性要高;对中间值的缺失不敏感,可以处理不相关数据;

缺点:可能会产生过拟合现象;

决策树的构建:

输入:数据集

输出:构建好的决策树(训练集)

def 创建决策树:

  if(数据集中所有样本分类一致):

    创建携带类标签的叶子节点

else:

    寻找划分数据集最好的特征

    根据最好特征划分数据集

    for每个划分的数据集:

    创建决策子树(递归完成)

决策树的关键在于当前数据集上选择哪个特征属性作为划分的条件(能够将本来无序的数据集最大程度的划分为有序的子集),度量最佳分类属性特征的“最佳性”可用非纯度进行衡量;如果一个数据集只有一种分类结果,则该数据集一致性好、能够提供的信息也最少:只有一种情况;如果数据集有很多分类,则该数据集的一致性不好,能够提供的信息也较多:至少确定不只一种。组织杂乱数据的一种方法就是使用信息论度量信息,在划分数据前后信息发生的变化称为信息增益、这里描述集合信息的度量方式称为香农熵或者简称熵。(该名字来源于克劳德.香农、二十实际最聪明的人之一)。熵定义为信息的期望值,为了计算熵、我们需要计算所有类别的可能值所包含的信息期望。

熵计算公式:

3b2d0193f1c6739fe75508c8f87a93ff.png

明确决策树分类选择特征的依据后,先梳理下决策树的流程都有哪些:

1、收集数据:一切可以使用的方法、只要不违法;

2、准备数据:树构造算法只适用于标准型数据,因此数据值必须离散化;

3、分析数据:可以使用任何方法,数据构建完成后,需看下是否达到了我们的预期;

4、训练算法:构建树的数据结构;

5、测试算法:使用构建好的树计算正确率,越高当然越好(也可能过拟合、不能过份高了);

6、使用算法。

为了后面更好的理解决策树,利用如下数据我们先套用下公式,直观的计算一下什么是信息熵、什么是信息增益,以及如何选择一个特征作为当前数据的划分条件;以便后面更好的撸代码。

经典的样例数据:

Day

天气

温度

湿度

决定

1

N

2

N

3

Y

4

Y

5

正常

Y

6

正常

N

7

正常

Y

8

N

9

正常

Y

10

正常

Y

11

正常

Y

12

Y

13

正常

Y

14

N

根据信息熵的公式,此数据比较简单、我们可以手工计算一下各个特征的信息增益,从而知道ID3算法具体选择哪个特征作为分类的依据和算法的一个计算过程。

先列一下公式、参照公式带入计算,减小手工计算误差:

计算数据集(D)的经验熵:

72aa5cf24c8c91ac3f60094f87872fe5.png

一个特征(A)对数据集(D)的经验条件熵:

833782f0b9c2ed2c00f11616118c98f3.png

那么相对特征(A)此时的信息增益计算公式为:

3d73b4619b5dfbcb25ed7ec25ae1cd36.png

以上4个特征中:天气(晴、阴雨)/温度(热、适中、凉)/湿度(高、正常)/风(强弱),推算过程中我们选择湿度或风、这两个特征值分布均只含两个值,计算过程的时候相对要简单一点。

第一步:计算该数据集的经验熵,该数据集共有14条数据:9条决定为Y、5条决定为N;则p(Y)=9/14、p(N)=5/14。此时代入公式:

a19aa65c6b813b2e0238199ba4d52a51.png

第二步:选择风这个特征计算该特征相对数据集的经验熵,从数据可以看出风共有两个值:强和弱。

其中为强风的数据分布如下、共有6条数据,其中决定为Y和N的分别是3条,此时p(Y)=3/6、p(N)=3/6。

Day

天气

温度

湿度

决定

2

N

6

正常

N

7

正常

Y

11

正常

Y

12

Y

14

N

代入公式:

1654df2a4d2582b7ed8a14356c395099.png

其中为若风的数据分布如下、共有8条数据,其中决定为Y有6条、N有2条,此时p(Y)=6/8、p(N)=2/8。

Day

天气

温度

湿度

决定

1

N

3

Y

4

Y

5

正常

Y

8

N

9

正常

Y

10

正常

Y

13

正常

Y

代入公式:

325e3624428519c54827b0e67944d736.png

风这个特征的经验熵计算就完成了,强风和弱风在整个数据集中的占比分别为:

p(强)=6/14、p(弱)=8/14;代入公式则风这个特征的条件熵为:

afb9bb527615ca22ddcea1e4a53e47c1.png

风这个特征的信息增益为:

8f094c4c8412fe8739993d53aa8705b7.png

以此类推:

c5cec506f932c3016e630997f35ca525.png

从中可以看出天气的新增增益为0.246、高于其他三个特征的增益,这也是为什么天气作为第一个分类依据的特征、在树的根节点上。

参照《机器学习实践》构建一颗决策树、python代码如下:

from math import logimport operatordef calcShannonEnt(dataSet):  # 计算数据的熵(entropy)    numEntries = len(dataSet)  # 数据条数    labelCounts = {}    for featVec in dataSet:        currentLabel = featVec[-1]  # 每行数据的最后一个字(类别)        if currentLabel not in labelCounts.keys():            labelCounts[currentLabel] = 0        labelCounts[currentLabel] += 1  # 统计有多少个类以及每个类的数量    shannonEnt = 0    for key in labelCounts:        prob = float(labelCounts[key]) / numEntries  # 计算单个类的熵值        shannonEnt -= prob * log(prob, 2)  # 累加每个类的熵值    return shannonEntdef createDataSet1():  # 创造示例数据    dataSet = [['黑', '是', '男'], ['白', '否', '男'], ['黑', '是', '男'],               ['白', '否', '女'], ['黑', '是', '女'], ['黑', '否', '女'],               ['白', '否', '女'], ['白', '否', '女']]    labels = ['a', 'b']    return dataSet, labels#待划分的数据集、划分数据集的特征、需要返回的特征值def splitDataSet(dataSet, axis,value):  # 按某个特征分类后的数据,例如value = 长,axis为头发axis = 0    retDataSet = []  # retDataSet返回的是数据中,所有头发为长的记录    for featVec in dataSet:        if featVec[axis] == value:            # 每次会将这个feature删除掉            reducedFeatVec = featVec[:axis]            reducedFeatVec.extend(featVec[axis + 1:])            retDataSet.append(reducedFeatVec)    return retDataSetdef chooseBestFeatureToSplit(dataSet):  # 选择最优的分类特征    numFeatures = len(dataSet[0]) - 1    baseEntropy = calcShannonEnt(dataSet)  # 原始的熵    bestInfoGain = 0    bestFeature = -1    # (1)遍历每个特征    for i in range(numFeatures):        featList = [example[i] for example in dataSet]        uniqueVals = set(featList)        newEntropy = 0        # (2)对单个特征中每个唯一值都进行子树的切分,然后计算这个的信息增益,然后累加每个分裂条件的信息增益,为newEntropy        for value in uniqueVals:            subDataSet = splitDataSet(dataSet, i, value)            prob = len(subDataSet) / float(len(dataSet))            newEntropy += prob * calcShannonEnt(subDataSet)  # 按特征分类后的熵        infoGain = baseEntropy - newEntropy  # 原始熵与按特征分类后的熵的差值        if (infoGain > bestInfoGain):  # 若按某特征划分后,熵值减少的最大,则次特征为最优分类特征            bestInfoGain = infoGain            bestFeature = i    return bestFeaturedef majorityCnt(classList):  #按分类后类别数量排序,比如:最后分类为2男1女,则判定为男;    classCount = {}    for vote in classList:        if vote not in classCount.keys():            classCount[vote] = 0        classCount[vote] += 1    sortedClassCount = sorted(classCount.items(),                              key=operator.itemgetter(1),                              reverse=True)    return sortedClassCount[0][0]# 决策树核心逻辑:递归,深度优先遍历创建子树def createTree(dataSet, labels):    #print(dataSet)    classList = [example[-1] for example in dataSet]  # 类别:男或女    if classList.count(classList[0]) == len(classList):        return classList[0]    if len(dataSet[0]) == 1:  # 当只剩最优一个feature时,因为每次分裂会删除一个特征        return majorityCnt(classList)    # (1) 选择最优分裂特征    bestFeat = chooseBestFeatureToSplit(dataSet)  #选择最优特征    bestFeatLabel = labels[bestFeat]    myTree = {bestFeatLabel: {}}  #分类结果以字典形式保存    del (labels[bestFeat])    featValues = [example[bestFeat] for example in dataSet]    uniqueVals = set(featValues)    # (2) 遍历分裂特征的每个唯一值,分裂产生子树    for value in uniqueVals:        # 将每个label都往子树传递,labels一直可能会被选用        subLabels = labels[:]        # 对基于best feature这个feature内每个唯一值切分为不同的子树,然后返回子树的结果。每个子树切分能多个分支        # 递归调用,每层的切分为每个特征的唯一值        # (3) 对最佳分裂特征的每个值,分别创建子树        myTree[bestFeatLabel][value] = createTree(            splitDataSet(dataSet, bestFeat, value), subLabels)    return myTreeif __name__ == '__main__':    dataSet, labels = createDataSet1()  # 创造示列数据    print(createTree(dataSet, labels))  # 输出决策树模型结果
为了更直观展示决策树及各节点的信息熵,用sklearn工具基于鸢尾花数据集展示一颗完整的决策树结构。
from sklearn.datasets import load_irisfrom sklearn import treeimport osimport pydot  # need installprint(os.getcwd())clf = tree.DecisionTreeClassifier(criterion="entropy", max_features="log2",max_depth = 10)  #giniiris = load_iris()clf = clf.fit(iris.data, iris.target)tree.export_graphviz(clf, out_file='tree.dot')(graph, ) = pydot.graph_from_dot_file('tree.dot')graph.write_png('tree.png')

对应的决策树结构如下:

d9c84fe16acbbb569be858a95d68a22d.png

ID3是基于信息增益作为分类依据的监督学习算法,它有一个明显的缺点是该算法会倾向选择有较多属性值的特征作为分类依据,鉴于ID3算法缺点后面又衍生出来C4.5和CART算法、具体后面再详细介绍和分享总结。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/528120.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中的4种访问制权限有哪些?分别作用范围是什么?

(1).public:最大访问控制权限,对所有的类都可见。 (2).protect:修饰的,在类内部、同一个包、子类中能访问 (3).default:包访问权限,即同一个包中的类可以可见。默认不显式指定访问控制权限时就是default包…

打docker镜像_从安全到镜像流水线,Docker 最佳实践与反模式一览

作者 | Timothy Mugayi译者 | 弯月,责编 | 夕颜封图 | CSDN付费下载自视觉中国出品 | CSDN(ID:CSDNnews)在使用Docker的大部分时间里,我们并不关心其内部的工作原理。仅凭启动一个Docker容器并且让应用程序运行良好,并不能说明你已经实现了一…

详细关闭iiop方法_疏通暖气片堵塞的方法,看完你就知道了!

冬季几乎家家户户都会安装暖气片来进行采暖,但在使用过程中,通常会出现暖气片被堵,用户不知道被堵的原因又不知从哪下手,今天金旗舰旗哥带大家来了解一下暖气片被堵塞的原因及疏通方法。一、堵塞暖气片的原因:1、暖气片…

谈谈对集合框架的理解?

集合框架包括集合不映射(Collection and Map) List 元素有先后次序的集合, 元素有 index 位置, 元素可以重复,继承自 Collection 接口,实现类: ArrayList, Vector, LinkedList List 表示有先后次序的对象集合 ArrayList是使用变长数组算法…

17 软件源_9成职场人支持“准点下班”,2020年度职场报告:工作是最大焦虑源

如果所有人都拒绝996,能否改变职场内卷生态?职场社交平台脉脉站内的数据显示,在一则:“准点下班VS加班谁才是好员工”的问答中,8.1万的投票者选择“准点”下班,占89%;只有9968名投票者认为“加班…

js如何在当前页面加载springmvc返回的页面_手写SpringMVC学习

前面我们学习了spring框架源码,做了一些自己手写的学习,最近,我们开始学习springMVC框架的学习 ,springMVC框架,相信大家不陌生了,所以这里不做过多的介绍了。SpringMVC以DispatcherServlet为核心&#xff…

用python做简单的地理聚类分析案例_用Python做一个简单的翻译工具

编程本身是跟年龄无关的一件事,不论你现在是十四五岁,还是四五十岁,如果你热爱它,并且愿意持续投入其中,必定会有所收获。本文就来自编程教室一位“小”读者的投稿(互助学习1群里的同学应该对作者的名字很熟…

echarts柱图根据值显示不同颜色_视频 | Origin画3D柱图,这篇讲透了!

视频教程东华大学的汪博士提出一个问题:怎样画三维柱状图。汪博士提供了一篇王中林院士的文献图,画一个只有四根柱子的三维柱图。画了一个草图,A0、A1安排在第二行,A3、A2安排在第一行。相信很多同学在画3D柱图时,都很…

按钮点击打开新页面_PDF怎么打开?如何制作一个PDF格式的文档?

不知你是否也一样,无论是在网上下载资料还是其他人发送的文件都是PDF格式的。但是应该如何打开PDF文件呢?如何自己制作一个PDF格式的文档呢?首先说一下如何打开PDF格式的文件,电脑端就比较简单的,直接下载PDF阅读器后&…

android 根据bounds坐标进行点击操作_炫酷的Android时钟UI控件,隔壁产品都馋哭了...

废话不多说,先上效果效果酷炫,动画丰富,效果爆炸boom~设计思路看腻了市面上各种丑陋难看的时钟控件,是时候整点新活!将现实生活中的摆钟圆形表盘设计、电子手表的数显表盘设计抽象出来,提取出“…

打了断点为直接运行完_BBC主持人多次打断,香港大律师忍不住发飙

来源:环球网7月7日,香港资深大律师汤家骅就香港《国安法》相关内容接受BBC栏目《唇枪舌剑》(HARDtalk)采访。节目主持人斯蒂芬•萨克在整个访问过程中频频打断汤家骅,根本不让汤家骅回答完问题。视频显示,汤家骅多次试图向萨克解释《国安法》…

指针 是否相同_算法一招鲜——双指针问题

什么是双指针(对撞指针、快慢指针)双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行…

作为神经网络的输入_MATLAB实战|基于神经网络河南省降水量预测

1 BP神经网络结构神经网络旨在通过模仿动物的神经系统利用神经元作为连接结点的新型智能算法,神经网络本身包含三层结构,输入层,隐含层,输出层,每一层都有自己的特殊功能,输入层进行因子的输入与处理。由于…

docker kafka互通有问题_Docker搭建kafka集群

拉取镜像docker pull wurstmeister/kafka docker pull wurstmeister/zookeeper启动镜像docker run --name zookeeper -p 12181:2181 -d wurstmeister/zookeeper:latestdocker run -p 19092:9092 --name kafka1 -d -e KAFKA_BROKER_ID0 -e KAFKA_ZOOKEEPER_CONNECT宿主机ip:1218…

elementui 上传七牛_element ui使用上传组件上传文件到七牛(qiniu-js)

博主正在重构博客中,刚开始时静态资源都是上传到本地服务器的,但这个项目博主最后打算真正上线运营的。索性就改进了下,把静态资源尽量放到云存储中,方便后续开发。这里把方法和遇到坑给记录下。1.使用前提注册七牛云并创建存储空…

bool类型0和1真假_MySQL整理5—数据类型和运算符

数据科学探路者:MySQL整理4—数据表的基本操作2​zhuanlan.zhihu.com一、数据类型数据科学探路者:MySQL知识整理1—数据库基础​zhuanlan.zhihu.com在上面链接的部分内容中,介绍了以下数据类型:整数类型:BIT、BOOL、TI…

linux启动mysql1820_linux 系统下MySQL5.7重置root密码(完整版,含ERROR 1820 (HY000)解决方案)...

mysql的root密码忘记了怎么重置?往下看:1.保证你的mysql服务处于关闭状态。(用ps -ef | grep mysql 查看进程,有则kill -9 进程号)2.在my.cnf所在目录中执行 vim my.cnf3.在[mysqld] 后边加入skip-grant-tables如图:并保存。4.启动…

mysql谓词演算_MySQL基础知识

一、了解MySQL1、什么是数据库?数据库是一种以某种有组织的方式存储的数据集合。2、模式(schema):关于数据库和表的布局及特性的信息。3、列:正确的将数据分解为多个列极为重要。通过把它分解开,才有可能利用特定的列对数据进行排序和过滤。4…

mysql+缓冲池脏块率高_什么是数据库的 “缓存池” ?(万字干货)

原标题:什么是数据库的 “缓存池” ?(万字干货)1、Buffer Pool 概述Buffer Pool 是什么?从字面上看是 缓存池 的意思,没错,它其实也就是 缓存池 的意思。它是 MySQL 当中至关重要的一个组件,可以这么说&…

mysql多实例配置安装_MySQL多实例安装配置方案

一.基本概念MySQL多实例就是,在一台机器上开启多个不同的服务端口(如:3306,3307,3308...),运行多个MySQL服务进程,这些服务进程通过不同的socket监听不同的端口提供服务。MySQL可以共用一套安全程序,使用不同的my.cnf配…