Python24 机器学习之决策树

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]=0labelCounts[currentLabel]+=1  # 增加当前标签的计数shannoEnt=0.0  # 香农熵的初始值设为0for 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个特征是否等于给定的valuereducedFeatVec=featVec[:axis]  # 取当前样本从开始到第axis元素之前的部分,不包括axis索引处的元素reducedFeatVec.extend(featVec[axis+1:])  # 将当前样本从axis+1索引到末尾的部分扩展到reducedFeatVec中retDataSet.append(reducedFeatVec)  # 将处理过的新样本添加到返回的数据集列表return retDataSetsplitDataSet(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  # 初始化最大信息增益为0bestFeature=-1  # 初始化最佳特征的索引为-1,表示还未找到for i in range(numFeatures):  #对数据集中的每个特征进行循环featList=[example[i] for example in dataSet]  # 提取当前特征i的所有值uniqueVals=set(featList)  # 获取当前特征的所有唯一值(因为set容器是集合,不允许有重复元素),这些值将用于分割数据集newEntropy=0.0  # 初始化新的熵为0for 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=ibestInfoGain=infoGainreturn bestFeaturemyDat,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]=0classCount[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.mzph.cn/pingmian/35976.shtml

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

相关文章

Hugo Barra对Apple Vision Pro 硬件和软件的详细评述

原文&#xff1a;hugo.blog/2024/03/11/vision-pro 这篇文章的作者是Hugo Barra。Hugo Barra曾是Meta公司&#xff08;前身为Facebook&#xff09;旗下Oculus VR/AR团队的负责人。他在2017年至2020年期间领导了Oculus的团队&#xff0c;参与了多个VR头显的开发和发布。Hugo Bar…

使用提示词调教AI

“AI 是我们的数字员工&#xff0c;了解员工的秉性 &#xff0c; 从调教提示词开始。” 网上流传最广的提示词方法论&#xff0c;是“你需要给大模型一个角色”。这确实是一个好的策略&#xff0c;因为小学老师&#xff0c;大学老师这样的角色&#xff0c;预设很多背景信息。这…

【数学建模】 函数极值与规划模型

文章目录 函数极值与规划模型1. 线性代数和线性规划的联系1.1 线性代数的基本概念1.2 线性规划的基本概念1.3 线性代数与线性规划的联系矩阵和向量线性方程组单纯形法内点法凸优化 1.4 例子 2. Numpy有关矩阵运算示例2.1 矩阵的创建2.2 矩阵的基本运算2.3 矩阵的合并2.4 矩阵的…

Linux系统之nice命令的基本使用

Linux系统之nice命令的基本使用 一、nice命令介绍1.1 nice命令简介1.2 进程优先级介绍 二、nice命令基本语法2.1 nice命令的help帮助信息2.2 nice命令选项解释 三、nice命令的基本使用3.1 查看进程优先级3.2 使用nice启动进程3.3 提高优先级 四、注意事项 一、nice命令介绍 1.…

如何制作自己的网站

制作自己的网站可以帮助个人或组织在互联网上展示自己的品牌、作品、产品或服务。随着技术的发展&#xff0c;现在制作网站变得越来越简单。下面是一个简单的步骤指南&#xff0c;帮助你制作自己的网站。 1. 确定你的网站需求和目标 在开始之前&#xff0c;你需要明确你的网站的…

CSS Grid网格布局

一、前言 二、Grid布局 1、基本介绍 2、核心概念 &#xff08;1&#xff09;网格容器 &#xff08;2&#xff09;网格元素 &#xff08;3&#xff09;网格列 &#xff08;4&#xff09;网格行 &#xff08;5&#xff09;网格间距 &#xff08;6&#xff09;网格线 三…

基于PHP的酒店管理系统(改进版)

有需要请加文章底部Q哦 可远程调试 基于PHP的酒店管理系统(改进版) 一 介绍 此酒店管理系统(改进版)基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端jquery插件美化。系统角色分为用户和管理员。系统在原有基础上增加了注册登录注销功能&#xff0c;增加预订房间图片…

Claude走向开放

Claude的愿景一直是创建能够与人们协同工作并显著提升他们工作流程的人工智能系统。朝着这一方向迈进&#xff0c;Claude.ai的专业版和团队版用户现在可以将他们的聊天组织到项目中&#xff0c;将精选的知识和聊天活动整合到一个地方&#xff0c;并且可以让团队成员查看他们与C…

什么是期货基金?

期货基金&#xff0c;是指广大投资者将资金集中起来&#xff0c;委托给专业的期货投资机构&#xff0c;并通过商品交易顾问进行期货投资交易&#xff0c;投资者承担投资风险并享有投资利润的一种集合投资方式。期货基金的投资对象主要有两大类商品&#xff1a;期货与金融期货。…

django学习入门系列之第三点《案例 商品推荐部分》

文章目录 划分区域搭建骨架完整代码小结往期回顾 划分区域 搭建骨架 /*商品图片&#xff0c;父级设置*/ .slider .sd-img{display: block;width: 1226px;height: 460px; }<!-- 商品推荐部分 --> <!--搭建出一个骨架--> <div class"slider"><di…

提高开发效率之——工具介绍

一 . SerialDebug 串口调试工具 SerialDebug 是一个串口调试工具&#xff0c;它主要用于帮助电子工程师和软件开发者进行串口通信的调试工作。以下是 SerialDebug 工具的一些主要作用和特点: 基础串口通信功能&#xff1a;提供打开、关闭、接收、发送数据的基础串口操作。 数…

.NET C# 使用OpenCV实现人脸识别

.NET C# 使用OpenCV实现模型训练、人脸识别 码图~~~ 1 引入依赖 OpenCvSHarp4 - 4.10.0.20240616 OpenCvSHarp4.runtime.win - 4.10.0.20240616 2 人脸数据存储结构 runtime directory | face | {id}_{name} | *.jpg id - 不可重复 name - 人名 *.jpg - 人脸照片3 Demo 3.…

前置章节-熟悉Python、Numpy、SciPy和matplotlib

目录 一、编程环境-使用jupyter notebook 1.下载homebrew包管理工具 2.安装Python环境 3.安装jupyter 4.下载Anaconda使用conda 5.使用conda设置虚拟环境 二、学习Python基础 1.快排的Python实现 (1)列表推导-一种创建列表的简洁方式 (2)列表相加 2.基本数据类型及运…

FastGPT 调用Qwen 测试Hello world

Ubuntu 安装Qwen/FastGPT_fastgpt message: core.chat.chat api is error or u-CSDN博客 参考上面文档 安装FastGPT后 登录&#xff0c; 点击右上角的 新建 点击 这里&#xff0c;配置AI使用本地 ollama跑的qwen模型 问题&#xff1a;树上有3只鸟&#xff0c;开了一枪&#…

使用CDN方式创建Vue3.0应用程序

CDN 的全称是 content delivery network&#xff0c;即内容分发网络。它是构建在现在的互联网基础之上的一层智能虚拟网络&#xff0c;依靠部署在各地的边缘服务器&#xff0c;通过中心平台的负载均衡、内容分发和调度等功能模块&#xff0c;使用户就近获取所需内容&#xff0c…

matlab量子纠缠态以及量子门操作下的量子态

前言 今天我们来聊聊题外话&#xff0c;量子纠缠&#xff0c;在目前物理分支中&#xff0c;要说最深&#xff0c;最能改变人类对宇宙影响的莫过于量子力学了&#xff0c;假如我们可以人为的对两个粒子施加纠缠态&#xff0c;那么我们将可以足不出户的完成对外界的操控 简介 …

《TopFormer: Token Pyramid Transformer for Mobile Semantic Segmentation》

期刊&#xff1a;CVPR 年份&#xff1a;2022 代码&#xff1a;https://github.com/hustvl/TopFormer 摘要 尽管视觉Transformer(ViTs)在计算机视觉领域取得了巨大的成功&#xff0c;但沉重的计算成本阻碍了它们在密集预测任务中的应用&#xff0c;如移动设备上的语义分割。…

Superagent:一个开源的AI助手框架与API

在人工智能日益普及的今天,如何将AI助手无缝集成到应用中成为了开发者们关注的焦点。今天,我们要介绍的Superagent正是一个为这一需求量身打造的开源框架与API。它结合了LLM、检索增强生成(RAG)和生成式AI技术,为开发者们提供了一个强大而灵活的解决方案。 一、Superagen…

电阻屏和电容屏

目录 一、电阻屏 1.欧姆定律 2.电阻屏原理 &#xff08;1&#xff09;测量 X 坐标 &#xff08;2&#xff09;测量 Y 坐标 3.电阻屏数据 二、电阻屏 1.原理 2.电容屏数据 &#xff08;1&#xff09;Type A &#xff08;2&#xff09;Type B 3.电容屏的实验数据 一、…

实战案例:如何用ChatGPT生成适合不同领域的高质量文章

随着人工智能技术的飞速发展&#xff0c;生成高质量文章已经不再是难题。特别是OpenAI开发的ChatGPT&#xff0c;更是为写作工作带来了极大的便利。那么&#xff0c;如何用ChatGPT生成适合不同领域的高质量文章呢&#xff1f;本文将通过实战案例&#xff0c;为大家详细讲解这一…