决策树(Decison Tree)—有监督学习方法、概率模型、生成模型、非线性模型、非参数化模型、批量学习

news/2024/9/18 15:28:39/ 标签: 人工智能, 机器学习, 决策树, DecisionTree

定义

ID3算法
输入:训练数据集(T= { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x N , y N ) } \left\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\right\} {(x1,y1),(x2,y2),,(xN,yN)}),特征集A阀值 ε \varepsilon ε

输出:决策树T

(1)若D中所有实例属于同一类 C k C_k Ck,则T为单节点树,并将 C k C_k Ck作为该节点的类标记,返回T;

(2)若A= ∅ \varnothing ,则T为单节点树,并将D中实例数最大的类 C k C_k Ck作为该节点的类标记,返回T;

(3)否则,需要计算A中各特征对D的信息增益,选择信息增益最大的特征 A g A_g Ag

(4)如果 A g A_g Ag的信息增益小于阀值 ε \varepsilon ε,则置T为单节点树,并将D中实例数最大的类 C k C_k Ck作为该节点的类标记,返回T;

(5)否则,对 A g A_g Ag的每一可能值 a i a_i ai,依 A g = a i A_g=a_i Ag=ai将D分割为若干非空子集 D i D_i Di,将 D i D_i Di中实例最大的类作为标记,构建子节点,由节点及其子节点构成树T,返回T;

(6)对第i个字节点,以 D i D_i Di为训练集,以 A − A g A-{A_g} AAg为特征集,递归地调用步骤(1)~(5),得到子树 T i T_i Ti,返回 T i T_i Ti

输入空间

T= { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x N , y N ) } \left\{(x_1,y_1),(x_2,y_2),\dots,(x_N,y_N)\right\} {(x1,y1),(x2,y2),,(xN,yN)}

import numpy as npdef loadData(fileName,lines=60000):'''加载文件:param fileName:要加载的文件路径 下载地址:https://download.csdn.net/download/nanxiaotao/89720991):return: 数据集和标签集'''#存放数据及标记dataArr = []; labelArr = []#读取文件fr = open(fileName)#遍历文件中的每一行for line in fr.readlines():curLine = line.strip().split(',')dataArr.append([int(int(num) > 128) for num in curLine[1:]])labelArr.append(int(curLine[0]))#返回数据集和标记return dataArr, labelArr
# 获取训练集
trainDataList, trainLabelList = loadData('../Mnist/mnist_train.csv')
np.shape(trainDataList)
Epsilon = 0.1

特征空间(Feature Space)

trainDataList[0][0:784]

统计学习方法

模型

决策树 T T T

策略

m a x ( g ( D , A ) ) max(g(D,A)) max(g(D,A))

算法

H ( D ) = − ∑ k = 1 K ∣ C k ∣ ∣ D ∣ l o g 2 ∣ C k ∣ ∣ D ∣ H(D)=-\sum_{k=1}^K \dfrac{ \left| C_k \right| }{ \left| D \right|}log_2 \dfrac{ \left| C_k \right| }{ \left| D \right|} H(D)=k=1KDCklog2DCk

def calc_H_D(trainLabelArr):'''计算数据集D的经验熵:param trainLabelArr:当前数据集的标签集:return: 经验熵'''#初始化为0H_D = 0trainLabelSet = set([label for label in trainLabelArr])#遍历每一个出现过的标签for i in trainLabelSet:p = trainLabelArr[trainLabelArr == i].size / trainLabelArr.size#对经验熵的每一项累加求和H_D += -1 * p * np.log2(p)#返回经验熵return H_D

H ( D ∣ A ) = ∑ i = 1 n ∣ D i ∣ ∣ D ∣ H ( D i ) H(D|A)=\sum_{i=1}^n \dfrac{ \left| D_i \right| }{ \left| D \right|}H(D_i) H(DA)=i=1nDDiH(Di)

def calcH_D_A(trainDataArr_DevFeature, trainLabelArr):'''计算经验条件熵:param trainDataArr_DevFeature:切割后只有feature那列数据的数组:param trainLabelArr: 标签集数组:return: 经验条件熵'''#初始为0H_D_A = 0#在featue那列放入集合中,是为了根据集合中的数目知道该feature目前可取值数目是多少trainDataSet = set([label for label in trainDataArr_DevFeature])#对于每一个特征取值遍历计算条件经验熵的每一项for i in trainDataSet:#计算H(D|A)#trainDataArr_DevFeature[trainDataArr_DevFeature == i].size / trainDataArr_DevFeature.size:|Di| / |D|#calc_H_D(trainLabelArr[trainDataArr_DevFeature == i]):H(Di)H_D_A += trainDataArr_DevFeature[trainDataArr_DevFeature == i].size / trainDataArr_DevFeature.size \* calc_H_D(trainLabelArr[trainDataArr_DevFeature == i])#返回得出的条件经验熵return H_D_A

g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D)-H(D|A) g(D,A)=H(D)H(DA)

m a x ( g ( D , A ) ) max(g(D,A)) max(g(D,A))

def majorClass(labelArr):'''找到当前标签集中占数目最大的标签:param labelArr: 标签集:return: 最大的标签'''#建立字典,用于不同类别的标签技术classDict = {}#遍历所有标签for i in range(len(labelArr)):if labelArr[i] in classDict.keys():# 若在字典中存在该标签,则直接加1classDict[labelArr[i]] += 1else:#若无该标签,设初值为1,表示出现了1次了classDict[labelArr[i]] = 1#对字典依据值进行降序排序classSort = sorted(classDict.items(), key=lambda x: x[1], reverse=True)#返回最大一项的标签,即占数目最多的标签return classSort[0][0]
def getSubDataArr(trainDataArr, trainLabelArr, A, a):'''更新数据集和标签集:param trainDataArr:要更新的数据集:param trainLabelArr: 要更新的标签集:param A: 要去除的特征索引:param a: 当data[A]== a时,说明该行样本时要保留的:return: 新的数据集和标签集'''#返回的数据集retDataArr = []#返回的标签集retLabelArr = []#对当前数据的每一个样本进行遍历for i in range(len(trainDataArr)):#如果当前样本的特征为指定特征值aif trainDataArr[i][A] == a:#那么将该样本的第A个特征切割掉,放入返回的数据集中retDataArr.append(trainDataArr[i][0:A] + trainDataArr[i][A+1:])#将该样本的标签放入返回标签集中retLabelArr.append(trainLabelArr[i])#返回新的数据集和标签集return retDataArr, retLabelArr
def calcBestFeature(trainDataList, trainLabelList):'''计算信息增益最大的特征:param train_dataSet: 数据集:return: 信息增益最大的特征及最大信息增益值'''#将数据集和标签集转换为数组形式trainDataArr = np.array(trainDataList)trainLabelArr = np.array(trainLabelList)#获取当前特征数目,也就是数据集的横轴大小featureNum = trainDataArr.shape[1]#初始化最大信息增益maxG_D_A = -1#初始化最大信息增益的特征maxFeature = -1#1.计算数据集D的经验熵H(D)H_D = calc_H_D(trainLabelArr)#对每一个特征进行遍历计算for feature in range(featureNum):trainDataArr_DevideByFeature = np.array(trainDataArr[:, feature].flat)#计算信息增益G_D_A = H_D - calcH_D_A(trainDataArr_DevideByFeature, trainLabelArr)#不断更新最大的信息增益以及对应的featureif G_D_A > maxG_D_A:maxG_D_A = G_D_AmaxFeature = featurereturn maxFeature, maxG_D_A

创建决策树 T T T

def createTree(*dataSet):'''递归创建决策树:param dataSet:return:新的子节点或该叶子节点的值'''trainDataList = dataSet[0][0]trainLabelList = dataSet[0][1]classDict = {i for i in trainLabelList}if len(classDict) == 1:return trainLabelList[0]if len(trainDataList[0]) == 0:#返回当前标签集中占数目最大的标签return majorClass(trainLabelList)Ag, EpsilonGet = calcBestFeature(trainDataList, trainLabelList)#如果Ag的信息增益比小于阈值Epsilon,则置T为单节点树,并将D中实例数最大的类Ck#作为该节点的类,返回Tif EpsilonGet < Epsilon:return majorClass(trainLabelList)#否则,对Ag的每一可能值ai,依Ag=ai将D分割为若干非空子集Di,将Di中实例数最大的# 类作为标记,构建子节点,由节点及其子节点构成树T,返回TtreeDict = {Ag:{}}#特征值为0时,进入0分支#getSubDataArr(trainDataList, trainLabelList, Ag, 0):在当前数据集中切割当前feature,返回新的数据集和标签集treeDict[Ag][0] = createTree(getSubDataArr(trainDataList, trainLabelList, Ag, 0))treeDict[Ag][1] = createTree(getSubDataArr(trainDataList, trainLabelList, Ag, 1))return treeDict
# 获取测试集
testDataList, testLabelList = loadData('../Mnist/mnist_test.csv')#创建决策树
tree = createTree((trainDataList, trainLabelList))
print('tree is:', tree)

假设空间(Hypothesis Space)

{ f ∣ f ( x ) = m a x ( g ( D , A ) ) } \left\{f|f(x) = max(g(D,A)) \right\} {ff(x)=max(g(D,A))}

输出空间

y {\tt y} y = { c 1 , c 2 , ⋯ , c k } = \{c_1,c_2,\cdots,c_k \} ={c1,c2,,ck}

模型评估

训练误差(Training Error)

testDataList, testLabelList = loadData('../Mnist/mnist_test.csv')
np.shape(testDataList)
def predict(testDataList, tree):'''预测标签:param testDataList:样本:param tree: 决策树:return: 预测结果'''while True:(key, value), = tree.items()#如果当前的value是字典,说明还需要遍历下去if type(tree[key]).__name__ == 'dict':dataVal = testDataList[key]del testDataList[key]tree = value[dataVal]if type(tree).__name__ == 'int':#返回该节点值,也就是分类值return treeelse:#如果当前value不是字典,那就返回分类值return value
def model_test(testDataList, testLabelList, tree):'''测试准确率:param testDataList:待测试数据集:param testLabelList: 待测试标签集:param tree: 训练集生成的树:return: 准确率'''errorCnt = 0for i in range(len(testDataList)):if testLabelList[i] != predict(testDataList[i], tree):errorCnt += 1#返回准确率return 1 - errorCnt / len(testDataList)
accur = model_test(testDataList, testLabelList, tree)
print('the accur is:', accur)

测试误差(Test Error)

模型选择

过拟合

正则化

泛化能力


http://www.ppmy.cn/news/1524616.html

相关文章

日志框架log4j打印异常堆栈信息携带traceId,方便接口异常排查

一、异常堆栈无traceId 排查定位问题异常痛苦 在日常项目开发中&#xff0c;我们会自定义一个traceId方便&#xff0c;链路追踪。在log4j2.xml 我们可能是这样去配置日志打印格式。 <Console name"CONSOLE" target"SYSTEM_OUT"><PatternLayoutpa…

大腾智能出席龙华云创中心启动与鸿蒙园揭牌仪式

在数字化转型的浪潮中&#xff0c;深圳市龙华区再次引领行业创新&#xff0c;携手华为云成功举办“龙华工业软件云工程应用创新中心启动仪式暨鸿蒙产业园揭牌仪式”&#xff0c;本次盛会已于8月26日圆满落幕。活动现场&#xff0c;来自全国各地的行业精英、企业领袖及专家学者汇…

基于SpringBoot+Vue+MySQL的滑雪场管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 在快速发展的冰雪运动热潮下&#xff0c;为了提升滑雪场的管理效率与顾客体验&#xff0c;我们设计并实现了一套基于SpringBoot后端框架、Vue前端框架以及MySQL数据库的滑雪场管理系统。该系统旨在通过数字化手段&#xff0c;优…

web框架

1. Web框架: 1.1Web框架定义&#xff1a; Web框架是一个用于构建Web应用程序的软件框架&#xff0c;它提供了一套完整的开发工具和库&#xff0c;以简化Web应用的开发过程。Web框架通常实现了HTTP协议、路由机制、模板渲染、数据验证、数据库操作等常用功能。 1.2Web框架与数…

苹果三款Mac新品十月登场:标配M4系列芯片

Mark Gurman爆料&#xff0c; 苹果将在10月推出14和16英寸MacBook Pro、Mac mini和iMac等设备&#xff0c;标配M4系列芯片。 据悉&#xff0c;苹果Mac新品搭载的M4芯片有两种版本&#xff0c;一种是10核CPU10核GPU&#xff0c;一种是8核CPU8核GPU。 值得注意的是&#xff0c;以…

如何将网络安全防范游戏化

组织对威胁的准备和恢复能力跟不上网络犯罪分子的进步。 一些首席执行官仍然认为网络安全需要偶尔干预&#xff0c;而不是持续关注。 但对于许多公司来说&#xff0c;情况并非如此&#xff1b;网络威胁准备需要协调一致的培训工作&#xff0c;因此网络安全团队在攻击发生时已…

Qt对话框布局调整

Qt 基础: 在"main.cpp" 文件的开始部分加入以下头文件&#xff1a; #include<Qsplitter> #include<QTextEdit> #include<QTextCodec> 停靠窗口QDockWidget 类: 停靠窗口QDockWidget 类也是在应用程序中经常用到的&#xff0c;设置停靠窗口的…

18 Python如何操作文件?

本篇是 Python 系列教程第 18 篇&#xff0c;更多内容敬请访问我的 Python 合集 1 打开文件 通常使用内置的 open(文件路径, 模式, encoding"utf-8")函数。 文件路径&#xff1a;可以是相对路径或绝对路径。模式&#xff1a;&#xff08;可选&#xff09;决定了文件…

【mysql】mysql修改sql_mode之后无法启动

现象&#xff1a;修改后mysql无法启动&#xff0c;不报错 原因&#xff1a;MySQL在8以后sql_mode已经取消了NO_AUTO_CREATE_USER这个关键字。去掉这个关键字后&#xff0c;启动就可以了 修改前&#xff1a; sql_modeSTRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR…

AI prompt(提示词)

# 好用的用于学习的AI提示词 ## 费曼学习法 请使用费曼学习法&#xff0c;用简单的语言解释&#xff08;量子力学&#xff09;是什么&#xff0c;并提供一个简单的例子来说明它如何应用 ## 帕累托法则&#xff08;80/20原则&#xff09; 将&#xff08;量子力学&#xff09;最…

基于亲和性的 GPU 容器绑核策略 Copy

1.引言 在高性能计算和大规模并行任务处理中&#xff0c;GPU已经成为不可或缺的加速器。为了充分发挥GPU的计算能力&#xff0c;通过合理分配CPU核与GPU的绑定来优化CPU和GPU的关系至关重要。我们将探讨socket和NUMA&#xff08;非统一内存访问&#xff09;的概念&#xff0c;并…

如何安全,高效,优雅的提升linux的glibc版本

如何安全&#xff0c;高效&#xff0c;优雅的提升linux的glibc版本 一、发现问题二、升级glibc版本1. 下载对应的软件包2. 解压软件包3. 查看新版本glibc安装要求&#xff0c;并查看自己版本是否符合需求4. 升级python版本4.1 下载软件包4.2 解压4.3 编译4.4 确认更新后的pytho…

最佳实践-模板设计模式

目录 一、什么是设计模式 二、模板设计模式-介绍 三、模板设计模式-最佳实践 1、开发需求 2、使用传统的方法来解决 3、优化-使用模板设计模式来解决 一、什么是设计模式 1&#xff09;设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题…

计算机毕业设计PySpark+Django深度学习游戏推荐系统 游戏可视化 游戏数据分析 游戏爬虫 Scrapy 机器学习 人工智能 大数据毕设

在撰写《PySparkDjango深度学习游戏推荐系统》的开题报告时&#xff0c;建议包括以下内容&#xff1a; ### 1. 研究背景与意义 在数字娱乐行业中&#xff0c;游戏推荐系统成为提升用户体验的关键工具。现有的推荐系统大多基于用户行为数据进行推荐&#xff0c;但随着数据量的急…

php实现Socket 编程

在PHP中&#xff0c;Socket编程主要使用一系列内置函数来实现。下面通过一个简单的TCP服务器和客户端的例子来演示如何使用PHP进行Socket编程。 PHP中的Socket函数 PHP 提供了一些用于Socket编程的函数&#xff0c;包括&#xff1a; socket_create()&#xff1a;创建一个新的…

装杯 之 Linux 指令1

hello&#xff0c;欢迎来到linux世界&#xff0c;在害没有学习linux时&#xff0c;看到别人操作&#xff0c;网课&#xff0c;真高级&#xff0c;感觉好厉害&#xff0c;就是说白了&#xff0c;看起来牛逼。ok&#xff0c;接下来&#xff0c;请大佬们进入linux之旅。 1.ls指令…

淘宝/天猫按图搜索淘宝商品(拍立淘) API 返回值说明

item_search_img-按图搜索淘宝商品&#xff08;拍立淘&#xff09; taobao.item_search_img 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中…

kubeadm 初始化 k8s 证书过期解决方案

概述 在使用 kubeadm 初始化的 Kubernetes 集群中&#xff0c;默认情况下证书的有效期为一年。当证书过期时&#xff0c;集群中的某些组件可能会停止工作&#xff0c;导致集群不可用。本文将详细介绍如何解决 kubeadm 初始化的 Kubernetes 集群证书过期的问题&#xff0c;并提…

数据结构之红黑树的 “奥秘“

目录&#xff1a; 一.红黑树概念 二. 红黑树的性质 三.红黑树的实现 四.红黑树验证 五.AVL树和红黑树的比较 一.红黑树概念 1.红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何 一条从根…

小阿轩yx-Zabbix企业级分布式监控环境部署

小阿轩yx-Zabbix企业级分布式监控环境部署 前言 “运筹帷幄之中&#xff0c;决胜千里之外”监控在 IT 运维中占据着重要地位&#xff0c;按比例说占 30% 也不为过在监控系统开源软件中有很多可选择的工具&#xff0c;但是真正符合要求的、能够真正解决业务问题的监控系统软件…