机器学习——决策树的创建

这篇具有很好参考价值的文章主要介绍了机器学习——决策树的创建。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 

目录

一、什么是决策树?

          1.决策树概念:   

               2.决策树实例:

二、决策树构造的ID3算法

        1.决策树的构造过程

        2.使用ID3算法划分特征

三、实现决策树

 四、总结

 1.决策树

2.ID3算法

3.此次实验暂时无法将决策树可视化


一、什么是决策树?

          1.决策树概念:   

       简单来说决策树就是一棵树,一颗决策树包含一个根节点若干个内部结点若干个叶结点,叶结点就是问题的决策结果。也就是说一棵树包括根节点、父节点、子节点、叶子节点。子节点由父节点分裂出来,然后子节点作为新的父节点继续分裂,直到得出最终结果。

机器学习——决策树的创建

               2.决策树实例:

           假设给了一个动物的名字它的一些特征,然后我们需要根据这些特征来判断这个动物是否属于哺乳动物。

动物名称 体温 呼吸 胎生 毛发 哺乳动物
恒温
冷血

             决策树如下

机器学习——决策树的创建

二、决策树构造的ID3算法

        1.决策树的构造过程

动物名称 食物 体温 呼吸方式 胎生 毛发 生活环境 哺乳动物
老虎 肉食 恒温 草原
肉食 冷血 森林
杂食 冷血 水里
恒温 草原
长颈鹿 恒温 草原
熊猫 杂食 恒温 森林
大像 恒温 森林
青蛙 冷血 水里
乌龟 冷血 水里
蓝鲸 恒温 水里

第一步:将所有的特征看成一个个节点。(特征:体温,呼吸方式,胎生,毛发等)

第二步:遍历当前特征的子节点,找到最适合的划分点。计算划分之后所有子节点的纯度信息。(比如:体温这个特征按照恒温和冷血来划分)

第三步:使用第二步遍历所有特征,选出该特征最优的划分方式,得出最终的子节点。

 上述决策过程存在两个问题:

  1.应该选择哪一个特征最适合划分?

  2.什么时候停止划分?

        2.使用ID3算法划分特征

        信息熵:熵(entropy)表示混乱程度,熵越大,越混乱。假设有一个集合D,其中有X个随机变量,其中第i个元素在集合中出现的概率为Pi。

      其中pi表示类i的数量占比。假设二分类问题A,B两类,如果A的数量等于B的数量,那么分类节点的纯度就会达到最低,熵等于1,只有当节点的信息都属于A类或者是B类时,熵=1。 

        信息增益:(ingormation gain),表示已知A的特征信息,而使得B类信息的不确定性降低的程度。计算公式如下:

      对于一个数据集,将所有的特征属性进行划分操作,之后将划分操作的结果集的纯度进行比较,选择纯度高的特征属性作为当前的划分节点。

三、实现决策树

 1.建立数据集:每行数据代表一个样本,每个样本的前6个数据代表6个特征,第7个数据代表样本的分类。下面的标签表示每个样本的这6个特征分别是啥,创建的这六个样本分别是老虎,蛇,鱼,羊,熊猫和蓝鲸。

def createDataSet():
    dataSet = [[0,0,0,0,0,0,'是'],
               [1,1,1,1,0,1,'否'],
               [1,1,1,1,1,2,'否'],
               [0,0,0,0,2,0,'是'],
               [0,0,0,1,2,1,'是'],
               [0,0,0,1,0,2,'是']]
    #(0恒温,1冷血),(0肺,1腮),(0胎生,1非胎生),(0有毛发,1无毛发)
    #(0肉食,1杂食,2草),(0草原,1森林,2水里)
    labels = ['体温','呼吸方式','胎生','毛发','食物','生活环境']
    return dataSet, labels

2.根据公式计算信息熵:featVec[-1]表示每个样本中的数据的最后一个数据的值,也就是“是”和“否”两个类别。

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 * math.log(prob,2)   #信息增益计算熵
    return shannonEnt

 3.按类别划分数据集:

def splitDataSet(dataSet,axis,value):
    retDataSet = []
    for featVec in dataSet:
        if featVec[axis] == value:  #开始遍历数据集
            #featVec 是一维数组,下标为axis元素之前的值加入到reducedFeatVec
            reducedFeatVec = featVec[:axis]
            #下一行的内容axis+1之后的元素加入到reducedFeatVec
            reducedFeatVec.extend(featVec[axis+1:])
            retDataSet.append(reducedFeatVec)
    #返回划分好后的数据集
    return retDataSet

4.选择最后的数据特征作为划分标准:dataSet[0]代表第一个样本,[0,0,0,0,0,0,'是'],长度为7, 7-1=6,6表示该样本的特征数。

def chooseBestFeatureToSplit(dataSet):
    numFeatures = len(dataSet[0]) - 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
        print("第%d个特征的信息增益为%.1f"%(i,infoGain))
        if (infoGain > bestInfoGain):  #选出最大的信息增益
            bestInfoGain = infoGain
            bestFeature = i
    return bestFeature

5.存储:用 字典储存统计出的每个属性)的各个值出现的次数

def majorityCnt(classList):
    classCount={}
    for vote in classList:
        if vote not in classCount.keys(): classCount[vote] = 0
        classCount[vote] += 1
        sortedClassCount = sorted(classCount.iteritems(),  key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]

 6.最后一步,创建树:

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]
    uniqueVals = set(featValues)
    for value in uniqueVals:
        subLabels = labels[:]
        #对每个特征集递归调用建树方法
        myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels)
    return myTree

7.结果:存在问题,当计算信息增益保留1位和保留4位小数时,前3个特征的信息增益无法比较,也就是说可以直接根据这个动物的体温直接判断这个动物是哺乳动物还是非哺乳动物,或者是胎生和毛发也可以确定这个动物是否是哺乳动物。出现这个情况的原因应该是数据样本数量较少,还有ID3这个算法的原因。

机器学习——决策树的创建

 机器学习——决策树的创建

8.完整代码:

import math
import operator
import numpy as np
from numpy import tile


def createDataSet():
    dataSet = [[0,0,0,0,0,0,'是'],
               [1,1,1,1,0,1,'否'],
               [1,1,1,1,1,2,'否'],
               [0,0,0,0,2,0,'是'],
               [0,0,0,1,2,1,'是'],
               [0,0,0,1,0,2,'是']]
    #(0恒温,1冷血),(0肺,1腮),(0胎生,1非胎生),(0有毛发,1无毛发)
    #(0肉食,1杂食,2草),(0草原,1森林,2水里)
    labels = ['体温','呼吸方式','胎生','毛发','食物','生活环境']
    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 * math.log(prob,2)   #信息增益计算熵
    return shannonEnt


def splitDataSet(dataSet,axis,value):
    retDataSet = []
    for featVec in dataSet:
        if featVec[axis] == value:  #开始遍历数据集
            #featVec 是一维数组,下标为axis元素之前的值加入到reducedFeatVec
            reducedFeatVec = featVec[:axis]
            #下一行的内容axis+1之后的元素加入到reducedFeatVec
            reducedFeatVec.extend(featVec[axis+1:])
            retDataSet.append(reducedFeatVec)
    #返回划分好后的数据集
    return retDataSet

def chooseBestFeatureToSplit(dataSet):
    numFeatures = len(dataSet[0]) - 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
        print("第%d个特征的信息增益为%.4f"%(i,infoGain))
        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(),  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]
    uniqueVals = set(featValues)
    for value in uniqueVals:
        subLabels = labels[:]
        #对每个特征集递归调用建树方法
        myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels)
    return myTree



if __name__ == '__main__':

    myDat,labels = createDataSet()
    print(createTree(myDat, labels))

 四、总结

 1.决策树

优点:易于理解和解释,决策树分类很快,可以处理不相关特征数据。

缺点: 对缺失数据的数据集处理困难。它构建过程是一个递归的过程,需要确定停止条件,否则过程将不会结束。很容易出现过拟合问题。

2.ID3算法

 ID3只适合在小规模数据集上使用。

3.此次实验暂时无法将决策树可视化

原因:plt.的安装包出现问题。 文章来源地址https://www.toymoban.com/news/detail-475087.html

到了这里,关于机器学习——决策树的创建的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器学习:什么是分类/回归/聚类/降维/决策

    目录 学习模式分为三大类:监督,无监督,强化学习 监督学习基本问题 分类问题 回归问题 无监督学习基本问题 聚类问题 降维问题 强化学习基本问题 决策问题 如何选择合适的算法 我们将涵盖目前「五大」最常见机器学习任务: 回归 分类 聚类 降维 决策 分类是监督学习

    2024年02月12日
    浏览(44)
  • (统计学习方法|李航)第五章决策树——四五节:决策树的剪枝,CART算法

    目录 一,决策数的剪枝 二,CART算法 1.CART生成 (1)回归树的生成 (2)分类树的生成          2.CART剪枝 (1)剪枝,形成一个子树序列 (2)在剪枝得到的子树序列T0,T1-----,Tn中通过交叉验证选取最优子树Ta   好的决策树不高不宽     柳建男的”后剪枝“挥手创作   如果

    2024年02月14日
    浏览(44)
  • 2023年数学建模随机森林:基于多个决策树的集成学习方法

    目录 目录 1. 什么是随机森林? 2. 随机森林的优缺点 3. 随机森林的构建过程

    2024年02月08日
    浏览(39)
  • 什么是机器学习?监督学习的定义、概率论的基本概念以及模型选择、过拟合与欠拟合的问题。常见的监督学习算法,包括朴素贝叶斯(Naive Bayes)、决策树(Decision Tree)支持向量机随机森林

    作者:禅与计算机程序设计艺术 什么是机器学习?从定义、发展历程及目前的状态来看,机器学习由3个主要分支组成:监督学习(Supervised Learning),无监督学习(Unsupervised Learning)和强化学习(Reinforcement Learning)。这三类学习都可以使计算机系统根据输入数据自动分析和改

    2024年02月09日
    浏览(52)
  • 决策树剪枝:解决模型过拟合【决策树、机器学习】

    决策树是一种强大的机器学习算法,用于解决 分类 和 回归 问题。决策树模型通过树状结构的决策规则来进行预测,但在构建决策树时,常常会出现过拟合的问题,即模型在训练数据上表现出色,但在未见过的数据上表现不佳。 过拟合的威胁 在机器学习中, 过拟合 是一个

    2024年02月07日
    浏览(46)
  • 机器学习模型—决策树

    决策树是最强大和最流行的算法之一。Python 决策树算法属于监督学习算法的范畴。它适用于连续输出变量和分类输出变量也就是可以处理分类和回归任务。在本文中,我们将在 UCI 上提供平 衡秤体重和距离数据 库上用 Python 算法实现决策树。 决策树算法,是模拟人们做决策

    2024年03月14日
    浏览(84)
  • 机器学习 | 决策树算法

    1、树模型         决策树:从根节点开始一步步走到叶子节点(决策)。所有的数据最终都会落到叶子节点, 既可以做分类也可以做回归。         在分类问题中,表示基于特征对实例进行分类的过程,可以认为是if-then的集合,也可以认为是定义在特征空间与类空间上

    2024年02月07日
    浏览(44)
  • 经典机器学习算法——决策树

    优质博文:IT-BLOG-CN 树模型是机器学习中最常用的一类模型,包括随机森林、AdaBoost、GBDT(XGBoost和Lightgbm)等,基本原理都是通过集成弱学习器的即式来进一步提升准确度。这里的弱学习器包括线性模型和决策树模型,本期介绍的就是决策树模型(DecisionTree)。 决策树属于有

    2024年04月29日
    浏览(37)
  • python机器学习——决策树

    ExtraTreeRegressor 和 DecisionTreeRegressor 是scikit-learn库中的两种回归模型,用于 拟合和预测连续型 目标变量。 决策树是一种基于树结构的机器学习算法,用于 解决分类和回归问题 。它通过 对数据的特征进行一系列判断和分支,逐步将数据集划分成不同的子集 ,最终得到一个基于

    2024年02月05日
    浏览(37)
  • 【机器学习笔记】8 决策树

    决策树是从训练数据中学习得出一个树状结构的模型。 决策树属于判别模型。 决策树是一种树状结构,通过做出一系列决策(选择)来对数据进行划分,这类似于针对一系列问题进行选择。决策树的决策过程就是从根节点开始,测试待分类项中对应的特征属性,并按照其值

    2024年02月20日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包