2021-04-22

【学习笔记】西瓜书机器学习之第四章:决策树 1.什么是决策树? 决策树是一种常见的机器学习方法,以二分类为例,根据一系列的子决策来判断出样本是否为正例。 决策的过程是选择一个属性,来进行判断。以西瓜问题为例,假设已经训练好了一个模型。我们有一个西瓜,先看它的色泽,色泽为青绿色,然后一步一步往下走,最后得到这个西瓜是否为正例(好瓜) 2. 三种选择最优化分属性的方法 现在我们知道了决策树是如何工作的,但是该如何选择每个子决策所对应的属性呢?“纯度”将帮助我们解决这一问题,我们当然希望决策树分支节点所包含的样本尽可能属于同一类别,因此纯度越高越好。 2 阅读详情

决策树

在这里插入图片描述

1.基础知识:

决策树理解起来是很浅显易懂的一种分类算法,它从数据集中提取出一系列的规则。每一条达到叶节点的路径都是一条规则,用于决策所属类别。将特征作为树的非叶节点;分支是对应特征的每类属性值(已给每条数据都有属性值以及类别);叶节点是所属类别。

如图:在这里插入图片描述
熵的计算:那么怎么选择具有决定性的特征呢?为了找到决定性特征,划分出最好的结果,我们必须评估每个特征。
熵定义为信息的期望值,先看看信息的计算。如果 xi 类别被划分在含有x1,x2…xn 类的集合中(混合类), xi 的信息定义为如下:
在这里插入图片描述
其中,p(xi)是选择该分类的概率。可以看出 p(xi) 越大,信息越小。也就是集合中类的种类越单一,信息也就越小。
熵的计算如下,集合中 所有类别对应的信息*概率 的和即为信息的期望:
在这里插入图片描述

2.1信息增益(ID3),越大越好

D:数据集

A:特征A

K:类别的集合 k~K

D的经验熵:
在这里插入图片描述
(表示数据集D的纯度,H越小,纯度越高)
特征A将数据集D分成N个数据集,特征A对数据集D的经验条件熵:
在这里插入图片描述
(即给定特征A,计算每个子数据集的纯度再求和,表示给定A后数据集的纯度,数值越小纯度越高)
特征A对数据集的信息增益:
在这里插入图片描述
(即特征A帮助提升的纯度的大小,值越大越好)

2.2 信息增益率(C4.5)越大越好

由于信息增益会偏向取值较多的特征(过拟合),解释:当特征A取值很多,则划分出的组数增多,使得H(D|A)减小,则信息增益增大。但是过于精细的划分,会使得分类失去意义。(比如按照身份证号给人分类,则每一个人都是一类)。

特征A对数据集D的信息增益率:
在这里插入图片描述
其中,特征A将数据集分成N类,则对于所有特征A相对应的数据的N个类的信息经验熵为(即表示了特征A为类别标签时,数据D的纯度):
在这里插入图片描述
因为当A将数据集D分成太多类时,其纯度降低,H(A)增加,相当于给信息增益添加了一项惩罚项。

2.3 Gini系数(CART)越小越好

基尼指数:从数据集里随机选取子项,度量其被错误分类到其他分组里的概率。基尼系数指数据的不纯度,越小越好。

CART是一个二叉树分类。

K是数据集D的标签集合:k~K

数据D的基尼系数:
在这里插入图片描述
若特征A将数据D分成两个数据集
在这里插入图片描述
但是若当特征A将数据集D分成超过两个数据集时,需要计算以每一个取值作为划分点,对样本D划分之后子集的纯度Gini(D,Ai),(其中Ai 表示特征A的可能取值),然后从所有的可能划分的Gini(D,Ai)中找出Gini指数最小的划分,这个划分的划分点,便是使用特征A对样本集合D进行划分的最佳划分点。

对各个概念的理解:熵描述了信息的不确定性,我们的目标是划分数据集D,使得划分后的数据集的不确定性降低。信息增益描述了特征A对于降低数据集D的不确定性的帮助,信息增益越大,说明A的引入增加了信息,降低了D的不确定性。然而,由于信息增益会偏向取值较多的特征,为了解决这个特征之间的选择不平衡的现象,我们添加了一项惩罚项,引入了信息增益率。

3.剪枝处理

构建决策树时,根据最优的特征进行构建,往往会使得所得的树分支过多,过拟合。因此需要对树进行剪枝。

预剪枝:边构建树边剪枝。当到某一节点无法达到要求时,即停止分支。

后剪枝:先完整地构建出决策树,然后自下而上地进行剪枝。

判断是否剪枝的标准:剪枝前后的泛化能力,若剪枝后泛化能力增强,则剪枝,否则不剪枝。

泛化能力的判断方法:留出法。即在原数据集中拿出一部分做为验证集,剪枝时,判断该分支分与部分对验证集分类的影响(准确率的影响)。

注意:因为预剪枝含有“贪心”的思想,即一旦某个节点分支不能提高泛化能力,立即停止。此时可能会忽略后续泛化能力高的分支。因此预剪枝可能会造成“欠拟合”。

4.直接上代码


from math import *
import operator
import pickle

def createDataSet():
    dataSet = [[1, 1, 1, 'yes'],
               [1, 0, 1, 'yes'],
               [1, 0, 2, 'no'],
               [0, 1, 2, 'no'],
               [0, 1, 2, 'no'],
               [1, 1, 2, 'yes'],
               [0, 0, 2, 'yes'],
               [0, 1, 0, 'no'],
               ]
    labels = ['ddddd','fffff','sssss']
    #change to discrete values
    return dataSet, labels

# 计算信息熵
def calcShannonEnt(dataSet):
    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.0
    for key in labelCounts:  # 计算信息熵
        prob = float(labelCounts[key]) / numEntries
        shannonEnt -= prob * log(prob, 2)
    return shannonEnt

myDat,labels=createDataSet()
shannonEnt=calcShannonEnt(myDat)


# 划分数据集,axis:按第几个属性划分,value:要返回的子集对应的属性值
def splitDataSet(dataSet, axis, value):
    retDataSet = []
    featVec = []
    for featVec in dataSet:
        if featVec[axis] == value:
            reducedFeatVec = featVec[:axis]
            reducedFeatVec.extend(featVec[axis + 1:])
            retDataSet.append(reducedFeatVec)
    return retDataSet

def chooseBestFeatureToSplit(dataSet):
    numFeatures = len(dataSet[0]) - 1  # 属性的个数。 -1是因为最后一个是分类的标签
    baseEntropy = calcShannonEnt(dataSet)
    bestInfoGain = 0.0
    bestFeature = -1
    for i in range(numFeatures):  # 对每个属性记录信息增益
        featList = [example[i] for example in dataSet]
        uniqueVals = set(featList)  # 该属性的取值集合
        newEntropy = 0.0
        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 bestFeature

def majorityCnt(classList):
    classCount = {}
    for vote in classList:
        if vote not in classCount.keys(): classCount[vote] = 0
        classCount[vote] += 1
    sortedClassCount = sorted(classCount.iteritems(), #注意python3.x中要改成.items()函数
                              key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]

# 递归构建决策树
def createTree(dataSet, labels):
    classList = [example[-1] for example in dataSet]  # 类别向量
    if classList.count(classList[0]) == len(classList):  # 如果只有一个类别,返回
        return classList[0]
    if len(dataSet[0]) == 1:  # 如果所有特征都被遍历完了,返回出现次数最多的类别
        return majorityCnt(classList)
    bestFeat = chooseBestFeatureToSplit(dataSet)  # 最优划分属性的索引
    bestFeatLabel = labels[bestFeat]  # 最优划分属性的标签
    myTree = {bestFeatLabel: {}}
    del (labels[bestFeat])  # 已经选择的特征不再参与分类
    featValues = [example[bestFeat] for example in dataSet]
    uniqueValue = set(featValues)  # 该属性所有可能取值,也就是节点的分支
    for value in uniqueValue:  # 对每个分支,递归构建树
        subLabels = labels[:]
        myTree[bestFeatLabel][value] = createTree(
            splitDataSet(dataSet, bestFeat, value), subLabels)
    return myTree

print(createTree(myDat, labels))

流程图如图:

在这里插入图片描述

机器学习的结果:

{'sssss': {0: 'no', 1: 'yes', 2: {'ddddd': {0: {'fffff': {0: 'yes', 1: 'no'}}, 1: {'fffff': {0: 'no', 1: 'yes'}}}}}}

我画了一个决策树的图,便于更好的理解机器学习的结果:

在这里插入图片描述
如果有问题评论区留言:
有错误我立即改正,你我共同努力。

4.5为什么使用信息增益比来选择特征? 这篇文章来源于本人的知乎回答 作者:陈彪 链接:https://www.zhihu.com/question/22928442/answer/117189907 来源:知乎 著作权归作者所有,转载请联系作者获得授权。 最近正好在学决策树,信息增益和信息增益率确实是初学阶段很纠结的问题。要解决题主的疑惑,必须先分析Info-Gain(信息增益)和Gain-ratio(信息增益率)的 阅读详情

相关推荐

【决策树_原理理解(一)】

1、概念 决策树是一种常见的机器学习方法,可以解决分类问题(二分类、多分类)、回归问题 一般的,一棵树包含一个根节点,若干个内部节点、叶子节点,每一个叶子节点代表决策的结果,从根节点到每个叶子节点的路径对应了一条判定的策略。 树的生成过程就是决策过程,这个过程是递归的,出现以下三种情况后递归会结束: 1)当前节点的样本属于同一个类别 2)当前节点样本集为空 3)当前节点属性集为空或所有样本在属性上取值相同 2、划分选择 了解了决策树的概念之后,我们希望决策树在每个节点的样本尽可能的属于同一类,即纯度越高,那

Silenceyezi的博客 1220

信息熵与信息增益

信息熵(information entropy)是度量样本集合纯度/不确定度最常用的指标之一。 但要注意,信息熵越小,表示不确定度越低,确定度越高,纯度越高。 Ent(D)=−∑k=1∣γ∣pklog2pkEnt(D)=-\sum_{k=1}^{|\gamma|}{p_klog_2p_k}Ent(D)=−∑k=1∣γ∣​pk​log2​pk​ 信息熵是对信息量的度量。越小概率的事情发生所产生的信息量越大。 信息量的公式表示如下: h(x)=−log2p(x)h(x)=-log_2p(x)h(x)=−log2

吟游诗人——吟唱生命的不朽 6711

Ubuntu22.04下Abaqus2021安装避坑指南:从依赖库到许可证配置全流程

本文详细解析了在Ubuntu22.04系统上安装Abaqus2021的全流程,包括依赖库准备、安装文件解压、许可证服务器配置及常见问题解决方案。特别针对Ubuntu22.04与Abaqus2021的兼容性问题提供了实用技巧,帮助用户顺利完成安装并避免常见错误。

weixin_29204749的博客 162

信息熵、信息增益、信息增益率、基尼值、基尼指数

通常不会直接使用决策树,但这些概念对于理解。(如 ID3、C4.5、CART)很重要。,用于分类任务(如 CART 决策树)。(特征划分后不确定性下降越多越好)。在决策树等机器学习算法中,(意味着数据集纯度高)。,用于选择分裂特征。(更好的特征选择)。(数据集纯度更高)。

weixin_63681863的博客 1935

Ubuntu22.04下Abaqus2021安装与常见问题解决指南

本文详细介绍了在Ubuntu22.04系统下安装Abaqus2021的完整步骤,包括系统准备、安装文件解压与配置、许可证服务器安装与配置、主程序安装与验证,以及常见问题的解决方案。通过本指南,用户可以顺利完成Abaqus2021的安装并解决可能遇到的依赖问题和启动错误。

weixin_30832143的博客 371

Abaqus2021在Ubuntu22.04上的完整安装教程:含Fortran子程序关联

本文提供Abaqus2021在Ubuntu22.04上的完整安装教程,包括Fortran子程序关联的详细步骤。从系统准备、许可证服务器配置到主程序安装和性能优化,全面解决Linux环境下Abaqus部署的常见问题,特别针对Ubuntu22.04的兼容性提供专业解决方案。

weixin_30335575的博客 276

在Ubuntu 22.04.3上畅享MATLAB 2021b的科技之旅

在Ubuntu 22.04.3上畅享MATLAB 2021b的科技之旅 【下载地址】如何在Ubuntu22.04.3上安装Matlab2021b及解决安装难题分享 如何在Ubuntu 22.04.3上安装Matlab 2021b及解决安装难题---欢迎来到本教程!如果你是一位Ubuntu 22.04.3的用户,并且正寻求...

gitblog_06581的博客 590

别再折腾Windows了!Ubuntu 22.04下USRP X310 + RFNoC + Vivado 2021.1开发环境保姆级搭建指南

本文提供Ubuntu 22.04下USRP X310 + RFNoC + Vivado 2021.1开发环境的详细搭建指南,涵盖系统优化、UHD驱动编译、Vivado配置及硬件验证等关键步骤,帮助射频工程师高效构建稳定的开发环境,显著提升FPGA开发效率。

weixin_29168675的博客 255

【免费下载】 MinIO 2021-04-22 历史版本下载

MinIO 2021-04-22 历史版本下载 【下载地址】MinIO2021-04-22历史版本下载 - **版本号**: minio-RELEASE.2021-04-22T15-44-28Z- **包含内容**: - Windows 二进制包 - Linux 二进制包 - 源代码 ...

gitblog_09768的博客 3307

【RK3588 NPU性能调优实战】多线程异步推理YOLOv5,榨干6TOPS算力

本文详细解析了如何在RK3588 NPU上通过多线程异步推理优化YOLOv5目标检测性能,实现6TOPS算力的最大化利用。通过线程池设计、流水线化帧处理及避开内存带宽瓶颈等技巧,将NPU利用率从30%提升至82%,帧率显著提高至61.2FPS。文章还提供了环境配置、代码实现及性能对比数据,助力开发者高效部署AI模型。

weixin_29034963的博客 341

自然二进制数与格雷码的相互转换

自然二进制数与格雷码两者优势: 自然二进制数的编码方式简单明了,容易理解,在加减运算中能够直接进行,同时十分方便进行一些位运算操作(如移位、取反等)。 格雷码计数时只有一位变化,可有效减少计数器状态的冗余转换,同时在传输数据时能够减小传输错误的概率,此外带权重编码处理更加方便。 在一定程度上自然二进制数与格雷码优缺点基本相反,综上所述,自然二进制数和格雷码各有优劣之处,需要根据具体应用场景选择合适的编码方式。简单来说,在计数器和编码器中,倾向于使用格雷码;而在进行加减运算时,则倾向于使用自然二进制数。

Loudrs的博客 7494

【亲测免费】 探索MinIO 2021-04-22:商业合规的最后机会

探索MinIO 2021-04-22:商业合规的最后机会 【下载地址】MinIO2021-04-22历史版本下载 - **版本号**: minio-RELEASE.2021-04-22T15-44-28Z- **包含内容**: - Windows 二进制包 - Linux 二进制包 - 源代码 ...

gitblog_09777的博客 902

10行代码搞定QMT实盘交易:手把手教你用Python自动化买卖股票(附完整源代码)

本文提供了一份详尽的QMT实盘交易教程,手把手教你使用Python构建自动化交易系统。内容涵盖环境配置、账户连接、查询与下单等核心代码,并附有完整的源代码示例,帮助开发者快速掌握从零到实盘的完整流程,实现安全可靠的股票自动化买卖。

weixin_29214335的博客 439

双系统安装 ubuntu 22.04 + win11(yoga 14s 2021)

考虑到无法完全转向 windows,于是选择双系统安装 ubuntu。文章安装过程主要参考 Ref [1],具体细节会在文中体现。

lurenyi0724的博客 2648

别再为数据发愁了!盘点5个公开可用的医学图像数据集(含MRI/CT/PET合成任务)

本文详细介绍了5个高质量的公开医学图像数据集,涵盖MRI、CT和PET三大模态,适用于深度学习模型训练和医学图像合成任务。每个数据集均提供下载指南、预处理技巧和PyTorch加载示例,帮助研究人员快速获取和处理数据,解决医学AI开发中的数据瓶颈问题。

weixin_30689307的博客 524

【Ultrascale+ MPSOC学习记录】6、从eMMC启动翻车

因为MPSOC还有一种启动模式是eMMC,接下来咱就实现从eMMC启动。

ryo891012的博客 474

在Ubuntu 22.04上安装配置SIMPACK 2021x:从依赖准备到自动化集成

多体动力学仿真软件SIMPACK是工业领域进行机械系统动态性能分析的重要工具,其核心原理在于通过求解多体系统动力学方程来预测复杂机械系统的运动与受力。在工程实践中,将此类专业软件部署于Linux环境,特别是Ubuntu系统,能显著提升技术价值,实现环境统一与自动化集成,从而高效对接Shell脚本、Python数据分析及高性能计算集群。本文聚焦于SIMPACK 2021x在Ubuntu 22.04 LTS上的实际部署,详细解析了包括系统依赖、图形库配置、许可证服务器(FLEXlm)设置等关键步骤,并针对**环

weixin_34101914的博客 305

Ubuntu断网环境下的系统更新:apt-offline保姆级教程(附常见问题排查)

本文详细介绍了在Ubuntu断网环境下使用apt-offline进行系统更新的完整教程,包括环境准备、签名文件生成、数据传输方案对比及常见问题排查。特别适用于企业级开发环境或安全敏感场景,帮助运维人员高效完成离线系统更新,确保系统安全与稳定。

weixin_29214691的博客 360
下一篇: 机器学习——决策树
中北编程底线
博客等级 码龄6年 17粉丝 31原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值