机器学习实战之决策树最有特征的选取

2023-10-28

在学习了jack cui机器学习博客后,为了给自己留下一个理解的笔记,本人比较笨,以后方便查看。他的博客地址在下方,写得很好。

点击打开链接

决策树机器学习的一种分类方法,

拿相亲来说,决策树模型就是上面这一个,长方形为这个人的某个特征,决策树有内部节点和叶节点。内部节点就是这个长方形,是其特征。叶节点是椭圆,就是其得到的结果,是备胎还是值得考虑。而特征也是一个分类的规则条件。是将它继续划分到哪一边。每一个特征都会影响这个决策树分类的结果。

决策树的构建这一过程要分为3个步骤:

特征选择,决策树的生成和决策树的修剪。

使用决策树做预测需要一下过程:收集数据-->准备数据-->分析数据-->训练算法-->测试算法-->使用算法

1.特征选择:

特征选择就是选取具有分类能力的特征,如果某个特征对本次分类不会产生影响或则说产生的影响很低,那么我们就可以选择抛弃这个特征。这个特征就是没有分类能力的,无用特征。而在选取特征上,有一个方法就是计算某个特征的信息增益,然后看其信息增益的大小,越大的说明它对本次分类结果影响越大,反之亦然。

这里有一个实例,就是贷款申请的样本数据:


这次我们通过说给的数据学习一个贷款申请的决策树,用于对未来某个客户提出申请贷款时,我们可以根据这个人的一些特征数据考虑是否给这个人贷款。

那么我们要构建一个决策树模型,就应该选择分类能力大的特征,现在看上面那个表单,不会看到什么不同。这是就需要我们计算信息增益了,在计算信息增益之前,我们需要计算一个香农熵。

(1)香农熵(经验
根据此公式计算经验熵H(D),分析贷款申请样本数据表中的数据。最终分类结果只有两类,即放贷和不放贷。根据表中的数据统计可知,在15个数据中,9个数据的结果为放贷,6个数据的结果为不放贷。所以数据集D的经验熵H(D)为

所以H(D)经验熵为0.971

那么现在需要的一个就是条件熵,也就是某个特征的信息增益:


在上面我给的那个博客地址上已经讲得很好了,很容易理解

以贷款申请样本数据表为例进行说明。看下年龄这一列的数据,也就是特征A1,一共有三个类别,分别是:青年、中年和老年。我们只看年龄是青年的数据,年龄是青年的数据一共有5个,所以年龄是青年的数据在训练数据集出现的概率是十五分之五,也就是三分之一。同理,年龄是中年和老年的数据在训练数据集出现的概率也都是三分之一。现在我们只看年龄是青年的数据的最终得到贷款的概率为五分之二,因为在五个数据中,只有两个数据显示拿到了最终的贷款,同理,年龄是中年和老年的数据最终得到贷款的概率分别为五分之三、五分之四。所以计算年龄的信息增益,过程如下:




好了,现在就来解读整个代码,这也是我这个小白写笔记的原因,方便以后复习


在编写代码之前,我们先对数据集进行属性标注。

  • 年龄:0代表青年,1代表中年,2代表老年;
  • 有工作:0代表否,1代表是;
  • 有自己的房子:0代表否,1代表是;
  • 信贷情况:0代表一般,1代表好,2代表非常好;
  • 类别(是否给贷款):no代表否,yes代表是。
[python]  view plain  copy
  1. from math import log  
  2.   
  3. ''''' 
  4. 函数说明: 
  5. 创建测试数据集 
  6. Parameters(参数): 
  7.  
  8. returns: 
  9. dataSet:数据集 
  10. labels 分类属性 
  11. '''  
  12. def createDataSet():  
  13.      dataSet = [[0000'no'],                        #数据集  
  14.             [0001'no'],  
  15.             [0101'yes'],  
  16.             [0110'yes'],  
  17.             [0000'no'],  
  18.             [1000'no'],  
  19.             [1001'no'],  
  20.             [1111'yes'],  
  21.             [1012'yes'],  
  22.             [1012'yes'],  
  23.             [2012'yes'],  
  24.             [2011'yes'],  
  25.             [2101'yes'],  
  26.             [2102'yes'],  
  27.             [2000'no']]  
  28.      labels=['不放贷','放贷']  
  29.      return dataSet,labels  
  30. ''''' 
  31. 函数说明: 
  32. 计算给定数据集的经验熵(香农熵) 
  33. Parameters: 
  34. dataSet 
  35. Returns: 
  36. shannonEnt-经验熵(香农熵) 
  37. '''  
  38. def calcShannonEnt(dataSet):  
  39.     #这个函数对计算经验熵和条件熵都是相同的,因为公式其实并无区别。只是条件熵加上了一个条件,数据集变小了而已  
  40.     numEntires=len(dataSet)  
  41.     #计算这个数据集有多少行  
  42.     labelCounts={}  
  43.       
  44. #定义一个空字典  
  45.     for featVec in dataSet:  
  46.         #循环遍历数据集中的每行数据  
  47.         currentLabel=featVec[-1]  
  48.         #得到每行数据中的最后一个标签  
  49.         if currentLabel not in labelCounts.keys():  
  50.             #判断这个标签是否在这个字典里面  
  51.             labelCounts[currentLabel]=0  
  52.             #如果没有先初始化这个标签名(label)  
  53.         labelCounts[currentLabel]+=1  
  54.         #记录标签名出现的次数,记录字典里的键值  
  55.     shannonEnt=0.0  
  56.     #定义一个浮点数,是用来保存香农熵的  
  57.     for key in labelCounts:  
  58.         #循环遍历字典里的键名  
  59.         prob=float(labelCounts[key])/numEntires  
  60.         #得到yes或no 这个标签的概率  
  61.         shannonEnt -=prob * log(prob,2)  
  62.         #公式计算香农熵  
  63.     return shannonEnt  
  64. """ 
  65. 函数说明:按照给定特征划分数据集 
  66.   
  67. Parameters: 
  68.     dataSet - 待划分的数据集 
  69.     axis - 划分数据集的特征 
  70.     value - 需要返回的特征的值 
  71. Returns: 
  72.     无 
  73. Author: 
  74.     Jack Cui 
  75. Modify: 
  76.     2017-03-30 
  77. """  
  78. def splitDataSet(dataSet, axis, value):         
  79.     retDataSet = []  #定义一个列表来保存我们需要的子集                                        
  80.     for featVec in dataSet: #遍历每行                              
  81.         if featVec[axis] == value:#如果这一行的这一列(axis)有一个元素是我们要找的,比如在第一列有我们要找的青年,就把这一行数据保存下来  
  82.             ''''' 
  83.             reducedFeatVec = featVec[:axis]                
  84.             reducedFeatVec.extend(featVec[axis+1:])     
  85.             retDataSet.append(reducedFeatVec) 
  86.             '''  
  87.             retDataSet.append(featVec)#我觉得博主写的这个好像有点多余,因为我们将数据带入calShannonEnt()函数中就是看它后面的标签是否放贷,所以将某一行的这个元素去掉,没必要  
  88.     return retDataSet                                        
  89.    
  90. ''''' 
  91. 函数说明:计算每个特征的信息增益,然后选择最优特征 
  92. Parameters: 
  93. dataSet-数据集 
  94. Returns: 
  95. bestFeature-信息增益最大的特征的索引值 
  96. '''  
  97. def chooseBestFeatureToSplit(dataSet):  
  98.     numFeatures=len(dataSet[0])-1#得到特征数  
  99.     baseEntropy=calcShannonEnt(dataSet)#得到总数据的香农熵  
  100.     bestInfoGain=0.0#定义一个浮点数,来接受经验熵的值  
  101.     bestFeature=-1#定义一个数接受最优特征是第几列  
  102.     for i in range(numFeatures):  
  103.         #循环遍历4个特征  
  104.         featList = [example[i] for example in dataSet]#将每列的特征的数据存入这个列表,这个列表就保存每列特征的数据,下一列的数据会覆盖掉上一列数据  
  105.         uniqueVals = set(featList)#创建set集合{},保存的元素不可重复                       
  106.         newEntropy = 0.0                                   
  107.         for value in uniqueVals:  
  108.             #遍历集合中的每个元素,计算信息增益,例如:年龄中的青年,中年,老年。因为字典中的每个不同元素就代表了青年,中年,老年  
  109.             subDataSet = splitDataSet(dataSet, i, value)#划分包含了value的某些子集,就是某些包含了value的行,将它变成一个数据集,然后计算他的信息增益(条件熵),然后我们转到这个函数           
  110.             prob = len(subDataSet) / float(len(dataSet))#下面的就是计算步骤了,没什么区别           
  111.             newEntropy += prob * calcShannonEnt(subDataSet) #这是累加,我们计算的是这一列的条件熵,例如为年龄的条件熵,所以就将青年,中年,老年的加起来   
  112.         infoGain = baseEntropy - newEntropy #这就是真正的信息增益了,经验熵减去条件熵               
  113.         print("第%d个特征的增益为%.3f" % (i, infoGain))#输出每列特征的增益  
  114.         if (infoGain > bestInfoGain): #比较每个增益,输出最大增益                             
  115.             bestInfoGain = infoGain                               
  116.             bestFeature = i#保留它是第几列,后面方便输出  
  117.     return bestFeature       
  118.       
  119.       
  120.   
  121. if __name__=="__main__":  
  122.     dataSet, features = createDataSet()  
  123.     print("最优特征索引值:" + str(chooseBestFeatureToSplit(dataSet)))  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习实战之决策树最有特征的选取 的相关文章

  • k8s 以statefulset方式部署zookeeper集群

    k8s 以statefulset方式部署zookeeper集群 参考 k8s官网zookeeper集群的部署 数据挂着方式改成通过本地方式创建的pv https kubernetes io docs tutorials stateful a
  • [深度解剖C语言] --关键字 static

    static 最名不副实的关键字 目录 1 static修饰全局变量 2 static修饰函数 3 static修饰局部变量 static的作用 1 static修饰全局变量 我们创建两个源文件 一个test c 一个main c 现在我们
  • 【日常问题记录】visual studio 出现 E0266 “data“ 不明确 错误

    解决方法 定义的变量和内部变量冲突 将变量的把名字改成其他名字即可
  • 【Kubernetes】mac 安装minikube

    1 一 官网安装 官网 https minikube sigs k8s io 搜了下网上如何通过Mac 安装看网上文章很多 但是受限于国内网络环境 很多都不行 各种下载失败 如果你有VPN 那么官方的步骤就容易走通 brew install
  • 小酌Django3——HTTP/URL/ORM简述

    小酌Django3 HTTP URL ORM简述 HTTP Hyper Text Transfer Protocol 超文本传输协议 是客户端与服务端请求和应答的标准 TCP 封装了Web服务的整个过程 通常 由客户端发起 建立到服务器指定
  • 矩阵基本知识

    1 identity matrix 单位矩阵 除了正对角线上是1 其它地方都是0 2 square matrix 方阵 行数和列数都相等的矩阵 3 diagonal matrix 对角矩阵 只在正对角线上有值 其它地方为0 4 matrix
  • js获取昨天,今天,明天,上周,本周,下周,上月,本月,下月,去年,本年,明年,上季度,本季度,下季度,向前推日期等

    配合的elementul的日期选择器使用的 参数是这样的 1代表 上 0代表 本 1代表 下 本月 1号到今天 意思就是比如今天是10月27号 那点击这个获取的是10月1号到10月27号得 效果如图 按顺序点了一遍 从左到右 上代码
  • 双十一前4小时,CentOS 6.5server启动错误排查

    11月10日晚上8点多 眼看要到双十一了 但我要说的这段经历却和双十一毫无关系 哈哈 这天准备向CentOS6 5server的svn上传一些文件 结果开机启动时 却出现了以下的界面 这是肿么回事 依据屏幕的提示 先使用root账号登录到系
  • JSP page指令errorPage属性起什么作用呢?

    转自 JSP page指令errorPage属性起什么作用呢 下文讲述JSP中page指令的errorPage功能简介说明 如下所示 errorPage功能 errorPage 属性用于设置JSP页面 当出现异常时的跳转页面 注意事项 er
  • STM32G431控制窗帘电机-窗帘电机拆机

    前言 最近做了一个电动窗帘的控制工程 简单点说就是实现电动窗帘的校准模式 窗帘移动到任意位置 说明 本文档为原创 转载请注明出处 要进行商业合作请联系本人1151313194 qq com 一 电机爆炸图拆解 窗帘电机主要时由三部分构成 电
  • Docker的隔离机制

    Docker的隔离性主要运用Namespace 技术 传统上Linux中的PID是唯一且独立的 在正常情况下 用户不会看见重复的PID 然而在Docker采用了Namespace 从而令相同的PID可于不同的Namespace中独立存在 如
  • 自动生成GFM目录

    自动生成GFM目录 自动生成GFM目录 参考文献 引言 使用方法 对于本地文档 对于远程文档 对于多个文档 本地与远程结合 自动插入和更新目录 输出目录文件 工作流程 目前工作流程注意事项及问题 参考文献 https github com
  • Go语言--Nohup后台启动

    linux的nohup命令用法 在应用Unix Linux时 我们一般想让某个程序在后台运行 于是我们将常会用 在程序结尾来让程序自动运行 nohup命令格式 nohup root start sh 在shell中回车后提示 appendi
  • HTML5(六)preserve and recover

    HTML5 六 preserve and recover 1 save the state of canvas context 2 So we have two method to save and restore the state of
  • run nerf

    install cuda install cudnn install anoconda 2022 08 18 wget https repo anaconda com archive Anaconda3 2022 05 Linux x86
  • 接口自动化get请求一些小知识点

    get 请求 requests get get请求的参数可以写在url里 写在url里时 参数和url之间需要加 get 请求的参数可以不写在url里 可以组织为字典传给参数param get 请求可以不传参数 获取响应信息 r reque
  • React之Hook(四)——使用 Effect Hook

    Effect Hook 可以让你在函数组件中执行副作用操作 import React useState useEffect from react function Example const count setCount useState
  • Doris数据划分

    数据划分 基本概念 Row Column 一张表包含行 Row 和列 Column Column可以分为两大类 Key和Value Tablet Partition 在Doris的存储引擎中 用户数据被水平划分为若干个数据分片 Tablet
  • Android面试题(32)-android编译过程和安装流程

    android app的编译过程 从网上拷了一张图 这张图很好的讲述了android的编译打包过程 接下来就具体的分析分析 大致分为7步 1 aapt Android Asset Packaging Tool android构建工具 在an
  • 网络前三层(物理,数据链路层,网络)数据包传输过程

    前三层 起始 第一层 物理层 hub 第二层 数据链路层 交换机 第三层 网络层 路由器 起始 起始 我就是一台电脑A 有一天 突然另一台电脑B想和我进行通话 于是我们各自开了个网口 用一根网线连接起来 这样就可以进行通信了 至于为什么可以

随机推荐

  • 教你如何使用解决keil编译大小限制问题

    关于上一篇我们讲解到可能刚接触keil的人会因为没有使用注册机 好像不能使用注册机 所以就缩写吧 导致编译超出32K文件时候会报错的问题 于是在这一篇我们就来好好讲解一下如何使用keil注册机去破解keil 解决方法 参考我的这篇文章 因为
  • PyQt中QLabel背景与字体的一些设置

    本文原创 原文地址 http blog csdn net jiuzuidongpo article details 45485127 一般来说 对QLabel的背景和字体设置的话 有两种方法 一种是使用样式表 就是stypesheet 另一
  • 华为OD机试 - 九宫格(Java)

    题目描述 九宫格是一款广为流传的游戏 起源于河图洛书 游戏规则是 1到9九个数字放在3 3的格子中 要求每行 每列以及两个对角线上的三数之和都等于15 在金麻名著 射雕英雄传 中黃蓉曾给九宫格的一种解法 口诀 戴九恩一 左三右七 二四有肩
  • 脉冲星测时软件TEMPO2安装

    下载 https bitbucket org psrsoft tempo2 downloads 在安装TEMPO2之前需要安装pgplot FFTW CFITSIO等数学库 安装时 注意运行 configure后输出的日志信息 会提示是否缺
  • 2021-Twins: Revisiting the Design of Spatial Attention

    文章目录 1 Title 2 Summary 3 Problem Statement 4 Method s 4 1 Twins PCPVT 4 2 Twins SVT 4 2 1 Locally Grouped Self Attention
  • node.js(读取文件)

    fs fs 模块是Node js官方提供的 用来操作文件的模块 它提供了一系列的方法和属性 用来满足用户对文件的操作需求 读取文件 fs readFile 读取文件 1 导入fs模块 来操作文件 const fs require fs 2
  • glibc版本查看_glibc做版本兼容的原理介绍

    相关技术叫 compact symbols 当我们比如查看libc 2 29 so的dynamic symbol table的时候 我们可以看到3个glob64的实现 随后你的程序要refer对应的glob64 这时 你的dynamic l
  • qt自定义MessageBox

    头文件 ifndef HINT INTERFACE H define HINT INTERFACE H include
  • docker 安装卸载及常用命令

    Docker 镜像与容器 1 安装卸载docker 1 1 卸载docker 1 1 1 查看已安装的docker列表 root centos7 yum list installed grep docker containerd io x8
  • Python、pip以及libsvm等的安装

    从python官网下载并安装python https www python org downloads windows 设置python的环境变量 命令行输入python 如下安装成功 安装pip 到官网下载pip https pypi p
  • Unity——控制物体移动的方法

    控制物体移动的三种方法 一 常规方法 四个方向 if Input GetKey KeyCode W transform Translate Vector3 forward moveSpeed Time deltaTime if Input
  • android的模拟器闪动处理

    为什么80 的码农都做不了架构师 gt gt gt 今天 建立了一个示例android项目 运行的时候 模拟器每隔几秒便闪一下 开始以为是项目的问题 或者版本 v16 的问题 换了其他 还是闪动 网上查了下 只有一人遇到 http zhid
  • 一些在线图床工具

    以下排列按个人喜爱程度 SM MS https sm ms 和picgo搭配 非常哇塞 普通用户只有5G 不算很大 对我来说够用了 举例 https sm ms image fiNMYZ5pxycUmjX 路过图床 https imgchr
  • C#中字符串判断EndsWith和Contains的效率比较

    关于字符串的判断 EndsWith和Contains下面做了两个简单的例子 运行后测试了一下所耗时间 public void TestContains DateTime starTime DateTime Now string str 20
  • Pip install 和Conda install 的区别和使用场景

    文章目录 一 Conda 和Pip的区别 总结 二 Pip install和Conda install的区别 1 默认安装路径不同 1 python包 2 非python包 相关问题 解决 2 conda list列表数量 gt pip l
  • mysql中替换字段的部分内容

    如果想替换表中所有记录的某一个字段的指定字符串内容 可以使用mysql提供的replace 函数来实现 表记录如下 我想将address字段的湖北这部分内容替换成拼音hubei 那么sql语句如下 update user set addre
  • ConvTranspose2d(反卷积操作)

    nn ConvTranspose2d 反卷积操作 1 公式 class torch nn ConvTranspose2d in channels out channels kernel size stride 1 padding 0 out
  • Python 教程

    一 Python环境下载 百度网盘链接 https pan baidu com s 12MnzyIZZuKBiveebPdtJ3w 提取码 0st4 二 Python安装步骤 1 点击python 3 8 1 amd64 exe 2 选择安
  • Python中模块、包、库、框架的理解

    一 模块 module 以 py 文件开头的都叫做模块 模块中有定义的变量 函数 类 模块的名称为 py文件的名称 作为全局变量 name 的值 如果是模块A自己py A py则 name main 如果是被其他模块import之后使用的话
  • 机器学习实战之决策树最有特征的选取

    在学习了jack cui机器学习博客后 为了给自己留下一个理解的笔记 本人比较笨 以后方便查看 他的博客地址在下方 写得很好 点击打开链接 决策树机器学习的一种分类方法 拿相亲来说 决策树模型就是上面这一个 长方形为这个人的某个特征 决策树