机器学习算法总结 决策树(含代码)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
def buildStump(dataArr,classLabels,D): dataMatrix = mat(dataArr); labelMat = mat(classLabels).T m,n = shape(dataMatrix)
numSteps = 10.0; bestStump = {}; bestClasEst = mat(zeros((m,1))) minError = inf for i in range(n): rangeMin = dataMatrix[:,i].min(); rangeMax = dataMatrix[:,i].max(); stepSize = (rangeMax-rangeMin)/numSteps for j in range(-1,int(numSteps)+1): for inequal in ['lt', 'gt']: threshVal = (rangeMin + float(j) * stepSize) predictedVals = stumpClassify(dataMatrix,i,threshVal,inequal) errArr = mat(ones((m,1))) errArr[predictedVals == labelMat] = 0 weightedError = D.T*errArr if weightedError < minError: minError = weightedError bestClasEst = predictedVals.copy() bestStump['dim'] = i bestStump['thresh'] = threshVal bestStump['ineq'] = inequal return bestStump,minError,bestClasEst 上述程序包含两个函数。第一个函数 stumpClassfy() 是通过阈值比较对数据进行分类 的,所有的阈值一边的数据会分到类别-1,而在另一边的数据分到类别+1.该函数可以通过 数组过滤来实现,首先将返回数组的全部元素设置为1,然后将所有不满足不等式要求的元 素设置为 -1,可以给予数据集中的任意元素进行比较,同时也可以将不等号在大于、小于 之间切换。 第二个函数 buildStump() 将会遍历 stumpClassfy() 函数所有可能的输入,并找到数 据集上最佳的单层决策树。在确保输入数据符合矩阵格式之后,整个函数就开始执行了,然 后函数将构建一个称为 bestStump 的空字典,这个字典用语存储给定权重向量 D 时所得 到的最佳单层决策树的相关信息。变量 numSteps 用于在特征的所有可能值上进行遍历。 而变量 minError 则在一开始就初始化成正无穷大,之后用语寻找可能的最小错误率。
f ( X ) mb ( X ; m )
m 1 M
(6-2)
提升算法的目的是对以下公式的优化:
min L( yi , f ( xi ))
f i 1
N
(6-3)
ˆ ) 称为损失函数(loss function) 其中, L( y, y , f 是 ABM 模型。不同的损失函数有着不
1 log i 2 1 i 1 log i 2 1 i
N
yi i
f 0 ( X ) arg min L( y i , f ( x i ; ))
i 1
( m , m ) arg min L( yi , fm 1( xi ) ( xi ; ))
i ( xi ) y
wi ,m e
i ( xi ) y N i 1
wi ,m e e
w
i 1
N
i ,m
I ( yi ( xi )) e wi ,m
i 1
N
(6-10)
1 errm 1 其中, m log 2 errm
m , m
min L yi , m ( xi ; m )
i 1
N
(6-5)
表1 常见损失函数以及相应提升算法 名称 平方误 差 绝对误 差 指数损 失 对数损 失 损失函数
1 ( yi f ( xi )) 2 2 yi f ( xi ) exp yi f ( xi ) log 1 e yi fi
导数
yi f ( xi )
f* y | xi
算法 L2Boosting Gradient boosting AdaBoost LogitBoost (6-6) (6-7) (6-8)
sgn( yi f ( xi ))
median ( y | xi )
y i exp y i f ( xi )
f M ( x ) T x; m
m 1 M
(6-16)
引入前向分步算法:
ˆ arg min L( y , f ( x ) T ( x ; )) m i m 1 i i m
m i 1
m
N
(6-17)
已知 f m 1 ( x ) 求得 m {R jm , jm }1J ,已知 R jm 求 jm :
图1 过拟合现象示意图 提 升 算 法 是 一 种 为 了 拟 合 自 适 应 基 函 数 模 型 ( adaptive basis-function models, ABM)的贪心算法,自适应基函数模型可表达为:
f X w0 wmm X
m 1 M
(6-1)
其中, m 是一种分类算法或者回归算法,被称为弱分类器( weak learner )或者基分 类器(base learner) 。也可以表达为如下形式:
,
i 1
N
f m ( X ) f m 1 ( X ) m ( X ; m )
算法不进行回溯对参数进行修改,因此该算法称为前向分步算法。
6.2 AdaBoost 算法
AdaBoost( Adaptive boosting)算法,也称为自适应提升算法。训练数据中的每个 样本,并赋予其一个权重,这些权重构成向量 D。一开始,这些权重都初始化为相等值,首 先在训练数据上训练出一个弱分类器并计算该分类器的错误率,然后在同一数据集上再次训 练弱分类器。再次训练分类器的过程中,将会重新调整每个样本的权重,其中上一次分对的 样本权重会降低,而上一次分错的样本权重会提高。
, errm
i m ( xi )) wi , m I ( y
w i 1 i , m
N
, errm 称为分类误差率。则可以得到第
m 个分类器:
f m ( X ) f m 1 ( X ) m ( X )
(6-11)
计算第 m+1个分类器的参数可以通过下式得到:
im ( xi ) i m ( xi )) 1) i m ( xi )) m wi , m 1 wi , m e m y wi , m e m (2 I ( y wi , m e 2 m I ( y e
N i 1
wi
5 Compute m log 6 Set wi wi e
i mI ( y
1 errm ( m 2 m ) errm
m ( xi ))
7 Return f ( x) sgn ( X ) m 1 m m
M
算法结束条件是训练错误率为 0 或者弱分类器数目达到用户指定的值。在具体应用 AdaBoost 算法时,可以将其总结为以下的一般流程: (1) (2) (3) (4) (5) (6) 收集数据:可以使用任意方法; 准备数据:依赖于所使用弱分类器的类型,这里 k-近邻、决策树、朴素贝叶 斯、逻辑回归、支持向量机等任意分类算法都可以作为本部分弱分类器; 分析数据:可使用任意方法; 训练算法:AdaBoost 算法大部分时间都用在训练上,分类器将多次在同一数 据集上训练弱分类器; 测试算法:计算分类错误率; 使用算法:同支持向量机类似,AdaBoost 算法预测两个类别中的一个,如果 想应用多分类,需要做与支持向量机类似的相应修改。
图2 AdaBoost 算法示意图 给定一个二类分类的训练数据集 T {( x1 , y1 ), ( x2 , y 2 ), , ( x N , y N )} ,其中,每个样本点由实例 与标记组成,实例 xi R n ,标记 yi Y {1, 1} , 是实例空间, Y 是标记集合。损失函数 可以表达为:
i ( f m 1( xi ) ( xi ))] wi ,m exp( y i ( xi )) Lm ( ) exp[ y
i 1 i 1 N N
(6-9)
i f m 1 ( xi )) , y i 1, 1 ,则可以有如下推导: 其中, wi ,m exp( y Lm ( ) e
同的性质,对应不同的提升算法,如表1所示。 将(2)式代入(3)式可得如下表达式:
N M min L yi , m ( xi ; m ) m , m i 1 m 1
(6-4)
因为学习的是加法模型,如果能够从前向后,每一步只学习一个基分类器及其系数,那 么就可以简化优化的复杂度,具体推导过程如下所示:
L( y j , j )
(6-15)
决策树模型是一种传统的学习方法,易于被理解,相比较人工神经网络,我们能够清晰 地了解如何构建决策树,而且决策树模型无信息丢失。但是决策树模型也存在不稳定的缺 点,训练样本较小的变化会导致结果的较大差异。为解决这一问题,研究者主要通过提升算 法来对决策树模型进行优化,即所谓的提升树( Boosting tree) ,其基本算法思路为,构 建多个决策树,多个决策树决策结果的加权平均对样本的变化不敏感。 提升树模型是一系列的决策树的和:
x R j f (x ) j
(6-13) (6-14)
因此决策树则可以表Hale Waihona Puke Baidu为如下形式:
T x; j I x R j
j 1 J
其中, {R j , j }1J ,该参数由最小化经验风险计算得到:
arg min
J
j 1 x j R j
(6-12)
总结起来 Adaboost 算法主要有以下7步。 1 wi 1 N 2 for m 1: M do 3 Fit a classifier m ( X ) to the training set using weights w 4 Compute errm i 1
N
i m ( xi )) wi , m I ( y
第六章 提升算法
6.1 引言
当做重要决定时,大家可能都会考虑吸取多个专家而不是一个人的意见。机器学习处理 问题时也是如此,这就是提升算法背后的思路,提升算法是对其它算法进行组合的一种方 式,接下来我们将对提升算法,以及提升算法中最流行的一个算法 AdaBoost 算法进行介 绍,并对提升树以及简单的基于单层决策树的 Adaboost 算法进行讨论。 提升方法是一种常用的统计学习方法,应用广泛且有效,在分类问题上,它通过改变训 练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类性能。一个分类 器在训练数据上能够获得比其他分类器更好的拟合,但是在训练数据外的数据集上却不能很 好的拟合数据,这时就称为该分类器出现了过拟合(overfitting) 。提升算法能够有效地防 止过拟合现象的发生。
ˆ jm arg min
jm
xi R jm
L( yi , fm 1( xi ) jm )
(6-18)
6.4 基于单层决策树的 AdaBoost 算法
单层决策树( decision stump ,也称决策树桩)是一种简单的决策树,仅基于单个特 征来做决策,由于这棵树只有一次分裂过程,因此它实际上就是一个树桩。利用 Python 对单层决策树进行实现,代码如下: def stumpClassify(dataMatrix,dimen,threshVal,threshIneq): retArray = ones((shape(dataMatrix)[0],1)) if threshIneq == 'lt': retArray[dataMatrix[:,dimen] <= threshVal] = -1.0 else: retArray[dataMatrix[:,dimen] > threshVal] = -1.0 return retArray
6.3 提升树
分 类 与 回 归 树 ( Classification and regression trees, CART ) 又 称 为 决 策 树 ( decision tree ) ,使用分类数与回归树作为基本分类器的提升方法,称为提升树 (Boosting tree) 。
图3 决策树示意图 决策树模型将空间分为数个互不相交的区域 R j , j 1,, J ,每一个区域作为树的叶子节 点,并为每个区域分配一个参数 j :