实现机器学习的循序渐进指南II——决策树
目录
介绍
决策树模型
特征选择
决策树的生成
分类
结论与分析
可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表。
介绍
决策原则并不复杂。从根节点开始,将节点中存储的特征值与测试对象的相应特征值进行比较。然后,根据比较结果递归地转向左子树或右子树。最后,叶节点的标签是测试对象的预测。
例如,下面有一个决策树,其中功能集是{hungry, money},标签集是{go to restaurant, go to buy a hamburger, go to sleep}。
在决策过程中,首先,如果我饿了,转向右侧的子树,这意味着我会去睡觉。否则转向左侧子树。然后,检查我的钱包里有多少钱。如果我有超过25美元,我会去餐厅。否则,我只能去买一个汉堡包。
决策树模型
决策树模型由特征选择,决策树的生成和分类组成。
特征选择
特征选择的目的是选择具有训练数据分类能力的特征,以使学习过程更有效。特征选择包括两部分,即特征选择和特征值选择。选定的元组(特征,特征值)将作为决策树中的节点应用。
特征选择通常基于信息增益或信息增益比。信息增益定义为在选择特征A,时,集合D,的经验熵与条件熵之间的差异,计算如下:
具体地,当数据集D被特征A划分为两个子集时,信息增益表示为:
其中是第一个子集的比例,即:
信息增益的计算代码如下所示:
left_set, right_set = self.divideData(data, i, value)
# calculate information gain
ratio = float(len(left_set)/sample_num)
if ratio == 0.0:info_gain = init_entropy - (1 - ratio) * self.getEntropy(right_set[:, -1])
elif ratio == 1.0:info_gain = init_entropy - ratio*self.getEntropy(left_set[:, -1])
else:info_gain = init_entropy - ratio *self.getEntropy(left_set[:, -1]) - (1 - ratio) * self.getEntropy(right_set[:, -1])
到目前为止,我们已经学会了如何计算信息增益。但是,如何计算经验熵?经验熵是训练集标签的熵,由下式给出:
上面的等式看起来有点复杂,但很容易实现。我们来看看它的代码:
def getEntropy(self, labels):labels_num = len(labels)label_count = self.uniqueCount(labels)entropy = 0.0for j in label_count:prop = label_count[j]/labels_numentropy = entropy + (-prop*math.log(prop, 2))return entropy
决策树的生成
有许多算法可以生成决策树,例如ID3,C4.5。在本文中,我们以ID3算法为例生成决策树。
首先,让我们弄清楚特征选择后的分割过程。我们知道,特征选择是使数据可分类。因此,分割过程是根据所选择的特征index 及其选择的值value来划分训练数据。具体来说,拆分过程是如果样本中的特征值index大于value,则将样本添加到右子树中并删除样本中的index特征; 否则,如果样本中的特征值index小于value,则将样本添加到左子树中并删除样本中的index特征。拆分过程的代码是:
def divideData(self, data, index, value):left_set = []right_set = []# select feature in index with valuefor temp in data:if temp[index] >= value:# delete this featurenew_feature = np.delete(temp, index)right_set.append(new_feature)else:new_feature = np.delete(temp, index)left_set.append(new_feature)return np.array(left_set), np.array(right_set)
在生成决策树之前,我们定义一个数据结构以将节点保存在决策树中:
class DecisionNode:def __init__(self, index=-1, value=None, results=None, right_tree=None, left_tree=None):self.index = index # the index of featureself.value = value # the value of the feature with indexself.results = results # current decision resultself.right_tree = right_treeself.left_tree = left_tree
然后,我们可以递归地生成决策树。如果数据集中没有任何特征,请停止。如果信息增益小于给定阈值,请停止。否则,根据最佳选择的特征及其值拆分数据集,如下所示:
def createDecisionTree(self, data):# if there is no feature in data, stop divisionif len(data) == 0:self.tree_node = DecisionNode()return self.tree_nodebest_gain = 0.0best_criteria = Nonebest_set = Nonefeature_num = len(data[0]) - 1sample_num = len(data[:, -1])init_entropy = self.getEntropy(data[:, -1])# get the best divisionfor i in range(feature_num):uniques = np.unique(data[:, i])for value in uniques:left_set, right_set = self.divideData(data, i, value)# calculate information gainratio = float(len(left_set)/sample_num)if ratio == 0.0:info_gain = init_entropy - (1 - ratio) * self.getEntropy(right_set[:, -1])elif ratio == 1.0:info_gain = init_entropy - ratio*self.getEntropy(left_set[:, -1])else:info_gain = init_entropy - ratio * self.getEntropy(left_set[:, -1]) - (1 - ratio) * self.getEntropy(right_set[:, -1])if info_gain > best_gain:best_gain = info_gainbest_criteria = (i, value)best_set = (left_set, right_set)# create the decision treeif best_gain < self.t:self.tree_node = DecisionNode(results=self.uniqueCount(data[:, -1]))return self.tree_nodeelse:ltree = self.createDecisionTree(best_set[0])rtree = self.createDecisionTree(best_set[1])self.tree_node = DecisionNode(index=best_criteria[0],value=best_criteria[1], left_tree=ltree, right_tree=rtree)return self.tree_node
分类
分类原理就像二进制排序树,即将节点中存储的特征值与测试对象的相应特征值进行比较。然后,递归转向左子树或右子树,如下所示:
def classify(self, sample, tree):if tree.results != None:return tree.resultselse:value = sample[tree.index]branch = Noneif value >= tree.value:branch = tree.right_treeelse:branch = tree.left_treereturn self.classify(sample, branch)
结论与分析
在生成决策树之后,通过动态编程存在修剪过程以获得最佳决策树。此外,分类和回归树(CART)是一种决策树,不仅可以应用于分类,还可以应用于回归。最后,让我们将决策树与Sklearn中的树进行比较,检测性能如下所示:
从图中我们可以了解到决策树不如sklearn那么好,这可能是我们不应用修剪过程。
可以在MachineLearning中找到本文中的相关代码和数据集。
有兴趣的小伙伴可以查看上一篇或者下一篇。
原文地址:https://www.codeproject.com/Articles/4047359/Step-by-Step-Guide-To-Implement-Machine-Learning-2
实现机器学习的循序渐进指南II——决策树相关推荐
- 实现机器学习的循序渐进指南IX ——树回归
目录 介绍 回归模型 特征选择 回归树的生成 回归 结论与分析 可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表. 介绍 在现实世界中,一些关系不是线性的.因此,应用线性回归分析这些 ...
- 实现机器学习的循序渐进指南系列汇总
之前曾尝试翻译了机器学习中的KNN和决策树,最近这段时间陆续看到这个系列的相关文章,并尝试翻译分析.由于此系列文章直接相对零散,所以有了这篇简单的汇总文章,以帮助有兴趣的小伙伴迅速找到想看的文章. 具 ...
- 实现机器学习的循序渐进指南XII——Apriori
目录 介绍 Apriori模型 频繁项集 关联规则 结论与分析 可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表. 介绍 Apriori是一种学习频繁项集和关联规则的算法.Aprio ...
- 实现机器学习的循序渐进指南XI——DBSCAN
目录 介绍 DBSCAN模型 开始 聚类算法 参数估计 结论与分析 可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表. 介绍 基于密度的噪声应用空间聚类(DBSCAN)是一种基于密度 ...
- 实现机器学习的循序渐进指南X——KMeans
目录 介绍 KMeans模型 KMEANS 平分KMeans KMEANS ++ 结论与分析 可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表. 介绍 KMeans是一种简单的聚类算 ...
- 实现机器学习的循序渐进指南VIII——线性回归
目录 介绍 回归模型 线性回归 局部加权线性回归 岭回归 套索(Lasso)回归 逐步线性回归 结论与分析 可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表. 介绍 通常存在变量之间 ...
- 实现机器学习的循序渐进指南VII——Blending Stacking
目录 介绍 混合(Blending)模型 混合(Blending)架构 混合(Blending)实现 混合(Blending)分类 堆叠(Stacking)模型 堆叠(Stacking)架构 堆叠(S ...
- 实现机器学习的循序渐进指南VI——AdaBoost
目录 介绍 AdaBoost模型 弱分类器 权重更新 分类 结论与分析 可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表. 介绍 AdaBoost是Boosting的一种方法,它基于 ...
- 实现机器学习的循序渐进指南V——支持向量机
目录 介绍 SVM模型 优化问题 优化算法 分类 结论与分析 可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表. 介绍 支持向量机(SVM)是一种基于特征空间最大边距的分类器.SVM ...
最新文章
- jupyter笔记本_如何为Jupyter笔记本电脑设置PySpark
- js中报错“Maximum call stack size exceeded“解决方法
- python partition函数_如何使用正确的姿势进行高效Python函数式编程?
- 嵌入式web服务器预研报告(转)
- react json转换_Typescript + React 新手篇
- 解决nginx部署后css、js、图片等样式不加载的问题
- python自学-我是如何自学 Python 的
- [paper reading] 译 + 注 :如何阅读 Research Papers(Andrew Ng)
- JAVA Eclipse如何安装Swing
- MacBooster清理除Mac大文件和旧文件
- 由大脑工作原理,探讨向菩萨求聪明的灵验的科学原理
- 在centos中如何用yum安装最新的yum源
- Cordova--打包问题
- 无法创建java虚拟机_创建java虚拟机失败的解决方法
- xl2tpd服务一键安装
- APM Agent 之 动态注入 agent
- ORACLE--面试知识点
- Flink的基础概念
- DEJA_VU3D - Cesium功能集 之 007-军事标绘系列一:简单箭头
- 详细讲解Java整数类型
热门文章
- python的django框架是干嘛的_Django框架在Python开发很重要为什么?
- java link 使用_Java数据结构之简单的连接点(link)实现方法示例
- 国潮手绘海报素材,传统与现代碰撞之美
- 手机应用UI设计示例+模板|为了在下一个应用程序设计项目找到灵感
- UI设计实用排版法则,优秀可临摹案例,剖析设计实例
- UI设计干货模板|首页设计技巧
- mysql 删除数据_3.MySQL数据库创建、查询、删除
- Python爬虫项目---批量从搜款网下载主图、颜色图详情图
- libcareplus一个Qemu-6.1.0热补丁示例
- 关于FD.io VPP的最新消息