机器学习 -决策树的案例

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

场景

我们对决策树的基本概念和算法其实已经有过了解,那我们如何利用决策树解决问题呢?

构建决策树

数据准备

我们准备了一些数据如下:

# 定义新的数据集
new_dataSet = [
    ['晴朗', '是', '高', '是'],
    ['雨天', '否', '低', '否'],
    ['阴天', '是', '中', '是'],
    ['晴朗', '否', '高', '是'],
    ['晴朗', '是', '低', '否'],
    ['雨天', '是', '高', '否'],
    ['阴天', '否', '中', '是'],
    ['晴朗', '否', '低', '否']
]

这些数据分别是天气,是否闷热,风速和是否出门郊游。
现在要解决的问题是“基于当前的天气和其他条件,我们是否应该进行户外活动?

构建决策树

我们先检查这个数据集类别是否相同:

 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)

def majorityCnt(classList):
    classCount = {}  # 创建一个空字典,用于存储每个元素及其出现次数
    # 遍历传入的列表
    for vote in classList:
        # 如果元素不在字典中,将其加入字典并初始化计数为0
        if vote not in classCount.keys():
            classCount[vote] = 0
        # 对于列表中的每个元素,增加其在字典中的计数
        classCount[vote] += 1

    # 对字典进行排序。这里使用sorted()函数,以字典的值(即元素的计数)作为排序依据。
    # key=operator.itemgetter(1)指定按照字典的值(第二个元素)来排序。
    # reverse=True表示降序排序,即出现次数最多的元素会排在最前面。
    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)

    # 返回出现次数最多的元素。sortedClassCount[0]表示排序后的第一个元素(即出现次数最多的元素),
    # 而sortedClassCount[0][0]则是该元素本身。
    return sortedClassCount[0][0]

显然我们除了类别特征还有其他特征,我们选择最佳特征进行分割,所谓最佳特征,就是说有最高的信息增益的特征,信息增益的解释在上一节中有:
传送门:机器学习-决策树
最佳特征的索引是 2,对应于我们数据集中的 ‘风速’ 特征。这意味着在当前数据集中,'风速’在划分数据集时能提供最大的信息增益。OK

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  # 计算信息增益
        if abs(infoGain) > abs(bestInfoGain):
            bestInfoGain = infoGain  # 更新最佳信息增益
            bestFeature = i  # 更新最佳特征索引
    return bestFeature  # 返回最佳特征的索引

下一步是使用这个特征来分割数据集,并递归地创建决策树。我们将对这个特征的每个唯一值进行分割,并在每个子集上重复此过程。这将形成决策树的不同分支。让我们开始构建决策树。

	bestFeatLabel = labels[bestFeat]
    myTree = {bestFeatLabel:{}}
    del(labels[bestFeat])
    featValues = [example[bestFeat] for example in dataSet]
    uniqueVals = set(featValues)
    for value in uniqueVals:
        subLabels = labels[:]       #copy all of labels, so trees don't mess up existing labels
        myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels)

如果一个特征有多个唯一值,那么 uniqueVals 将包含这些值,决策树的每个分支将对应这些值之一。
通过这些步骤,决策树逐渐在数据集的特征上进行分割,直到所有的数据都被正确分类或没有更多的特征可以用来进一步分割。

最终的决策树应该长这样:

{
    '其他条件2': {
        '低': '否', 
        '中': '是', 
        '高': {
            '天气': {
                '晴朗': '是', 
                '雨天': '否'
            }
        }
    }
}

完整可执行代码

完整的代码如下:


# 计算熵
def calcShannonEnt(dataSet):
    # 统计实例总数
    numEntries = len(dataSet)
    # 字典标签,统计标签出现的次数
    labelCounts = {}
    for data in dataSet:
        # 每个实例的最后一个元素是标签元素
        currentLabel = data[-1]
        if currentLabel not in labelCounts:
            labelCounts[currentLabel] = 0
            # 为当前类别标签的计数加一
        labelCounts[currentLabel] += 1

    # 设置初始熵
    shannonEnt = 0.0  # 初始化熵为0
    for key in labelCounts:
        prob = float(labelCounts[key]) / numEntries  # 计算每个类别标签的出现概率
        shannonEnt -= prob * log(prob, 2)  # 使用香农熵公式计算并累加熵
    return shannonEnt  # 返回计算得到的熵

def majorityCnt(classList):
    classCount = {}  # 创建一个空字典,用于存储每个元素及其出现次数

    # 遍历传入的列表
    for vote in classList:
        # 如果元素不在字典中,将其加入字典并初始化计数为0
        if vote not in classCount.keys():
            classCount[vote] = 0
        # 对于列表中的每个元素,增加其在字典中的计数
        classCount[vote] += 1

    # 对字典进行排序。这里使用sorted()函数,以字典的值(即元素的计数)作为排序依据。
    # key=operator.itemgetter(1)指定按照字典的值(第二个元素)来排序。
    # reverse=True表示降序排序,即出现次数最多的元素会排在最前面。
    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)

    # 返回出现次数最多的元素。sortedClassCount[0]表示排序后的第一个元素(即出现次数最多的元素),
    # 而sortedClassCount[0][0]则是该元素本身。
    return sortedClassCount[0][0]


def splitDataSet(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 = 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 abs(infoGain) > abs(bestInfoGain):
            bestInfoGain = infoGain  # 更新最佳信息增益
            bestFeature = i  # 更新最佳特征索引

    return bestFeature  # 返回最佳特征的索引


def createTree(dataSet,labels):
    classList = [example[-1] for example in dataSet]
    if classList.count(classList[0]) == len(classList):
        return classList[0]#stop splitting when all of the classes are equal
    if len(dataSet[0]) == 1: #stop splitting when there are no more features in dataSet
        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[:]       #copy all of labels, so trees don't mess up existing labels
        myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels)
    return myTree

这是完整的代码,可以试着玩一下,可玩性还是ok的。

结束

决策树的案例到此结束,事实上和IF比较相似。文章来源地址https://www.toymoban.com/news/detail-790547.html

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

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

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

相关文章

  • 决策树的原理、方法以及python实现——机器学习笔记

    * * * * * *  The Machine Learning Noting Series  * * * * * * 决 策树(Decision Tree)是机器学习的核心算法之一,在较小训练样本或有限计算资源下仍有较好表现,它包括分类树和回归树,是目前应用最广泛的分类预测和回归预测方法。 0 引言 1 决策树的概念     分类树     回归树 2  

    2024年02月04日
    浏览(35)
  • AI人工智能中的概率论与统计学原理与Python实战:35. Python实现量子计算与量子机器学习...

    量子计算和量子机器学习是人工智能领域的一个重要分支,它们利用量子物理现象来解决一些传统计算方法无法解决的问题。量子计算的核心是量子比特(qubit),它可以存储多种信息,而不是传统的二进制比特(bit)。量子机器学习则利用量子计算的优势,为机器学习问题提供更

    2024年04月14日
    浏览(45)
  • 【AI】了解人工智能、机器学习、神经网络、深度学习

    一、深度学习、神经网络的原理是什么? 深度学习和神经网络都是基于对人脑神经系统的模拟。下面将分别解释深度学习和神经网络的原理。 深度学习的原理: 深度学习是一种特殊的机器学习,其模型结构更为复杂,通常包括很多隐藏层。它依赖于神经网络进行模型训练和

    2024年02月06日
    浏览(47)
  • AI人工智能 机器学习 深度学习 学习路径及推荐书籍

    人工智能、机器学习和深度学习覆盖的技术范畴是逐层递减的,三者的关系:人工智能 机器学习 深度学习。 人工智能(ArtificialIntelligence,AI)是最宽泛的概念,是研发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学 机器学习(MachineLear

    2023年04月24日
    浏览(41)
  • 【AI】人工智能复兴的推进器之机器学习

    目录 一、机器学习的定义 二、机器学习的发展历程 2.1 萌芽期(20世纪50年代-60年代) 2.2 符号主义时期(20世纪60年代-80年代) 2.3 统计学习时期(20世纪90年代-21世纪初) 2.4 深度学习时期(21世纪初至今) 三、主要算法 3.1 线性回归(Linear Regression) 3.2 K-均值聚类(K-Means C

    2024年02月04日
    浏览(32)
  • 《人工智能算法案例大全:基于Python》——实践AI算法,驭智创新之路

    导语 随着人工智能(AI)技术的飞速发展,AI算法成为推动智能化进程的核心要素。而在这个领域中,一本名为《人工智能算法案例大全:基于Python》的书籍引起了广泛关注。本文将深入探讨这本书所呈现的丰富案例,以及它在实践AI算法、驭智创新之路上的重要作用。 第一

    2024年02月06日
    浏览(37)
  • 数据探索的人工智能与机器学习:如何应用AI技术提高分析效率

    数据探索是数据科学家和机器学习工程师在处理新数据集时所经历的过程。在这个过程中,他们需要理解数据的结构、特征和关系,以便为业务提供有价值的见解。然而,随着数据规模的增加,手动进行这些分析变得越来越困难。因此,人工智能和机器学习技术在数据探索领

    2024年02月20日
    浏览(64)
  • AI概念之人工智能、机器学习和数据挖掘之间的联系与区别

    本文深入探讨人工智能、机器学习和数据挖掘之间的联系与区别,涵盖基础知识、工作流程、需求分析、设计方案、实现步骤、代码示例、技巧与实践、常见问题与解答等内容,旨在帮助读者全面了解这三者之间的异同,并学会如何在实际工作中运用它们。 阅读时长:约30分

    2024年03月12日
    浏览(60)
  • python机器学习数据建模与分析——决策树详解及可视化案例

    你是否玩过二十个问题的游戏,游戏的规则很简单:参与游戏的一方在脑海里想某个事物,其他参与者向他提问题,只允许提20个问题,问题的答案也只能用对或错回答。问问题的人通过推断分解,逐步缩小待猜测事物的范围。决策树的工作原理与20个问题类似,用户输人一系

    2024年02月03日
    浏览(32)
  • 机器学习——决策树的创建

      目录 一、什么是决策树?           1.决策树概念:                   2.决策树实例: 二、决策树构造的ID3算法         1.决策树的构造过程         2.使用ID3算法划分特征 三、实现决策树  四、总结  1.决策树 2.ID3算法 3.此次实验暂时无法将决策树可视化        

    2024年02月08日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包