决策树算法原理+例题练习

article/2025/10/15 2:24:53

一、决策树的优缺点

  • 优点:计算复杂度不高,输出结果易于理解,对中间值的缺失值不敏感,可以处理不相关特征数据。
  • 缺点:可能会产生过度匹配的问题。
  • 使用数据类型:数值型和标称型。

二、一个实例

一天,老师问了个问题,只根据头发和声音怎么判断一位同学的性别。 为了解决这个问题,同学们马上简单的统计了7位同学的相关特征,数据如下:

 A同学思路,先按照头发判断,若判断不出,再按照声音判断,如下:

 由此决策树判断结果可知:头发+长声音粗是男生;头发长+声音细是女生;头发短+声音粗是男生;头发短+声音细是女生

同学B的思路,先根据声音判断,然后再根据头发判断,如下:

 此决策树的判断结果:声音细为女生,声音粗+短头发是男生;声音粗+头发长是女生。

这两个决策树,谁的更好呢?当我们有多个特征,该如何选哪个特征为最佳划分点?

三、数据集的划分原则

将无需的数据变得有序

我们可以使用多种方法划分数据集,但是每种方法都有各自的优缺点。于是我们这么想,如果我们能测量数据的复杂度,对比按不同特征分类后的数据复杂度,若按某一特征分类后复杂度减少的更多,那么这个特征即为最佳分类特征。 
Claude Shannon 定义了熵(entropy)和信息增益(information gain)。 
用熵来表示信息的复杂度,熵越大,则信息越复杂。公式如下:

信息增益(information gain),表示两个信息熵的差值。 
首先计算未分类前的熵,总共有8位同学,男生3位,女生5位。 
熵(总)=-3/8*log2(3/8)-5/8*log2(5/8)=0.9544 
接着分别计算同学A和同学B分类后信息熵。 
同学A首先按头发分类,分类后的结果为:长头发中有1男3女。短头发中有2男2女。 
熵(同学A长发)=-1/4*log2(1/4)-3/4*log2(3/4)=0.8113 
熵(同学A短发)=-2/4*log2(2/4)-2/4*log2(2/4)=1 
熵(同学A)=4/8*0.8113+4/8*1=0.9057 
信息增益(同学A)=熵(总)-熵(同学A)=0.9544-0.9057=0.0487 
同理,按同学B的方法,首先按声音特征来分,分类后的结果为:声音粗中有3男3女。声音细中有0男2女。 
熵(同学B声音粗)=-3/6*log2(3/6)-3/6*log2(3/6)=1 
熵(同学B声音粗)=-2/2*log2(2/2)=0 
熵(同学B)=6/8*1+2/8*0=0.75 
信息增益(同学B)=熵(总)-熵(同学A)=0.9544-0.75=0.2087

按同学B的方法,先按声音特征分类,信息增益更大,区分样本的能力更强,更具有代表性。 
以上就是决策树ID3算法的核心思想。 

 

from math import log
import operatordef calcShannonEnt(dataSet):  # 计算数据的熵(entropy)numEntries=len(dataSet)  # 数据条数labelCounts={}for featVec in dataSet:currentLabel=featVec[-1] # 每行数据的最后一个字(类别)if currentLabel not in labelCounts.keys():labelCounts[currentLabel]=0labelCounts[currentLabel]+=1  # 统计有多少个类以及每个类的数量shannonEnt=0for key in labelCounts:prob=float(labelCounts[key])/numEntries # 计算单个类的熵值shannonEnt-=prob*log(prob,2) # 累加每个类的熵值return shannonEntdef createDataSet1():    # 创造示例数据dataSet = [['长', '粗', '男'],['短', '粗', '男'],['短', '粗', '男'],['长', '细', '女'],['短', '细', '女'],['短', '粗', '女'],['长', '粗', '女'],['长', '粗', '女']]labels = ['头发','声音']  #两个特征return dataSet,labelsdef 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 retDataSetdef chooseBestFeatureToSplit(dataSet):  # 选择最优的分类特征numFeatures = len(dataSet[0])-1baseEntropy = calcShannonEnt(dataSet)  # 原始的熵bestInfoGain = 0bestFeature = -1for i in range(numFeatures):featList = [example[i] for example in dataSet]uniqueVals = set(featList)newEntropy = 0for value in uniqueVals:subDataSet = splitDataSet(dataSet,i,value)prob =len(subDataSet)/float(len(dataSet))newEntropy +=prob*calcShannonEnt(subDataSet)  # 按特征分类后的熵infoGain = baseEntropy - newEntropy  # 原始熵与按特征分类后的熵的差值if (infoGain>bestInfoGain):   # 若按某特征划分后,熵值减少的最大,则次特征为最优分类特征bestInfoGain=infoGainbestFeature = ireturn bestFeaturedef majorityCnt(classList):    #按分类后类别数量排序,比如:最后分类为2男1女,则判定为男;classCount={}for vote in classList:if vote not in classCount.keys():classCount[vote]=0classCount[vote]+=1sortedClassCount = sorted(classCount.items(),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 myTreeif __name__=='__main__':dataSet, labels=createDataSet1()  # 创造示列数据
print(createTree(dataSet, labels))  # 输出决策树模型结果

输出结果:{'声音': {'细': '女', '粗': {'头发': {'短': '男', '长': '女'}}}}


http://chatgpt.dhexx.cn/article/UXau07Q3.shtml

相关文章

高级管理学:计算题

题1:决策树和期望值 某企业拟开发新产品,现在有两个可行性方案需要决策。 方案一:开发新产品 A,需要追加投资 180 万元,经营期限为 5 年。此间,产品销路好每年可获利 170 万元;销路一般每年可获…

Nikto漏洞扫描工具简介

nikto漏洞扫描工具在我的靶场上测试报告如下: 测试时间会很长,我是在虚拟环境下做的,给的配置不高,吃尽CPU,最后不得不强制关闭虚拟机,通过-o参数将结果输出到文档中。 结果显示: 一些黑客比较感…

wed渗透:记录kali系统下扫描工具nikto的使用

目录 前言1 工具介绍2 使用场景3 使用方法3.1 查看帮助信息3.2 Nikto插件3.3 扫描3.3.1 常规扫描3.3.2 指定端口扫描3.3.3 指定协议扫描3.3.4 指定目录扫描3.3.5 多目标扫描3.3.6 配合namp利用管道输入扫描3.3.7 利用代理扫描 3.4 Nikto扫描过程中的交互参数3.5 修改nikto配置文…

Nikto安装及使用

系统要求如下(我自己使用的是linux,其它两个没有研究): 一、安装软件 第一步准备两个软件,如下: 1、nikto-master.zip(官网下载地址:https://cirt.net/nikto2) 2、libw…

Nikto详细使用教程

Nikto简介 基于perl语言开发的web页面扫描器。其特点扫描全面,速度快。 nikto常用命令 -upodate 升级,更新插件 -host 扫描目标URl -id username:password http认证接口 -list-plugins …

使用Nikto扫描网站漏洞

Nikto简介 Nikto是一个简单的开源Web服务器扫描程序,可以检查网站并报告它发现的可能用于利用或破解网站的漏洞。此外,它是业界使用最广泛的网站漏洞工具之一,并且在许多圈子中被认为是行业标准。 虽然这个工具非常有效,但它根本…

Kali工具库之Nikto

工具简介 Nikto是一个开源的WEB扫描评估软件,可以对Web服务器进行多项安全测试,能在230多种服务器上扫描出 2600多种有潜在危险的文件、CGI及其他问题。Nikto可以扫描指定主机的WEB类型、主机名、指定目录、特定CGI漏洞、返回主机允许的 http模式等。 链…

Nikto 网页服务器扫描器

一、Nikto介绍 Nikto是一款开源的(GPL)网页服务器扫描器,它可以对网页服务器进行全面的多种扫描,包含超过3300种有潜在危险的文件CGIs;超过625种服务器版本;超过230种特定服务器问题。扫描项和插件可以自动…

nmap和nikto扫描

先通过本机的VMware启动Kali攻击机和Metasploitable2靶机 端口扫描 使用 ip addr 或者 ifconfig 先看一下靶机的ip地址 在Kali里面使用 nmap IP 先用默认的方式对靶机进行扫描 事实上nmap的默认扫描方式就是 -sS 也就是SYN扫描,这种扫描方式基于TCP三次握手的前两…

4 | Nikto使用

目录 1 Nikto简介2 部署2.1 下载地址 3 操作参数4 具体使用4.1 扫描单个地址4.2 详细输出4.3 扫描多个地址4.4 使用代理进行扫描4.5 使用LibWhisker绕过IDS的检测(10个参数 1-8、A、B) 1 Nikto简介 发现Web服务器配置错误、插件和Web漏洞,支…

Nikto 扫描

0x00:简介 nikto 是一款用来发现 web 应用程序漏洞的一个工具,扫描的内容大概包括服务器软件的版本,比较版本是否为最新,现版本和最新版的差以及这个版本可能存在的漏洞。会搜索一些存在隐患的文件,例如测试文件,或者是网站备份文件等。也会去扫描服务器的配置漏洞,有没…

Nikto:从零开始到专业版的完整教程

文章目录 [TOC](文章目录) 介绍一、什么是Nikto?二、Nikto工具中的功能Nikto工具中的命令有如何使用Nikto工具?1.安装Nikto2.标准扫描3.对目标SSl或TLS扫描4.扫描特定/多个端口5.忽略某些HTTP代码在这里插入图片描述 结论: 介绍 在这篇文章中…

网络安全——Nikto的使用

一、什么是Nikto Perl:Perl语言是一种解释型的脚本语言。Perl语言由Larry wall于1986年开发成功。当初的目的主要是在Unix环境下,用于处理面向系统任务而设计的脚本编程语言。Perl对文件和字符有很强的处理、变换能力,它特别适用于有关系统管…

Web漏洞扫描神器Nikto使用指南

文章目录 工具简介工具下载链接nikto安装nikto基础语句指定端口进行扫描指定目录进行扫描多目标扫描其他功能扫描结果输出Nikto扫描交互参数IDS 躲避使用代理扫描 后言 工具简介 Nikto是一款开源的(GPL)网页服务器扫描器,它可以对网页服务器…

pageoffice

激活失败,重新激活 输入序列号没有激活,提示当前PageOffice需要获取更高版本的授权才能正常运行 想要重新激活,要删除项目中WEB-INF下的lib中的license.lic文件,才能重新输入序列号 删除以后,出现激活窗口 注意&am…

clientX、pageX、offsetX、screenX、offsetWidth、clientWidth等

文章目录 1、clientX 、clientY2、pageX、pageY注意: clientX和pageX的区别3、offsetX、offsetY4、screenX、screenY5、offsetWidth、offsetHeight 、offsetLeft、offsetTop6、clientWidth、clientHeight、clientLeft、clientTop总结 1、clientX 、clientY documen…

图解鼠标事件的 ScreenX ,LayerX,clientX,PageX,offsetX,X

前言: 完在上一篇文章 🎁如何实现原生 JS 的拖拽效果我中使用到了 MouseEvent 事件对象身上的 clienX 的属性,但同时我也注意到了事件对象身上关于 X 的相关属性还有很多,并且在移动端开发中,这些属性需要频繁的用到&a…

pageX,clientX,offsetLeft,scrollLeft的区别

pageX,clientX,offsetLeft,scrollLeft的区别 1、pageX / pageY pageX / pageY的值为鼠标相对于document的距离,即网页左上角的位置 2、clientX / clientY clientX / clientY的值为鼠标相对于浏览器可视区域左上角的距离 3、offsetLeft / offsetTop offsetLeft …

详细区分offsetX,clientX,pageX,screenX,layerX和X的区别

详细区分DOM事件中鼠标指针的坐标问题 前面博客中我们讲解到了DOM事件的event对象&#xff0c;里边包含了鼠标事件的指针坐标属性。比如event.offsetX,event.clientX,event.pageX,event.screenX等等。现在我们来解析一下这些坐标属性的区别。 HTML代码&#xff1a; <div c…

screenX、client X、pageX、offsetX、layerX

screenX, client X screenX: 鼠标在屏幕中的水平坐标 client X: 鼠标在客户端区域&#xff08;浏览器可视区域&#xff09;的水平坐标&#xff0c;不论页面是否有水平滚动 pageX 相对于整个文档的x&#xff08;水平&#xff09;坐标 个人认为&#xff1a;pageX clientX sc…