《机器学习实战》-chapter3-决策树

ANN 回归预测实战 import pandas as pd # 数据科学计算工具 import numpy as np # 数值计算工具 from sklearn.metrics import mean_squared_error from sklearn.metrics import r2_score from sklearn.metrics import mean_absolute_error # 平方绝对误差 from math import sqrt train_path = r'WWT_data.csv' dat 阅读详情

这一章主要是介绍决策树的算法思想并最后用决策树来预测隐形眼睛的类型,在python中一般使用字典数据类型来保存决策树,并借助matplotlib注解工具annotations来可视化决策树。

目前的决策树构建算法有:

  • ID3
  • C4.5
  • CART

本章讲解的是ID3算法,其实这几个算法的不同主要是在选取根节点上的衡量标准不一样,ID3采用的是信息增益来衡量,即若某个节点的信息增益最大就把它作为根节点。C4.5采用信息增益率来衡量,信息增益率最大的就把它作为根节点。CART采用基尼指数来衡量,基尼指数是指样本被误分类的概率。

信息增益是指划分数据集前后信息发生的变化。其计算公式为:

信息的定义是:  H=-log_{2}p(x_{i})

所有类别所有可能值包含的信息是:H=-\sum _{i=1}^{n}\textrm{ }p(x_{i})log_{2}p(x_{i})

信息增益为:S=S-\sum \frac{A_i}{A_{all}}S

这里的信息增益写的可能不是特别准确,有疑问的可以看这里

下面是具体的代码,我记得由于Python的版本不同代码有点改动,但具体改了那里我想不起来了,下面贴的肯定是能运行的。

先是决策树的构造:tree.py

# -*- coding: UTF-8 -*-
from math import log
import operator
import pickle

#用于计算香农熵
def clacShannonEnt(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

def creatDataSet():
    dataSet = [[1,1,'yes'],[1,1,'yes'],[0,1,'no'],[0,1,'no'],[1,0,'no']]
    labels = ['man','woman']
    return dataSet,labels

#返回的是满足featVec[axis]=value的数据集合
def splotDataSet(dataSet, axis, value):
    retDataSet = []
    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
    baseEntropy = clacShannonEnt(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 = splotDataSet(dataSet, i, value)
            prob = len(subDataSet)/float(len(dataSet))
            newEntropy += prob* clacShannonEnt(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
        else:
            classCount[vote] += 1
    sortedClassCount = sorted(classCount.items(),key = operator.itemgetter(1),reverse=True)
    return sortedClassCount[0][0]

def creatTree(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]
    uniqueVals = set(featValues)
    for value in uniqueVals:
        subLabels = labels[:]
        subdataSet = splotDataSet(dataSet,bestFeat,value)
        myTree[bestFeatLabel][value] = creatTree(subdataSet,subLabels)
    return myTree

#测试分类结果
def classify(inputtree,featlabels,testvec):
    #firststr就是根节点的值,也就是dict中的第一个Key
    firststr = list(inputtree.keys())[0]
    seconddict = inputtree[firststr]
    #返回的是firststr在featlabels中的索引值
    featindex = featlabels.index(firststr)
    for key in seconddict.keys():
        if testvec[featindex] == key:
            if type(seconddict[key]).__name__ == 'dict':
                #如果子节点还是树结构的话就递归调用继续分类
                classlabel = classify(seconddict[key], featlabels, testvec)
            else:
                classlabel = seconddict[key]
    return classlabel

#存储决策树
def storetree(inputtree,filename):
    fw = open(filename,'wb')
    #pickle.dump(obj, file, [,protocol]),把obj保存在file中 ,'wb'写入二进制文件   
    pickle.dump(inputtree,fw)
    fw.close()
def grabtree(filename):
    fr = open(filename,'rb')
    #pickle.load()读取数据的方式,‘rb’读取二进制文件
    return pickle.load(fr)
    

下面是决策树的可视化:treeplotter.py

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt

decisionNode = dict(boxstyle='sawtooth',fc='0.8')
leafNode = dict(boxstyle='round4',fc="0.8")
arrow_args = dict(arrowstyle="<-")

#annotate函数是注解函数,对xy点进行注解
#关于annotate函数的更多细节https://blog.youkuaiyun.com/leaf_zizi/article/details/82886755
#https://blog.youkuaiyun.com/wizardforcel/article/details/54782628
def plotNode(nodeTxt, centerPt, parentPt, nodeType):
    createPlot.ax1.annotate(nodeTxt, xy=parentPt, xycoords = "axes fraction",
                            xytext=centerPt,textcoords='axes fraction',
                            va = 'center',ha = 'center', bbox = nodeType, 
                            arrowprops = arrow_args)
def plotMidText(cntrPt,parentPt,txtString):
    xMid = (parentPt[0]-cntrPt[0])/2.0 + cntrPt[0]
    yMid = (parentPt[1]-cntrPt[1])/2.0 + cntrPt[1]
    createPlot.ax1.text(xMid,yMid,txtString)

def plotTree(mytree,parentPt,nodeTxt):    
    numLeafs = getNumLeaf(mytree)
    numdepth = getTreeDepth(mytree)
    firstStr = list(mytree.keys())[0]
    cntrPt = (plotTree.xoff + (1.0 +float(numLeafs))/2.0/plotTree.totalW,plotTree.yoff)
    plotMidText(cntrPt,parentPt,nodeTxt)
    #先绘制根节点
    plotNode(firstStr,cntrPt,parentPt,decisionNode)
    secondDict = mytree[firstStr]
    plotTree.yoff = plotTree.yoff -1.0/plotTree.totalD
    for key in secondDict.keys():
        if type(secondDict[key]).__name__ == 'dict':
            plotTree(secondDict[key],cntrPt,str(key))
        else:
            plotTree.xoff = plotTree.xoff + 1.0/plotTree.totalW
            plotNode(secondDict[key],(plotTree.xoff,plotTree.yoff),cntrPt,leafNode)
            plotMidText((plotTree.xoff, plotTree.yoff), cntrPt, str(key))
    plotTree.yoff = plotTree.yoff + 1.0/plotTree.totalD

def createPlot(inTree):
    flg = plt.figure(1,facecolor="white")
    flg.clf()
    axprops = dict(xticks=[], yticks=[])#显示图像时不显示坐标
    createPlot.ax1 = plt.subplot(111,frameon = False, **axprops)
    plotTree.totalW = float(getNumLeaf(inTree))
    plotTree.totalD = float(getTreeDepth(inTree))
    plotTree.xoff,plotTree.yoff = -0.5/plotTree.totalW,1.0
    plotTree(inTree,(0.5,1.0),'')
    plt.show()

#看树有多少叶子节点
def getNumLeaf(myTree):
    numLeafs = 0    
    firstStr = list(myTree.keys())[0]
    secondDict = myTree[firstStr]
    for key in secondDict.keys():
        #测试该节点的类型是否为dict,如果是的话则该节点下面还有叶子节点,否则该节点就是叶子节点
        if type(secondDict[key]).__name__=='dict':
            numLeafs += getNumLeaf(secondDict[key])
        else:
            numLeafs += 1
    return numLeafs

#看树的深度
def getTreeDepth(myTree):
    maxDepth = 0
    firstStr = list(myTree.keys())[0]
    secondDict = myTree[firstStr]
    for key in secondDict.keys():
        if type(secondDict[key]).__name__=='dict':
            thisDepth = 1 + getTreeDepth(secondDict[key])
        else:
            thisDepth = 1
        if thisDepth > maxDepth:
            maxDepth = thisDepth
    return maxDepth

def retrieveTree(i):
    listOfTrees =[{'man':{0: 'no', 1: {'woman':{0:'no', 1:'yes'}}}},
                  {'man':{0: 'no', 1: {'woman':{0:{'head':{0:'no',1:'yes'}},1: 'no'}}}}]
    return listOfTrees[i]

 

机器学习与模式识别实验_Anaconda3_Python 第四次实验:Iris 与集成学习 目录 第四次实验:Iris 与集成学习 前言 一、实验内容概述 二、使用步骤 1、检查python以及机器学习的版本是否达到要求,导入一些基础的包,并设置字体、创建图像保存的地址即函数; 2、导入实验要求的iris数据集,按7:3 的比例随机划分为训练集和验证集,随机数生成器种子为学号后三位数(即211),并输出训练集和验证集前10行数据。 3、在训练集上训练决策树模型,生成决策树边界; 4、在训练集上训练Boosting(基学习器:决策树)和随机森林模型 阅读详情

相关推荐

ANN神经网络工程代码(传统的BP神经网络-1个隐藏层)支持VS2017打开

总共三层(一个隐藏层)神经网络,做成了带界面的exe(含c++源码-MFC),界面上可以设置学习率,最大迭代次数等各种参数,如果不会使用,请在留言区留言。可以用来学习神经网络,也可以直接迁移过去商业化。

人工神经网络实战项目(ANN)-机械学习

了解人工神经网络算法的相关概念及含义; 掌握人工神经网络算法求解问题的流程; 能够编写出人工神经网络算法求解某一问题的代码; 能够分析实验结果,对算法进行评估。

gdz0007的博客 637

基于STM32的智能家用节能控制系统设计

该系统可以实时监测家庭的环境参数,如温湿度、光照强度和人体存在情况,根据设定的节能策略自动控制灯光、空调、风扇等家电设备,从而降低不必要的能源消耗。该基于STM32的智能家用节能控制系统通过多种传感器实现了对家庭环境的实时监测,并结合继电器控制模块实现了对家电设备的自动化控制,从而达到节能减排的效果。根据传感器获取的数据,判断是否需要开启或关闭家电设备,从而降低不必要的能源消耗,达到节能的目的。:继电器的控制引脚连接至STM32的GPIO引脚(如PB0、PB1),用于控制灯光、风扇、空调等家电设备的开关。

stm32d1219的博客 1246

深度学习训练落地实战一(ANN)

首先,我们从Excel文件中读取数据集,并将速度列作为预测目标。然后,我们将数据归一化,并分割训练集和测试集。首先,我们需要安装所需的库。然后,我们定义损失函数(MSE损失)和优化器(Adam)以训练模型。在训练过程中,我们会输出每100个epoch的损失值。输入层的大小等于特征数,隐藏层的大小设置为128,输出层的大小设置为1,因为我们只预测一个值(速度)。训练结束后,我们评估模型性能(R2、MSE、MAE值),并绘制图表展示预测值和实际值。接下来,我们构建一个ANN模型,它由一个输入层(

qq_57604887的博客 553

Palantir解密:“本体”的建模逻辑及其扩展方向

上一篇重点从对现实世界建模的角度探讨了“本体”在数字化架构中的核心意义。这里借Palantir的“本体”概念、解析Palantir只是起点,目标旨在以他山之石攻玉——探索数字世界的底层架构逻辑,最终为构建自主体系提供思考。Palantir以“本体论”为核心的建模方案是否代表终极答案,不宜过早下结论,但其思路值得深入剖析。

SZSDQJC的博客 2635

告别倍福开发板:手把手教你用SSC工具为STM32生成EtherCAT从站代码

本文详细介绍了如何使用SSC工具为STM32生成EtherCAT从站代码,帮助开发者在不依赖倍福开发板的情况下实现高效的工业以太网通信。通过SSC工具的配置、XML文件设计、代码移植与硬件适配等步骤,开发者可以轻松构建自定义的EtherCAT通信系统,提升工业自动化项目的灵活性和效率。

weixin_33925615的博客 410

【项目实战】Python基于librosa和人工神经网络实现语音识别分类模型(ANN算法)项目实战

Python基于librosa和人工神经网络实现语音识别分类模型(ANN算法)项目实战

张陈亚的博客 1万+

Day01 Geant4学习

​ 用来记录粒子在每个step中的信息的,例如位置,能量,动量.例如,假设每一个粒子都有一个属于自己的id,会记录自己的轨迹状态信息就是track,当他发生反应时,就会产生新的id。​ 最终在新建的build文件夹中的vis.mac文件中设置,是自带的,如果有更高的需求可以自己去更改,但是一般都是写好的,设置好了图形界面的一些东西,呈现的自己建模的图形界面多大,需不需要网格什么的。从反应到结束的过程,其中也包括它产生的刺激粒子的反应到结束的过程,成为一个事件event。

LXS_357的博客 933

《机器学习》西瓜书课后习题4.3——python实现基于信息熵划分的决策树算法(简单、全面)

《机器学习》西瓜书课后习题4.3——python实现基于信息熵划分的决策树算法 《机器学习》西瓜书P93 4.3 试编程实现基于信息熵进行划分选择的决策树算法,并为表4.3中数据生成一棵决策树。 以下内容是使用sklearn快捷生成的决策树,由于该函数的局限性,所得到的决策树是二叉树,但是也能做到相对正确的分类,同时在敲代码的过程中参考了大量资料和博客,在此文中一并总结了决策树构造所踩的坑和学到的东西,请大家仔细阅读 前言(都是坑、运行代码前务必阅读、理解以下部分并配置好相关的环境) 初识sklearn

NZR的blog 9971

信奥赛csp初赛高频考点【位运算】(详细解析)

信奥赛csp初赛高频考点【位运算】(详细解析)

王老师青少年编程 371

MoveIt 运动学、运动规划、混合规划、move_group

混合规划是运动规划方法的一个术语,它将异构运动规划器结合起来,以产生更稳健或反应更快的解决方案。这种通用方法在导航领域已经非常成熟,并在导航2等流行项目中成功实施。MoveIt 的混合规划架构结合了一对全局规划器和局部规划器,它们以不同的规划速度和问题范围并行、并发运行。全局规划器的任务是解决全局运动规划问题,这与 “感知-规划-行动 ”应用中使用的规划器非常相似。所使用的规划器算法应该是完整的,因此假定其计算时间相对较慢。此外,全局规划器不要求实时安全,这意味着无法保证规划器在特定期限内找到解决方案。

机器人控制与仿真应用 2132

《机器学习实战》Chapter 3 决策树 python3.7代码勘误

《机器学习实战》Chapter 3 决策树 python3.7代码勘误 错误1:TypeError: ‘dict_keys’ object is not subscriptable 这是因为在python3中keys不允许切片,先转List再切片就好了只要将以下几行代码: line14 line24 line46:firstStr = myTree.keys()[0] 改为: firstStr = list(myTree.keys())[0] 即可。 ...

qq_37511129的博客 288

MISRA C 详解 · 专栏06:2023 与 2025 更新总览(相对 2012 的差异)

本专栏 01~05 篇基于(143 规则 + 16 指令)。这六年间标准又前进了两步——(大改)和(微调)。本文补充说明「相对 2012,标准变在哪」,并给出新增规范的代表性示例。

XavierKong的博客 73

机器学习实战--chapter3 决策树

1 大话决策树决策树就是一颗树,每个父节点就是基于特征的一种表示,子节点就是对数据集的再次细分,通过层层细分,得到数据集中每个样本的类别。主要涉及到每层树根的特征的选取策略与递归结束时的处理。当然这里防止层数太多,可以认为限制层数。2 决策树的一般流程 收集数据 准备数据:标称型数据。 分析数据: 训练算法:构造树的数据结构。 测试算法 应用 注:标称型数据:取值有限,适合分类;数值型数据:无限,适

fdtl01的博客 506

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

《机器学习实战》学习笔记 --chapter3 决策树

决策树概论决策树主要是利用了二分法思想和信息论中关于信息增益的定义,并利用递归的方式来建立一颗决策树。 二分法二分法的主要思想就是分而治之,书上有个例子举得很好,举行一个游戏,参与游戏的一方在脑海里想一个事物,其他参与者来向他提问,回答的答案也只能是对或者错,通过这种方式来不断逼近问题。 信息增益这可以说是整个算法的关键之处,定义为: **H(X)=−∑p(x)logp(x)** 通

一只慢慢爬的小蜗牛 675

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

《机器学习》Chapter 4 决策树

《机器学习》Chapter 4 决策树 4.1 基本流程 ​ 决策树是一类常见的机器学习算法,是一种简单但是广泛使用的分类器。顾名思义,决策树基于树结构进行决策。一般的,一颗决策树包含一个根结点、若干个内部结点和若干个叶结点;叶结点对应于决策结果,其他每个结点则对应于一个属性测试;每个结点包含的样本集合根据属性测试的结果被划分到子结点中;根结点包含样本全集。从根结点到每个叶结点的路径对应一个判定测试序列。 ​ 决策树学习的目的是为了产生一颗泛化能力强,即处理未见示例能力强的决策树。 ​ 决策树有两大优点:

NZR的blog 2446

ML (Chapter 4): 决策树 (decision tree)

本文为《机器学习》(周志华) 的读书笔记 参考 南瓜书 目录基本流程划分选择信息增益 (information gain) (ID3)信息熵 (information entropy)条件熵互信息信息增益 (information gain)利用信息增益来进行决策树的划分属性选择增益率 (gain ratio) (C4.5)基尼指数 (Gini index) (CART)剪枝处理 (pruning)预剪枝 (prepruning)后剪枝 (postpruning) 基本流程 顾名思义,决策树是基于树结

连理o的博客 629

python实现决策树可视化

需要注意的是,这里的命令行是根据自己使用的编辑环境而定,例如:如果使用的是python的IDLE进行编写的话,就使用windows的命令行

Time_book的博客 3151

机器学习:鸢尾花数据集8:2划分训练集和测试集,并进行决策树分类算法练习

遇到的问题 解决: https://stackoverflow.com/questions/45890328/sklearn-metrics-for-multiclass-classification

A981012的博客 1万+

大数据机器学习-chapter 7-决策树与随机森林

决策树(Decision Tree)是一种简单但是广泛使用的分类器。通过训练数据构建决策树,可以高效的对未知的数据进行分类。 决策树模型的特点 1、模型具有可读性,分类速度快,推理过程容易理解 2、决策推理过程可以表示成If Then形式 3、可以认为是定义在特征空间与类空间上的条件概率分布 4、推理过程完全依赖于属性变量的取值特点 5、可自动判断属性变量的重要性,忽略对目标变量没有贡献的属性...

莫罗列科夫斯基先生的博客 657

西瓜书_chapter4_决策树

4.1 基本概念 决策树的生成是一个递归的过程,在几种条件下会被终止,一是当前结点下的类别都一样,二是现有属性不能对剩下的样本进行区分,三是当前结点下没有样本。 4.2 划分选择 这一节研究的问题是如何选取上图中第8行的属性 4.2.1 信息增益 一种方法是依据信息熵来对某一属性的各个取值的纯度进行度量。对于一个样本集合DDD,其中第k类样本所占的比例是pkp_kpk​,则信息熵的定义为 Ent...

lirt15的博客 410

Chapter 5 分类算法——决策树与随机森林

决策树与随机森林

qwertyuiop0208的博客 287

《机器学习(周志华)》Chapter4 决策树

决策树算法比较容易理解,在这里简单做一下记录。一、决策树:决策树解决分类问题,简单来说就是依次选择样本属性作为结点,将该样本属性值作为叶子来展开,最终划分出的叶子标记为训练样例数最多的类别。二、划分选择:在选择属性的时候到底改选择哪个属性?这就引出了划分选择,选择出决策树的分支结点所包含的样本尽可能属于同一类别,即结点的“纯度”越来越高,文中介绍了三种方式:信息增益、增益率、基尼指数。1、信息增益...

周博的博客 924

机器学习入门 chapter01

学计算的孩子们对机器学习这个名词应该都不会太陌生吧,多多少少都应该听过机器学习,今天我就带大家来初识一下机器学习。 我们先来看一下机器学习的概念,首先是百度百科: 机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之

u011488028的博客 9046

基于《机器学习》学习整理- chapter 4

基于《机器学习》学习整理- chapter 4@(机器学习)[决策树]基于机器学习学习整理- chapter 4 决策树 信息增益 信息熵 信息增益 实例 基尼系数 剪枝处理 决策树剪枝策略 连续与缺失值 连续值处理 二分法 缺失值处理 多变量决策树决策树 一般地,一个决策树包含一个根节点,若干个内部节点和若干个叶节点,叶结点对应决策结果,其他每个节点对应于一个属性测试,每个结点包含的样本集合根

你不该把世界让给你所鄙视的人。 1113
上一篇: 《机器学习实战》-chapter4-朴素贝叶斯
下一篇: 有关图像修复的经典论文集合
Coding_Ann
博客等级 码龄9年 38粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值