IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 机器学习经典算法:决策树(2) -> 正文阅读

[人工智能]机器学习经典算法:决策树(2)

1. 概述

决策树(Decision Tree)是有监督学习中的一种算法,并且是一种基本的分类与回归的方法。决策树有两种:分类树和回归树。

  • 决策树是用于分类和回归的工具,它将数据特征值拆分为决策节点处的分支(例如,如果特征是一种颜色,则每种可能的颜色都会成为一个新分支),直到做出最终决策输出。
  • 一般来说,决策树只是一个嵌套 if-else 条件的结构。在数学上,决策树使用平行于任何一个轴的超平面将坐标系切割成超长方体。

树形结构

树形结构
树形结构

2. 构建

过程包括:特征选择、决策树的生成和决策树的剪枝

特征选择

标准:希望决策树的分支节点所包含的样本尽可能属于同一类别,也就是节点的纯度(purity)越来越高。

下面三个图表示的是纯度越来越低的过程,最后一个表示的是纯度最低的状态。

alt

度量不纯度的指标有很多种,比如:熵、增益率、基尼指数。本文使用熵(香农熵)

香农熵

熵定义为信息的期望值。在信息论与概率统计中,熵是表示随机变量不确定性的度量。假定当前样本集合D中一共有n类样本,第i类样本为 ,那么 的信息定义为:

alt

其中alt是选择该分类的概率。 通过上式,我们可以得到所有类别的信息。为了计算熵,我们需要计算所有类别所有可能值包含的信息期望值(数学期望),通过下面的公式得到:

alt

值越小,则D的不纯度就越低。

"""
????函数功能:计算香农熵
????参数说明:
?????dataSet:原始数据集
????返回:
?????ent:香农熵的值
"""

def?calEnt(dataSet):
????n?=?dataSet.shape[0]?#数据集总行数
????iset?=?dataSet.iloc[:,-1].value_counts()?#标签的所有类别
????p?=?iset/n?#每一类标签所占比
????ent?=?(-p*np.log2(p)).sum()?#计算信息熵
????return?ent

信息增益

信息增益(Information Gain)的计算公式其实就是父节点的信息熵与其下所有子节点总信息熵之差。

信息增益的计算公式为:

alt

3. 递归构建

ID3

构建决策树的算法有很多,比如ID3、C4.5和CART,本文选择ID3算法。

def?createTree(dataSet):
????featlist?=?list(dataSet.columns)?#提取出数据集所有的列
????classlist?=?dataSet.iloc[:,-1].value_counts()?#获取最后一列类标签
????
????#判断最多标签数目是否等于数据集行数,或者数据集是否只有一列
????if?classlist[0]==dataSet.shape[0]?or?dataSet.shape[1]?==?1:
?????return?classlist.index[0]?#如果是,返回类标签
????
????axis?=?bestSplit(dataSet)?#确定出当前最佳切分列的索引
????bestfeat?=?featlist[axis]?#获取该索引对应的特征
????myTree?=?{bestfeat:{}}?#采用字典嵌套的方式存储树信息
????
????del?featlist[axis]?#删除当前特征
????
????valuelist?=?set(dataSet.iloc[:,axis])?#提取最佳切分列所有属性值
????
????for?value?in?valuelist:?#对每一个属性值递归建树
?????myTree[bestfeat][value]?=?createTree(mySplit(dataSet,axis,value))
????return?myTree

4. 存储

构造决策树是很耗时的任务,即使处理很小的数据集,也要花费几秒的时间,如果数据集很大,将会耗费很多计算时间。因此为了节省时间,建好树之后立马将其保存,后续使用直接调用即可。

#树的存储
np.save('myTree.npy',myTree)

#树的读取
read_myTree?=?np.load('myTree.npy').item()
read_myTree

5. 实战

5.1. 导入数据

lenses?=?pd.read_table('lenses.txt',header?=?None)
lenses.columns?=['age','prescript','astigmatic','tearRate','class']
lenses

5.2. 划分数据

import?random

"""
函数功能:切分训练集和测试集
参数说明:
????dataSet:输入的数据集
????rate:训练集所占比例
返回:
????train,test:切分好的训练集和测试集
"""

def?randSplit(dataSet,?rate):
????l?=?list(dataSet.index)?#提取出索引
????random.shuffle(l)?#随机打乱索引
????dataSet.index?=?l?#将打乱后的索引重新赋值给原数据集
????n?=?dataSet.shape[0]?#总行数
????m?=?int(n?*?rate)?#训练集的数量
????train?=?dataSet.loc[range(m),?:]?#提取前m个记录作为训练集
????test?=?dataSet.loc[range(m,?n),?:]?#剩下的作为测试集
????dataSet.index?=?range(dataSet.shape[0])?#更新原数据集的索引
????test.index?=?range(test.shape[0])?#更新测试集的索引
????return?train,?test

5.3. 生成树

#利用训练集生成决策树
lensesTree?=?createTree(train1)
lensesTree

#构造注解树
createPlot(lensesTree)

5.4. 分类

#用决策树进行分类并计算有预测准确率
acc_classify(train1,test1)
ex
ex

本文由 mdnice 多平台发布

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-12-25 11:10:20  更:2022-12-25 11:14:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 21:36:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码