机器学习之决策树算法前期(创建、分类及展示)
一、什么是决策树?
决策树算法是一种逼近离散函数值的方法。它是一种典型的分类方法,首先对数据进行处理,利用归纳算法生成可读的规则和决策树,然后使用决策对新数据进行分析。本质上决策树是通过一系列规则对数据进行分类的过程。
决策树算法构造决策树来发现数据中蕴涵的分类规则.如何构造精度高、规模小的决策树是决策树算法的核心内容。决策树构造可以分两步进行。第一步,决策树的生成:由训练样本集生成决策树的过程。一般情况下,训练样本数据集是根据实际需要有历史的、有一定综合程度的,用于数据分析处理的数据集。第二步,决策树的剪枝:决策树的剪枝是对上一阶段生成的决策树进行检验、校正和修下的过程,主要是用新的样本数据集(称为测试数据集)中的数据校验决策树生成过程中产生的初步规则,将那些影响预衡准确性的分枝剪除。
二、怎么完成决策树的创建?(递归算法实现)
在构建决策树的时候,我们得考虑哪个属性来当根节点?哪些属性来当内部决策节点?这里是有一个依据原则的。在说这个原则之前,我们先说一下熵的概念。
熵(entropy):用来表示物体内部的混乱程度。一个物体内部构成越纯,熵越小;越混乱,熵越大。在机器学习中,表示随机变量分布的混乱程度。
信息熵(information entropy):信息熵通常用来描述整个随机分布所带来的信息量平均值,更具统计特性。一个系统越是有序,信息熵就越低;反之,一个系统越是混乱,信息熵就越高。
假设样本集合 D 中第 i 类样本所占的比例是 pi(i=1,2,⋯,N) ,则样本集合 D 的信息熵为
注:随机变量的取值个数越多,信息熵就越大,混乱程度就越大。当随机分布为均匀分布时,熵最大。
条件熵 (Conditional entropy): 现在我们假设将样本集合 D 按属性 a 进行划分,假设属性 a 有 v 个可能的取值,则按 a 属性进行分裂出的 v 个子集(即树中的 v 个分支),每个可能取值集合为 D^v ,则 a 属性的条件熵计算方法为( |D^v| 和 |D| 表示集合中元素的个数)
1、模型创建:
决策树模型创建的核心就是选择合适的树根 , 将重要的属性放在树根 , 然后子树中 , 继续选择子树中重要的属性放在子树的树根 , 依次递归 , 最终得到决策结果 ( 叶子节点 ) ;
①选取决策节点的原则:
随着树深度的增加,节点的熵可以迅速地降低。熵降低的速度越来越快,得到一个最矮的高度树。
2、创建决策树的递归算法:
①递归操作:
a.选择属性 : 递归由上到下决定每一个节点的属性 , 依次递归构造决策树 ;
b.数据集划分 : 开始决策时 , 所有的数据都在树根 , 由树根属性来划分数据集 ;
c.属性离散化 : 如果属性的值是连续值 , 需要将连续属性值离散化 ; 如 : 100 分满分 , 将 60 分以下分为不及格数据 , 60 分以上分为及格数据 ;
②递归终止条件:
a.子树分类完成 : 节点上的子数据集都属于同一个类别 , 该节点就不再向下划分 , 称为叶子节点 ;
b.属性 ( 节点 ) 全部分配完毕 : 所有的属性都已经分配完毕 , 决策树的高度等于属性个数 ;
c.所有样本分类完毕 : 所有的样本数据集都分类完成 ;
3、具体创建代码:
def CreateTree(DataSet):#获取所有特征标签index_list = list(DataSet.columns)#获取最后一列(分类标签)的类别label_series = DataSet.iloc[:,-1].value_counts()#判断类别标签最多一个是否等于数据样本数、或者数据集是否只有一列if label_series[0]==DataSet.shape[0] or DataSet.shape[1] == 1:return label_series.index[0] #返回类标签# 获取最优特征列索引col = ChooseBF(DataSet)# 获取最优特征BestFeature = index_list[col]#将最优特征依次填入字典中TheTree = {BestFeature:{}}# 从标签列表中删去该特征标签del index_list[col]#提取最佳切分列的所有属性值value_list = set(DataSet.iloc[:,col])#利用递归方法建树,每次对象为当前最优特征for value in value_list:TheTree[BeatFeature][value] = CreateTree(splitSet(DataSet,col,value))return TheTree
运行上述代码即可得到 TheTree:
{'tearRate': {0: 'no lenses', 1: {'astigmatic': {0: {'age': {0: 'soft', 1: 'soft', 2: {'prescript': {0: 'no lenses', 1: 'soft'}}}}, 1: {'prescript': {0: 'hard', 1: {'age': {0: 'hard', 1: 'no lenses', 2: 'no lenses'}}}}}}}}
三、如何代码实现利用决策树进行分类及展示?
1、使用决策树进行分类:
"""
函数功能:对一个测试实例进行分类
参数说明:inputTree:已经生成的决策树labels:存储选择的最优特征标签testVec:测试数据列表,顺序对应原数据集
返回:classLabel:分类结果
"""
def classify(inputTree,labels, testVec):firstStr = next(iter(inputTree)) #获取决策树第一个节点secondDict = inputTree[firstStr] #下一个字典featIndex = labels.index(firstStr) #第一个节点所在列的索引for key in secondDict.keys():if testVec[featIndex] == key:if type(secondDict[key]) == dict :classLabel = classify(secondDict[key], labels, testVec)else: classLabel = secondDict[key]return classLabel
"""
函数功能:对测试集进行预测,并返回预测后的结果
参数说明:train:训练集test:测试集
返回:test:预测好分类的测试集
"""
def acc_classify(train,test):inputTree = createTree(train) #根据测试集生成一棵树labels = list(train.columns) #数据集所有的列名称result = []for i in range(test.shape[0]): #对测试集中每一条数据进行循环testVec = test.iloc[i,:-1] #测试集中的一个实例classLabel = classify(inputTree,labels,testVec) #预测该实例的分类result.append(classLabel) #将分类结果追加到result列表中test['predict']=result #将预测结果追加到测试集最后一列acc = (test.iloc[:,-1]==test.iloc[:,-2]).mean() #计算准确率print(f'模型预测准确率为{acc}')return test
测试函数:
train = dataSet
test = dataSet.iloc[:3,:]
acc_classify(train,test)
2、使用SKlearn中graphviz包实现决策树的绘制:
#导入相应的包
from sklearn import tree
from sklearn.tree import DecisionTreeClassifier
import graphviz#特征
Xtrain = dataSet.iloc[:,:-1]
#标签
Ytrain = dataSet.iloc[:,-1]
labels = Ytrain.unique().tolist()
Ytrain = Ytrain.apply(lambda x: labels.index(x)) #将本文转换为数字#绘制树模型
clf = DecisionTreeClassifier()
clf = clf.fit(Xtrain, Ytrain)
tree.export_graphviz(clf)
dot_data = tree.export_graphviz(clf, out_file=None)
graphviz.Source(dot_data)#给图形增加标签和颜色
dot_data = tree.export_graphviz(clf, out_file=None,feature_names=['no surfacing', 'flippers'],class_names=['fish', 'not fish'],filled=True, rounded=True,special_characters=True)
graphviz.Source(dot_data)#利用render方法生成图形
graph = graphviz.Source(dot_data)
graph.render("fish")
这样就实现了决策树的分类及展示了
机器学习之决策树算法前期(创建、分类及展示)相关推荐
- python决策树实例_Python机器学习之决策树算法实例详解
本文实例讲述了Python机器学习之决策树算法.分享给大家供大家参考,具体如下: 决策树学习是应用最广泛的归纳推理算法之一,是一种逼近离散值目标函数的方法,在这种方法中学习到的函数被表示为一棵决策树. ...
- 机器学习:决策树算法(ID3算法)的理解与实现
机器学习:决策树算法(ID3算法)的理解与实现 文章目录 机器学习:决策树算法(ID3算法)的理解与实现 1.对决策树算法的理解 1.概述 2.算法难点 选择最优划分属性 1.信息熵 2.信息增益 2 ...
- 机器学习算法——决策树算法详细介绍,并使用sklearn实现案例预测,可视化决策树
目录 一.决策树算法简介 二.决策树分类原理 1.熵 1.1 概念 1.2 案例 2.决策树的划分依据一:信息增益 2.1 概念 2.2 案例: 3.决策树的划分依据二:信息增益率 3.1 概念 3. ...
- 机器学习基础 决策树算法
文章目录 一.决策树算法简介 二.决策树分类原理 1. 熵 1.1 概念 1.2 案例 2. 决策树的划分依据一----信息增益 2.1 概念 2.2 案例 3. 决策树的划分依据二----信息增益率 ...
- 【机器学习】决策树算法
在前一期介绍搭建结合机器学习的CI/CD管道时,无意中提到了算法分类.在受监督学习的分类中,有一个既适用于回归又适用于分类的算法,即我们今天要介绍的决策树算法(CART, Classification ...
- 机器学习实战--决策树算法
决策树 决策树(decision tree)是一种基本的分类与回归方法.从判断模块引出的左右箭头称为分支,它可以达到另外一个判断模块或者终止模块.分类决策树模型是一种描述对实例进行分类的树形结构.决策 ...
- 机器学习-ID3决策树算法(附matlab/octave代码)
ID3决策树算法是基于信息增益来构建的,信息增益可以由训练集的信息熵算得,这里举一个简单的例子 data=[心情好 天气好 出门 心情好 天气不好 出门 心情不好 天气好 出门 心情不好 天气不好 ...
- 机器学习3决策树算法模型
决策树算法模型 1.什么是决策树? 2.决策树的归纳 2.1 (选择分裂特征)特征的选择 2.2 决策树的生成 2.2.1 ID3 算法 2.2.2 C4.5 算法 2.2.3 Card算法 2.2 ...
- 机器学习 day3 决策树算法
决策树算法 1. 目的 2. 优缺点 3. 信息熵 entropy 计算方法: 导库: 导数据集: 首先计算原本的信息熵: 计算色泽特征下的信息熵: 取数据集D1 D1为色泽=青绿的数据子集 取子集D ...
最新文章
- 【转】android错误 aapt.exe已停止工作的解决方法
- Maven内置变量说明
- Python 微信机器人:调用电脑摄像头时时监控功能实现演示,调用电脑摄像头进行拍照并保存
- leetcode 450. 删除二叉搜索树中的节点 c语言实现
- iPad 如何创建UISplitViewController应用程序
- nssl1323,jzoj(初中)2107-交流【dfs,容斥,组合数】
- 【渝粤题库】陕西师范大学201001 教育管理学(高起本)作业
- IO 多路复用之poll总结
- Eclipse更改默认工作目录的方法
- kubernetes(K8s):管理云平台中多个主机上的容器化的应用
- ASP.Net学习笔记004--基于ashx方式的ASP.Net开发1
- DES加密/解密类。
- Android10动态权限提前,Unity2019中的android动态申请权限(Permissions)
- php使用referer,PHP利用REFERER根居访问来地址进行页面跳转
- [改善Java代码]使用静态内部类提高封装性
- oppo9s刷机教程_OPPOR9S刷机包
- 科学计算机clr,怎么用科学计算器解方程?
- SIM868烧写自己MT2503开发的程序过程
- LibreELEC(kodi)安装 IPTV
- DWI_preprocessing DTI_reduce commands
热门文章
- 机器学习:kNN算法(一)—— 原理与代码实现(不调用库)
- 今日头条如何快速开原创?今日头条怎么一个礼拜开原创?
- Java中关于子类重写父类方法的坑
- java静态变量、静态方法、代码块、main方法
- 移动文件需要计算机管理员权限,win7系统提示“需要管理员权限才能移动文件夹”的解决方法...
- YAML简介(.yml文件后缀)
- wang zhe rong yao
- 用什么擦地最干净脑筋急转弯_小学生语文试卷:为什么秋天大雁要飞回南方?答案让人“喷饭”...
- nyoj239 月老的难题 (匈牙利算法,最大匹配,邻接表)
- 2022年8月6日(星期六):骑行宁湖公园