决策树随笔

独自空忆成欢 提交于 2020-04-18 11:15:59

决策树原理

决策树是一种多功能的机器学习算法,它可以实现分类和回归任务,甚至是多输出任务。它们功能强大,能够拟合 复杂的数据集。

  • -优点:简单直观,基本不需要预处理,不用会议华,处理缺失值,精度高、对异常值不敏感、无数据输入假定。可以处理离散或连续值,可以处理多维度输出的分类问题
  • 缺点:计算复杂度高、容易过拟合,泛化能力不好,可能因为样本的一点点改动导致树的结构剧烈改变,空间复杂度高。
  • 适用数据范围:数值型和标称型。
    创建分支的伪代码函数createBranch()如下所示:
    检测数据集中的每个子项是否属于同一分类:

If so return 类标签;
Else 
 		寻找划分数据集的最好特征
 		划分数据集
 		创建分支节点
 				for 每个划分的子集
 						调用函数createBranch并增加返回结果到分支节点中
		 return 分支节点

上面的伪代码createBranch是一个递归函数,在倒数第二行直接调用了它自己。

其工作原理很简单如图所示的流程图就是一个决策树,长方形代表判断模块(decision block),椭圆形代表终止模块(terminating block),表示已经得出结论,可以终止运行。从判断模块引出的左右箭头称作分支(branch),它可以到达另一个判断模块或者终止模块。
在这里插入图片描述
k-近邻算法可以完成很多分类任务,但是它最大的缺点就是无法给出数据的内在含义,决策树的主要优势就在于数据形式非常容易理解。决策树需要的数据准备工作非常少,特别是,完全不需要进行特征缩放或集中。

(1) 收集数据:可以使用任何方法。
(2) 准备数据:树构造算法只适用于标称型数据,因此数值型数据必须离散化。
(3) 分析数据:可以使用任何方法,构造树完成之后,我们应该检查图形是否符合预期。
(4) 训练算法:构造树的数据结构。
(5) 测试算法:使用经验树计算错误率。
(6) 使用算法:此步骤可以适用于任何监督学习算法,而使用决策树可以更好地理解数据
的内在含义。

做出预测

以鸢尾花分类为例(有四个特征,三种类别),如图显示了决策树的决策边界。加粗直线表示根节点(深度0) 的决策边界:花瓣长度=2.45厘米。因为左侧区域是纯的(只有Setosa 鸢尾花),所以它不可再分。但是右侧区域是不纯的,所以深度1右 侧的节点在花瓣宽度=1.75厘米处(虚线所示)再次分裂。因为这里 最大深度max_depth设置为2,所以决策树在此停止。但是如果你将 max_depth设置为3,那么两个深度为2的节点将各自再产生一条决策 边界(点线所示)。在这里插入图片描述

决策树的分类

1.CLS算法

CLS (Concept Learning System)学习算法是Hunt.E.B等人在1966年提出的。它第一次提出了用决策树进行概念学习,后来的许多决策树学习算法都可以看作是CLS算法的改进与更新。CLS的主要思想是从一个空的决策树出发,通过添加新的判定节点来改善原来的决策树,直到树能够正确地将训练实例分类为止。它对决策树的构造过程也就是假设特化的过程,所以CLS可以看作是只带一个操作符的学习算法。此操作可以表示为: 通过添加一个新的判定条件(新的判定节点),特化当前假设。CLS算法递归调用这个操作符,作用在每个叶节点_上来构造决策树。

2.ID3算法

ID3 (Iterative Dichotomizer3)算法是Quinlan在1986年提出的。它是决策树算法的代表,绝大多数决策树算法都是在它的基础.上加以改进而实现的。它采用分治策略,在决策树各级节点上选择属性时,用信息增益作为属性的选择标准,以便在每一个非叶节点上进行测试时,能获得关于被测试记录最大的类别信息具体方法是:检测所有的属性,选择信息增益最大的属性产生决策树节点,由该属性的不同取值建立分支,再对各分支的子集递归调用该方法建立决策树节点的分支,直到所有子集仅包含同一类别的数据为止。最后得到一棵决策树,它可以对新的样本进行分类。

3.C4.5算法

C4.5算法是Quinlan.J.R在1993年提出的,它是从ID3算法演变而来,继承了ID3 算法的优点,C4.5算法引入了新的方法和功能:.

  • 用信息增益的概念,克服了用信息增益选择属性时偏向多值属性的不足;
  • 在树构造程中进行剪枝,以避免树的过度拟合;
  • 能够对连续属性的离散化处理;
  • 可以处理具有缺少属性值的训练样本集;
  • 能够对不完整数据进行处理;
  • K折交叉验证;

C4.5算法降低了计算复杂度,增强了计算的效率。它对于ID3算法的重要改进是使用信息增益率来选择属性。理论和实验表明,采用信息增益率比采用信息增益效果更好,主要是克服了ID3方法选择偏向取值多的属性。C4. 5算法还针对连续值属性的数据进行了处理,弥补了ID3算法只能处理离散值属性数据的缺陷。
然而C4.5算法在处理连续型测试属性中线性搜索阈值付出了很大代价。在2002 年,Salvatore Ruggieri提出了C4.5的改进算法: EC4. 5算法。EC4. 5算法采用二分搜索取代线性搜索,从而克服了这个缺点。实验明,在生成同样一-棵决策树时, 与C4.5算法相比,EC4. 5算法可将效率提高5倍,但缺点EC4. 5算法占用内存多。5.SLIQ算法上述算法由于要求训练样本集驻留内存,因此不适合处理大规模数据。为此,IBM研究人员在1996年提出了一-种更快速的、可伸缩的、适合处理较大规模数据的决策树分类算法SLIQ (SupervisedLearning In Quest)算法。它综合利用属性表、类表和类直方图来建树。属性表含有两个字段:属性值和样本号。类表也含有

4.CART训练算法

Scikit-Learn使用的是分类与回归树(Classification And Regression Tree,简称CART)算法来训练决策树(也叫作“生 长”树)。想法非常简单:首先,使用单个特征k和阈值tk(例如,花瓣长度≤2.45厘米)将训练集分成两个子集。k和阈值tk怎么选择?答案是产生出最纯子集(受其大小加权)的k和tk就是经算法搜索确定的(t,tk)。
在这里插入图片描述
一旦成功将训练集一分为二,它将使用相同的逻辑,继续分裂子集,然后是子集的子集,依次循环递进。直到抵达最大深度(由超参数max_depth控制下文有说明)。减小max_depth可使模型正则化,从而降低过度拟合的风险。),或是再也找不到能够降低不纯度的分裂,它才会停止。

计算复杂度

进行预测需要从根到叶遍历决策树。通常来说,决策树大致平衡,因此遍历决策树需要经历大约O(log2(m))个节点。(注:log2是以2为底的对数。等于log2(m)=log(m)/log(2)。)而每个节点只需要检查一个特征值,所以总体预测复杂度也只是O(log2(m)),与特征数量无关。如此,即便是处理大型数据集,预测也很快。但是,训练时在每一个节点,算法都需要在所有样本上比较所有特征(如果设置了max_features会少一些)。这导致训练的复杂度为O(n×m log(m))。对于小型训练集(几千个实例以内),Scikit_learn可以通过对数据预处理(设置presort=True)来加快训练,但是对于较大训练集而言,可能会减慢训练的速度。

正则化超参数

决策树极少对训练数据做出假设(比如线性模型就正好相反,它显然假设数据是线性的)。如果不加以限制,树的结构将跟随训练集变化,严密拟合,并且很可能过度拟合。这种模型通常被称为非参数模型,这不是说它不包含任何参数(事实上它通常有很多参数),而是指在训练之前没有确定参数的数量,导致模型结构自由而紧密地贴近数据。相应的参数模型,比如线性模型,则有预先设定好的一部分参数,因此其自由度受限,从而降低了过度拟合的风险(但是增加了拟合不足的风险)。可如下对其优化。

1. 限制枝叶

为避免过度拟合,需要在训练过程中降低决策树的自由度,这个过程被称为正则化。正则化超参数的选择取决于你所使用的模型,但是通常来说,至少可以限制决策树的最大深度。超参数max_depth控制(默认值为None,意味着无限制)。减小max_depth可使模型正则化,从而降低过度拟合的风
险。
参数

  • min_samples_split(分裂前节点必须有的最小样本数)
  • min_samples_leaf(叶节点必须有的最小样本数量)
  • min_weight_fraction_leaf(跟min_samples_leaf一样,但表现为加权实例总数的占比)
  • max_leaf_nodes(最大叶节点数量)
  • max_features(分裂每个节点评估的最大特征数量)。增大超参数
  • min_*或是减小max_*将使模型正则化。

2. 修枝剪叶

还可以先不加约束地训练模型,然后再对不必要的节点进行
剪枝(删除)。如果一个节点的子节点全部为叶节点,则该节点可被认为不必要,除非它所表示的纯度提升有重要的统计意义。标准统计测试,比如χ2测试,是用来估算“提升纯粹是出于偶然”(被称为虚假设)的概率。如果这个概率(称之为p值)高于一个给定阈值(通常是5%,由超参数控制),那么这个节点可被认为不必要,其子节点可被删除。直到所有不必要的节点都被删除,剪枝过程结束。

很明显左图无限制,而过度拟合;右图用min_samples_leaf进行限制,其泛化效果更佳。
在这里插入图片描述

回归

决策树也可以做回归分析, 与分类不同的是,回归预测的是一个值而不是一个类别。
例如,如果你想要对一个 x 1 = 0.6 x_1=0.6 x1=0.6的新实例进行预测,那么从根节点开始遍历,最后到达预测value=0.1106的叶节点。这个预测结果其实就是与这个叶节点关联的110个实例的平均目标值。在这110个实例上,预测产生的均方误差(MSE)等于0.0151。
在这里插入图片描述
与分类任务一样,决策树在处理回归任务时也很容易过度拟合。
在这里插入图片描述



问题

1.如果训练集有100万个实例,训练决策树(无约束)大致的深 度是多少?
答:一个包含m个叶节点的均衡二叉树的深度等于log2(m)(注:log2表示以2为底的log函数,log2(m)=log(m)/log(2)。)的四舍五入。通常来说,二元决策树训练到最后大体都是平衡的,如果不加以限制,最后平均每个叶节点一个实例。因此,如果训练集包含一百万个实例,那么决策树深度约等于log2(106)≈20层(实际上会更多一些因为决策树通常不可能完美平衡)。

2.如果决策树过度拟合训练集,减少max_depth是否为一个好主 意?
答:降低max_depth可能是一个好主意,因为这会限制模型,使其正则化。

3.如果决策树对训练集拟合不足,尝试缩放输入特征是否为一个 好主意?
答:决策树的优点之一就是它们不关心训练数据是否缩放或是集中,所以如果决策树对训练集拟合不足,缩放输入特征不过是浪费时间罢了。

4.如果在包含100万个实例的训练集上训练决策树需要一个小 时,那么在包含1000万个实例的训练集上训练决策树,大概需要多长 时间?
答:决策树的训练复杂度为O(n×mlog(m))。所以,如果将训 练集大小乘以10,训练时间将乘以K=(n×10m×log(10m))/ (n×m×log(m))=10×log(10m)/log(m)。如果m=106,那么 K≈11.7,所以训练1000万个实例大约需要11.7小时。

由于本人是初学者,对很多算法参数还不太了解,所以借鉴摘抄的很多,并将其融合,在此就不一一点名出处了,希望理解。我没有写多少代码,主要是感觉写上会使篇幅太大,也没有写多推理在公式,(关键自己才大一,绝大部分都看不懂)就言简意赅写一些基本知识。
另,本文主要参考于《机器学习实战:基于Scikit-Learn和TensorFlow》这本书,如有需求(还有很多关于Python和机器学习资料),可关注并私信我,必一一送达。
毕竟新手,有错误之处还望赐教,还望支持,不喜勿喷,并希望找到写志同道合的朋友一起学习。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!