目录
1. 谈谈集成学习的概念和思想。
集成学习就是说将多个 “单个学习器(Individual Learner)”用某种策略来结合起来,组成一个“学习委员会(committee)”,使得整体的泛化性能得到大大提高。
2. 集成学习方法可以分为哪几类,并且分别阐述它们的特点。
根据集成思想,架构可分为两类: 即Boosting、Bagging |
Boosting
先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本的分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复进行,直至基学习器数目达到事先指定的值T,最后将这T个基学习器进行加权结合。
第一个人先来解决,这时候,有的问题被他很好的解决了,而有的问题(如市场推广问题)并没有很好的被解决。此刻,我们会将他并不能解决的问题给予更多的关注。怎么做,就是加大权重咯,也就是让第二个人更加关注这个问题吖,而对这个人已经解决了的问题则减少它的权重。
第二个人,知道上一个人市场推广这个问题没解决好,就重点讲一下自己对这个问题的想法,
当然也会根据每个人解决问题的能力赋予每个人不一样的权重,能力越高权重越大,比如市场部的,对市场的话语权较多,或者老板,权重更大。
直到有一天,遇到一个问题我们大家都不知道答案,然后大家分别去发表自己的观点,最后的结果是综合大家的看法给出的。也就是每个人的观点会结合这个人的权重之后综合得出。这里,每个人就是一个个的弱分类器。大家一起这样的组合就是强分类器。
Bagging
从初始训练数据集中采样出T个含m个训练样本的采样集,然后基于每个采样集训练出一个基学习器,再将这些基学习器根进行结合。
典型的例子有随机森林,第四题有举例
3. 在集成学习中,阐述针对二分类问题的AdaBoost算法实现过程。思考AdaBoost算法在每一轮如何改变训练数据的权值或概率分布?
算法流程
输入:样本集T={(
x
1
,
y
1
x_1,y_1
x1,y1),
x
2
,
y
2
x_2,y_2
x2,y2)…
x
N
,
y
N
x_N,y_N
xN,yN)},
y
i
∈
y_i\in
yi∈{-1,+1},弱分类器算法,弱分类器迭代次数K
输出:最终的强分类器f(x)
(1) 初始化样本集权重为
D
(
1
)
=
(
w
11
,
w
12
.
.
.
w
1
N
)
;
w
1
i
=
1
n
;
i
=
1
,
2...
N
D(1)=(w_{11},w_{12}...w_{1N});w_{1i}=\frac{1}{n};i=1,2...N
D(1)=(w11,w12...w1N);w1i=n1;i=1,2...N
(2) 对于k=1, 2, …, K
a) 使用权重D(k)的样本集来训练数据,得到弱分类器
b) 计算的分类误差率
这里 z k z_k zk是规范化因子
4.随机森林与集成学习之间有什么样的关系?
随机森林就是通过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树,而它的本质属于集成学习方法。
随机森林的名称中有两个关键词,一个是“随机”,一个就是“森林”。“森林”我们很好理解,一棵叫做树,那么成百上千棵就可以叫做森林了,这也是随机森林的主要思想–集成思想的体现。然而,bagging的代价是不用单棵决策树来做预测,具体哪个变量起到重要作用变得未知,所以bagging改进了预测准确率但损失了解释性。
“森林”容易理解,就是由很多“树”组成,那么“随机”体现在什么方面呢?
(1)训练集随机的选取:如果训练集大小为N,对于每棵树而言,随机且有放回地从训练集中的抽取N个训练样本(这种采样方式称为bootstrap sample方法),作为该树的训练集;这样保证了每颗树的训练集都不同,从而构建的树也不同
(2)特征的随机选取:从M个特征中选取m个特征,这样可以避免某个特征与分类结果具有强相关性,如果所有特征都选取,那么所有的树都会很相似,那样就不够“随机”了。
举一个关于随机森林工作原理解释的简单例子:
描述:根据已有的训练集已经生成了对应的随机森林,随机森林如何利用某一个人的年龄(Age)、性别(Gender)、教育情况(Highest Educational Qualification)、工作领域(Industry)以及住宅地(Residence)共5个字段来预测他的收入层次。 |
收入层次 :
Band 1 : Below $40,000
Band 2: $40,000 – 150,000
Band 3: More than $150,000
随机森林中每一棵树都可以看做是一棵CART(分类回归树),这里假设森林中有5棵CART树,总特征个数N=5,我们取m=1(这里假设每个CART树对应一个不同的特征)。 |
1. Age : 35 years ; 2. Gender : Male ; 3. Highest Educational Qualification : Diploma holder; 4. Industry : Manufacturing; 5. Residence : Metro. |
参考链接:https://www.cnblogs.com/ggzhangxiaochao/p/8652583.html
5. 用python实现基于单层决策树的AdaBoost算法。
import numpy as np
def loadSimData():
'''
输入:无
功能:提供一个两个特征的数据集
输出:带有标签的数据集
'''
datMat = np.matrix([[1. ,2.1],[2. , 1.1],[1.3 ,1.],[1. ,1.],[2. ,1.]])
classLabels = [1.0, 1.0, -1.0, -1.0, 1.0]
return datMat, classLabels
def stumpClassify(dataMatrix,dimen,thresholdValue,thresholdIneq):
'''
输入:数据矩阵,特征维数,某一特征的分类阈值,分类不等号
功能:输出决策树桩标签
输出:标签
'''
returnArray = np.ones((np.shape(dataMatrix)[0],1))
if thresholdIneq == 'lt':
returnArray[dataMatrix[:,dimen] <= thresholdValue] = -1
else:
returnArray[dataMatrix[:,dimen] > thresholdValue] = -1
return returnArray
def buildStump(dataArray,classLabels,D):
'''
输入:数据矩阵,对应的真实类别标签,特征的权值分布
功能:在数据集上,找到加权错误率(分类错误率)最小的单层决策树,显然,该指标函数与权重向量有密切关系
输出:最佳树桩(特征,分类特征阈值,不等号方向),最小加权错误率,该权值向量D下的分类标签估计值
'''
dataMatrix = np.mat(dataArray); labelMat = np.mat(classLabels).T
m,n = np.shape(dataMatrix)
stepNum = 10.0; bestStump = {}; bestClassEst = np.mat(np.zeros((m,1)))
minError = np.inf
for i in range(n):
rangeMin = dataMatrix[:,i].min(); rangeMax = dataMatrix[:,i].max()
stepSize = (rangeMax - rangeMin)/stepNum
for j in range(-1, int(stepNum)+1):
for thresholdIneq in ['lt', 'gt']:
thresholdValue = rangeMin + float(j) * stepSize
predictClass = stumpClassify(dataMatrix,i,thresholdValue,thresholdIneq)
errArray = np.mat(np.ones((m,1)))
errArray[predictClass == labelMat] = 0
weightError = D.T * errArray
#print "split: dim %d, thresh: %.2f,threIneq:%s,weghtError %.3F" %(i,thresholdValue,thresholdIneq,weightError)
if weightError < minError:
minError = weightError
bestClassEst = predictClass.copy()
bestStump['dimen'] = i
bestStump['thresholdValue'] = thresholdValue
bestStump['thresholdIneq'] = thresholdIneq
return bestClassEst, minError, bestStump
def adaBoostTrainDS(dataArray,classLabels,numIt=40):
'''
输入:数据集,标签向量,最大迭代次数
功能:创建adaboost加法模型
输出:多个弱分类器的数组
'''
weakClass = []#定义弱分类数组,保存每个基本分类器bestStump
m,n = np.shape(dataArray)
D = np.mat(np.ones((m,1))/m)
aggClassEst = np.mat(np.zeros((m,1)))
for i in range(numIt):
print ("i:",i)
bestClassEst, minError, bestStump = buildStump(dataArray,classLabels,D)#step1:找到最佳的单层决策树
print ("D.T:", D.T)
alpha = float(0.5*np.log((1-minError)/max(minError,1e-16)))#step2: 更新alpha
print ("alpha:",alpha)
bestStump['alpha'] = alpha
weakClass.append(bestStump)#step3:将基本分类器添加到弱分类的数组中
print ("classEst:",bestClassEst)
expon = np.multiply(-1*alpha*np.mat(classLabels).T,bestClassEst)
D = np.multiply(D, np.exp(expon))
D = D/D.sum()#step4:更新权重,该式是让D服从概率分布
aggClassEst += alpha*bestClassEst#steo5:更新累计类别估计值
print("aggClassEst:",aggClassEst.T)
print (np.sign(aggClassEst) != np.mat(classLabels).T)
aggError = np.multiply(np.sign(aggClassEst) != np.mat(classLabels).T,np.ones((m,1)))
print ("aggError",aggError)
aggErrorRate = aggError.sum()/m
print( "total error:",aggErrorRate)
if aggErrorRate == 0.0: break
return weakClass
def adaTestClassify(dataToClassify,weakClass):
dataMatrix = np.mat(dataToClassify)
m =np.shape(dataMatrix)[0]
aggClassEst = np.mat(np.zeros((m,1)))
for i in range(len(weakClass)):
classEst = stumpClassify(dataToClassify,weakClass[i]['dimen'],weakClass[i]['thresholdValue']\
,weakClass[i]['thresholdIneq'])
aggClassEst += weakClass[i]['alpha'] * classEst
print( aggClassEst)
return np.sign(aggClassEst)
if __name__ == '__main__':
D =np.mat(np.ones((5,1))/5)
dataMatrix ,classLabels= loadSimData()
bestClassEst, minError, bestStump = buildStump(dataMatrix,classLabels,D)
weakClass = adaBoostTrainDS(dataMatrix,classLabels,9)
testClass = adaTestClassify(np.mat([0,0]),weakClass)
参考链接:https://blog.csdn.net/LY_ysys629/article/details/72842067