Python24 机器学习之决策树

news2024/11/18 18:21:01

1.什么是机器学习?

机器学习是人工智能(AI)的一个分支,它使计算机系统能够从经验中学习并根据这些学习的数据做出决策或预测,而无需进行明确的编程。简而言之,机器学习涉及算法和统计模型的使用,使计算机能够执行特定任务,通过分析和学习输入数据来提高性能。

主要类型

机器学习通常可以分为以下几种类型:

  1. 监督学习:这是最常见的类型,其中模型通过已标记的训练数据学习。算法试图学习输入数据到输出数据的映射函数。例如,基于一系列的邮件数据(输入),机器学习模型可以学习区分哪些是垃圾邮件,哪些不是(输出)。

  2. 无监督学习:在这种类型中,算法被用来分析和聚类未标记的数据。由于输入数据没有标签,模型试图自己找出数据的结构。这常用于市场细分、社群检测等场景。

  3. 强化学习:在强化学习中,算法通过试错法在特定环境中作出决策,并根据这些决策的结果来学习和调整策略。这是学习优化策略的一种方式,广泛用于游戏、机器人导航等领域。

  4. 半监督学习:这种方法结合了监督学习和无监督学习。使用部分标记的数据训练模型,这种类型的学习用于当获取完全标记的数据成本过高或不可行时。

  5. 自监督学习:这是一种特殊类型的无监督学习,其中模型通过自我生成的标签从数据中学习。

关键技术和算法
  • 神经网络:深度学习的核心技术,模拟人脑的神经元网络来处理复杂的数据结构。

  • 决策树:通过构造决策树来进行分类和回归。

  • 支持向量机(SVM):用于分类和回归的强大方法,它通过找到最佳的决策边界来区分不同的类别。

  • 聚类算法:如 K-means、层次聚类等,用于将数据集中的样本分组。

  • 回归分析:包括线性回归和逻辑回归,用于预测数值型或分类型输出。

应用领域

机器学习已经被广泛应用于多个领域,包括但不限于:

  • 金融行业:用于信用评分、股市预测、欺诈检测等。

  • 医疗领域:用于疾病诊断、医学图像分析、药物发现等。

  • 自动驾驶汽车:通过机器学习进行环境感知、决策制定。

  • 推荐系统:在电商、流媒体服务等平台上个性化推荐内容或产品。

  • 自然语言处理:包括语音识别、机器翻译、情感分析等。

2.机器学习案例

计算给定数据集的香农熵(Shannon entropy)。香农熵是信息论中用来衡量信息的不确定性或混乱度的指标,通常用于分类任务中评估数据集的纯净度。

首先定义一个计算数据集香农熵的函数。

# 计算给定数据的香农熵
from math import log  # 用于计算对数函数
def calShannoEnt(dataSet):  # dataSet 参数是一个列表,其中每个元素也是一个列表,表示数据集中的一个实例
    numEntries=len(dataSet)  # 计算机数据集中的实例总数,也就是矩阵的函数
    labelCounts={}  # 创建一个空字典用来计数数据集中每个类标签的出现次数
    for featVec in dataSet:  #循环遍历数据集中的每个实例(列表)
        currentLabel=featVec[-1]  # 获取每个实例的最后一个元素作为标签(类别)
        if currentLabel not in labelCounts.keys():  # 检查当前标签是否已经在 labelCounts 字典的键中,如果不在,则将其添加
            labelCounts[currentLabel]=0
        labelCounts[currentLabel]+=1  # 增加当前标签的计数
    shannoEnt=0.0  # 香农熵的初始值设为0
    for key in labelCounts:  # 遍历字典中的每个键
        prob=float(labelCounts[key])/numEntries  # 计算当前标签的概率,即该标签出现的次数除以总实例数
        shannoEnt -=prob*log(prob,2)  #根据香农熵的定义,对每个类别标签的概率进行对数运算,并累加到香农熵中
    return shannoEnt

创建一个简单的数据集:

# 创建一个简单的数据集
def createDataSet():
    dataSet=[[1,1,'yes'],
            [1,1,'yes'],
            [1,0,'no'],
            [0,1,'no'],
            [0,1,'no']]
    labels=['no surfacing','flippers']  # 列表包含两个字符串,分别代表数据集中各个特征的名称,这些名称对应于dataSet中每个实例的前两个元素
    return dataSet,labels  # 函数返回两个值,一个是数据集 dataSet,另一个是对应的特征标签列表 labels
myData,label=createDataSet()
myData

# 输出:
'''
[[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
'''

计算香农熵:

calShannoEnt(myData)

# 输出:
'''
0.9709505944546686
'''

尝试增加数据中的类别:

# 添加更多的分类,则熵值越高,混合的数据越多
myData[0][-1]='maybe' # 给第一行最后一个数据赋值
myData

# 输出:
'''
[[1, 1, 'maybe'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
'''

再次计算香农熵,会比之前的值大:

calShannoEnt(myData)

# 输出:
'''
1.3709505944546687
'''

根据数据集中的某个特定特征划分数据集:

# 按照给定特征换分数据集
'''
函数接受三个参数:
dataSet:要被划分的数据集,是一个列表的列表,其中每个内部列表代表数据集中的一个样本
axis:一个整数,指定要检查的特征的索引,这个索引决定了在每个样本中哪一个元素将被用来进行比较
value:与 axis 参数指定的特征进行比较的值,函数将基于此值来划分数据集
'''
def splitDataSet(dataSet,axis,value):
    retDataSet=[]  # 创建一个空列表,用来存储符合条件(特征值等于给定值 value)的样本,但去除了用于划分的特征
    for featVec in dataSet:  # 循环遍历数据集中的每一个样本
        if featVec[axis]==value:  # 检查当前样本的第axis个特征是否等于给定的value
            reducedFeatVec=featVec[:axis]  # 取当前样本从开始到第axis元素之前的部分,不包括axis索引处的元素
            reducedFeatVec.extend(featVec[axis+1:])  # 将当前样本从axis+1索引到末尾的部分扩展到reducedFeatVec中
            retDataSet.append(reducedFeatVec)  # 将处理过的新样本添加到返回的数据集列表
    return retDataSet

splitDataSet(myData,0,1)  # 如果0索引处的数据等于1,则将该实例的数据位于索引0+1至结尾的数据获取
# 输出:
'''
[[1, 'maybe'], [1, 'yes'], [0, 'no']]
'''

尝试不同的函数参数设置:

splitDataSet(myData,0,0)  # # 如果0索引处的数据等于0,则将该实例的数据位于索引0+1至结尾的数据获取
# 输出:
'''
[[1, 'no'], [1, 'no']]
'''

数据划分函数的目的是在给定的数据集中找到最佳的划分特征。该函数是决策树算法中的一个核心步骤,用于选择一个特征,使得按照这个特征划分数据后,信息增益最大,即数据的纯度提高最多。

# 选择最好的数据集划分方式
def chooseBestFeatureToSplit(dataSet):
    numFeatures=len(dataSet[0])-1  # 计算每个样本中的特征数量。减1是因为数据集中的最后一个元素被假定为类标签
    baseEntropy=calShannoEnt(dataSet)  # 计算整个数据集的初始熵,这是决策前数据的不确定性度量
    bestInfoGain=0.0  # 初始化最大信息增益为0
    bestFeature=-1  # 初始化最佳特征的索引为-1,表示还未找到
    for i in range(numFeatures):  #对数据集中的每个特征进行循环
        featList=[example[i] for example in dataSet]  # 提取当前特征i的所有值
        uniqueVals=set(featList)  # 获取当前特征的所有唯一值(因为set容器是集合,不允许有重复元素),这些值将用于分割数据集
        newEntropy=0.0  # 初始化新的熵为0
        for value in uniqueVals:  # 循环遍历每个唯一值
            subDataSet=splitDataSet(dataSet,i,value)  # 根据当前特征i和特征值value划分数据集
            prob=len(subDataSet)/float(len(dataSet))  # 计算划分出的子数据集在原数据集中的比例
            newEntropy+=prob*calShannoEnt(subDataSet)  # 计算加权熵,即当前特征值对应的子数据集的熵乘以其在总数据集中的比例,并累加
        infoGain=baseEntropy-newEntropy  # 计算信息增益,即初始熵减去划分后的熵
        if(infoGain>bestInfoGain):  # 如果当前特征的信息增益大于之前的最大信息增益,则更新最佳特征和最大信息增益
            bestFeature=i
            bestInfoGain=infoGain
    return bestFeature

myDat,labels=createDataSet()
chooseBestFeatureToSplit(myDat)
# 输出:
'''
0
'''

决策树是一种常见的机器学习算法,用于分类和回归任务。它的模型在结构上就像一棵树,包括根节点、内部节点和叶子节点,通过一系列的问题对数据进行分割,从而达到决策的目的。决策树易于理解和实现,数据的准备工作相对简单,不需要太多的数据预处理,如归一化或标准化。

决策树的构建过程是一个递归过程。从数据集的全体样本开始,选择一个最优的分割特征,按照这个特征的不同取值将数据集分割成较小的子集。这个过程在每个生成的子集上重复进行,直到满足停止条件,如子集在当前节点的所有记录都属于同一类别,或者达到预设的最大深度等。

下面的函数majorityCnt()使用多数表决的方式确定一组数据中最常出现的类别。这通常在决策树算法中用于决定叶子节点的分类,特别是当所有特征都已被用于分割数据集,但样本仍然不是纯净的单一类别时。

myDat
# 输出:
'''
[[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
'''
labels
# 输出:
'''
['no surfacing', 'flippers']
'''
# 多数表决决定叶子结点的分类
import operator  # 用于排序操作
def majorityCnt(classList):  # 列表参数包含了一系列分类标签
    classCount={}  # 初始化一个空字典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]
    print(classList)
    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
myDat,labels=createDataSet()
myTree=createTree(myDat,labels)
myTree
# 使用文本注解绘制树节点
import matplotlib.pyplot as plt
decisionNode=dict(boxstyle="sawtooth",fc="0.8")
leafNode=dict(boxstyle="round4",fc="0.8")
arrow_args=dict(arrowstyle="<-")
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 createPlot():
    fig=plt.figure(1,facecolor='white')
    fig.clf()
    createPlot.ax1=plt.subplot(111,frameon=False)
    plotNode('Decision Node',(0.5,0.1),(0.1,0.5),decisionNode)
    plotNode('Leaf Node',(0.8,0.1),(0.3,0.8),leafNode)
    plt.show()
    
createPlot()

图片

以上内容总结自网络,如有帮助欢迎转发,我们下次再见!

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

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

相关文章

ZNB40 矢量网络分析仪

ZNB40 矢量网络分析仪 100kHz至40GHz的宽频率范围&#xff0c;具有四个端口和附加信号发生器 概述 R&SZNB40 提供 100 kHz 至 40 GHz 的宽频率范围&#xff0c;具有四个端口和附加信号发生器。 罗德与施瓦茨带四个端口和附加内部信号源的 40 GHz 中档矢量网络分析仪&…

【C++题解】1715. 输出满足条件的整数5

问题&#xff1a;1715. 输出满足条件的整数5 类型&#xff1a;简单循环 题目描述&#xff1a; 有这样一个四位数,其千位和百位之和为偶数&#xff0c;十位和个位之和为奇数&#xff0c;且前两位之和大于后两位之和&#xff0c;且含有因数 8 &#xff0c;请输出满足上述条件的…

基于weixin小程序校园快递系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;订单管理&#xff0c;快递管理&#xff0c;快递记录管理&#xff0c;公告管理&#xff0c;基础数据管理 小程序功能包括&#xff1a;系统首页&#xff0c;…

【SSM】医疗健康平台-管理端-运营数据报表导出

知识目标 熟悉JasperReports的用法&#xff0c;能够使用JasperReports实现PDF文件导出 掌握Excel方式导出运营数据报表的方法&#xff0c;能够使用Apache POI以Excel方式导出运营数据报表 掌握PDF方式导出运营数据报表的方法&#xff0c;能够使用JasperReports以PDF方式导出运…

SpringCloud Alibaba Sentinel中@SentinelResource使用实践总结

Sentinel 提供了 SentinelResource 注解用于定义资源&#xff0c;并提供了 AspectJ 的扩展用于自动定义资源、处理 BlockException 等。 注意&#xff1a;注解方式埋点不支持 private 方法。 官网地址&#xff1a;注解埋点支持 【1】资源名称限流 ① controller方法 GetMapp…

基于requests模块爬取网易云歌曲评论并制作热词云图(2024七月最新可用,超详细讲解,从零开始完成项目,python爬虫高分大作业)

本实践大作业要求 本次实践大作业主要要求主要包括&#xff1a; 1、选择一个热点或者你感兴趣的主题作为本次爬虫实践作业要完成的任务。 2、为了完成本次任务&#xff0c;需要确定从网上爬取的数据对象与范围。 3、利用python及网络爬虫相关技术实现从网上爬取相应内容数据。 …

煤安防爆手机为什么能在煤矿井下使用

煤安防爆手机之所以能在煤矿井下使用&#xff0c;是因为它们经过特殊设计&#xff0c;符合严格的防爆安全标准&#xff0c;能够防止电火花引发爆炸&#xff0c;同时具备防尘防水、抗冲击等特性&#xff0c;确保在恶劣的煤矿环境中稳定可靠地运行&#xff0c;为工作人员提供安全…

【JavaScript】一键入门

目录 一、JS起源 二、JS特点 三、JS组成部分 四、JS引入方式 一、JS起源 Java Script是由网景公司的Live Script发展而来的一种运行在客户端浏览器上的脚本语言&#xff0c;可以实现网页如文本内容、数据动态变化和动画特效等即浏览器与用户交互的这种体验。 二、JS特点 …

【Java Web】三大域对象

目录 一、域对象概述 二、三大域对象 三、域对象使用相关API 一、域对象概述 一些可用于存储数据和传递数据的对象被称为域对象&#xff0c;根据传递数据范围的不同&#xff0c;我们称之为不同的域&#xff0c;不同的域对象代表不同的域&#xff0c;共享数据的范围也不同。 二、…

更难、更好、更快、更强:LLM Leaderboard v2 现已发布

评估和比较大语言模型 (LLMs) 是一项艰巨的任务。我们 RLHF 团队在一年前就意识到了这一点&#xff0c;当时他们试图复现和比较多个已发布模型的结果。这几乎是不可能完成的任务&#xff1a;论文或营销发布中的得分缺乏可复现的代码&#xff0c;有时令人怀疑&#xff0c;大多数…

华为仓颉编程语言

目录 一、引言 二、仓颉编程语言概述 三、技术特征 四、应用场景 五、社区支持 六、结论与展望 一、引言 随着信息技术的快速发展&#xff0c;编程语言作为软件开发的核心工具&#xff0c;其重要性日益凸显。近年来&#xff0c;华为公司投入大量研发资源&#xff0c;成功…

数据结构-分析期末选择题考点(排序)

何似清歌倚桃李 一炉沈水醉红灯 契子 ✨ 上一期给大家提供了大概会考的题型给老铁们复习的大致思路 这一期还会是一样&#xff0c;我将整理一下排序的题型以及解题方法给你们 由于时间还很多&#xff0c;我就慢慢总结吧&#xff0c;一天一章的样子&#xff0c;明天总结串、后天…

【工具分享】ToolsFx

文章目录 ToolsFx介绍如何安装如何运行运行截图 ToolsFx介绍 基于kotlintornadoFx的跨平台密码学工具箱&#xff0c;包含编解码、编码转换、加解密、哈希、MAC、签名、大数运算、压缩、二维码功能、CTF等实用功能&#xff0c;支持插件。 如何安装 GitHub&#xff1a;https:/…

Java高级重点知识点-16-Map、JDK9新特性

文章目录 Map(java.util)JDK9优化集合 Map(java.util) Collection集合与Map集合的区别 Collection 中的集合&#xff0c;元素是孤立存在的&#xff0c;向集合中存储元素采用一个个元素的方式存储。 Map 中的集合&#xff0c;元素是成对存在的。Collection 中的集合称为单列集…

VS Code准备JAVA环境

背景 由于IntelliJ IDEA是需要激活码的,简单的java demo测试,除了可以直接使用命令行java和javac进行执行, 推荐使用VS code, 其功能比较强大,扩展插件也比丰富,对阅读和书写代码都是比较友好的. JDK环境准备 Linux JDK可以使用Open JDK 11. sudo apt-get install openjdk-1…

企业邮箱客服响应速度哪家好?

在选择企业邮箱的过程中&#xff0c;有一个点很容易被忽略&#xff0c;那就是企业邮箱客服的响应速度。试想&#xff0c;若是出现了邮件发件问题&#xff0c;而不能及时解决处理&#xff0c;可能会给企业带来很大的经济损失。今天就来对比下国内外三款企业邮箱的客服响应速度。…

【JavaScript】事件绑定

目录 一、什么是事件 二、常见事件 2.1 鼠标事件 2.2 键盘事件 2.3 表单事件 2.4 页面加载事件 三、浏览器弹窗三种方式 四、事件绑定函数方式 五、事件触发方式 一、什么是事件 事件就是行为动作。在HTML中事件可以是浏览器的行为&#xff0c;也可以是用户的行为。当这些行为发…

HTML5实现字母记忆配对游戏

HTML5实现字母记忆配对游戏 这个小游戏具有重新开始功能和难度设置功能。 “重新开始“按钮&#xff0c;点击它或完成一局游戏后&#xff0c;会自动开始新游戏。 下拉列表框&#xff0c;&#xff0c;难度设置&#xff0c;包含简单、中等和困难三个选项。 简单&#xff1a;8…

【5G射频基本架构】

平台框架 平台演进及搭配 5G NR频谱 NSA/SA/ENDC

鸿蒙星河NEXT学习笔记

1.1 字符串 // 变量的存储和修改&#xff08;string number boolean&#xff09; // 1. 变量存储 // 1.1 字符串 string 类型 // 注意点1&#xff1a;字符串需要用引号引起来&#xff08;单引双引号&#xff09;字符串 "字符串" // 注意点2&#xff1a;存储的时候&a…