目录

介绍

决策树模型

特征选择

决策树的生成

分类

结论与分析


可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表。

介绍

决策原则并不复杂。从根节点开始,将节点中存储的特征值与测试对象的相应特征值进行比较。然后,根据比较结果递归地转向左子树或右子树。最后,叶节点的标签是测试对象的预测。

例如,下面有一个决策树,其中功能集是{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

决策树的生成

有许多算法可以生成决策树,例如ID3C4.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——决策树相关推荐

  1. 实现机器学习的循序渐进指南IX ——树回归

    目录 介绍 回归模型 特征选择 回归树的生成 回归 结论与分析 可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表. 介绍 在现实世界中,一些关系不是线性的.因此,应用线性回归分析这些 ...

  2. 实现机器学习的循序渐进指南系列汇总

    之前曾尝试翻译了机器学习中的KNN和决策树,最近这段时间陆续看到这个系列的相关文章,并尝试翻译分析.由于此系列文章直接相对零散,所以有了这篇简单的汇总文章,以帮助有兴趣的小伙伴迅速找到想看的文章. 具 ...

  3. 实现机器学习的循序渐进指南XII——Apriori

    目录 介绍 Apriori模型 频繁项集 关联规则 结论与分析 可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表. 介绍 Apriori是一种学习频繁项集和关联规则的算法.Aprio ...

  4. 实现机器学习的循序渐进指南XI——DBSCAN

    目录 介绍 DBSCAN模型 开始 聚类算法 参数估计 结论与分析 可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表. 介绍 基于密度的噪声应用空间聚类(DBSCAN)是一种基于密度 ...

  5. 实现机器学习的循序渐进指南X——KMeans

    目录 介绍 KMeans模型 KMEANS 平分KMeans KMEANS ++ 结论与分析 可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表. 介绍 KMeans是一种简单的聚类算 ...

  6. 实现机器学习的循序渐进指南VIII——线性回归

    目录 介绍 回归模型 线性回归 局部加权线性回归 岭回归 套索(Lasso)回归 逐步线性回归 结论与分析 可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表. 介绍 通常存在变量之间 ...

  7. 实现机器学习的循序渐进指南VII——Blending Stacking

    目录 介绍 混合(Blending)模型 混合(Blending)架构 混合(Blending)实现 混合(Blending)分类 堆叠(Stacking)模型 堆叠(Stacking)架构 堆叠(S ...

  8. 实现机器学习的循序渐进指南VI——AdaBoost

    目录 介绍 AdaBoost模型 弱分类器 权重更新 分类 结论与分析 可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表. 介绍 AdaBoost是Boosting的一种方法,它基于 ...

  9. 实现机器学习的循序渐进指南V——支持向量机

    目录 介绍 SVM模型 优化问题 优化算法 分类 结论与分析 可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表. 介绍 支持向量机(SVM)是一种基于特征空间最大边距的分类器.SVM ...

最新文章

  1. jupyter笔记本_如何为Jupyter笔记本电脑设置PySpark
  2. js中报错“Maximum call stack size exceeded“解决方法
  3. python partition函数_如何使用正确的姿势进行高效Python函数式编程?
  4. 嵌入式web服务器预研报告(转)
  5. react json转换_Typescript + React 新手篇
  6. 解决nginx部署后css、js、图片等样式不加载的问题
  7. python自学-我是如何自学 Python 的
  8. [paper reading] 译 + 注 :如何阅读 Research Papers(Andrew Ng)
  9. JAVA Eclipse如何安装Swing
  10. MacBooster清理除Mac大文件和旧文件
  11. 由大脑工作原理,探讨向菩萨求聪明的灵验的科学原理
  12. 在centos中如何用yum安装最新的yum源
  13. Cordova--打包问题
  14. 无法创建java虚拟机_创建java虚拟机失败的解决方法
  15. xl2tpd服务一键安装
  16. APM Agent 之 动态注入 agent
  17. ORACLE--面试知识点
  18. Flink的基础概念
  19. DEJA_VU3D - Cesium功能集 之 007-军事标绘系列一:简单箭头
  20. 详细讲解Java整数类型

热门文章

  1. python的django框架是干嘛的_Django框架在Python开发很重要为什么?
  2. java link 使用_Java数据结构之简单的连接点(link)实现方法示例
  3. 国潮手绘海报素材,传统与现代碰撞之美
  4. 手机应用UI设计示例+模板|为了在下一个应用程序设计项目找到灵感
  5. UI设计实用排版法则,优秀可临摹案例,剖析设计实例
  6. UI设计干货模板|首页设计技巧
  7. mysql 删除数据_3.MySQL数据库创建、查询、删除
  8. Python爬虫项目---批量从搜款网下载主图、颜色图详情图
  9. libcareplus一个Qemu-6.1.0热补丁示例
  10. 关于FD.io VPP的最新消息