本博客仅用于知识记录,方便自己学习,有错误之处欢迎指正
若有雷同请联系我
参考:清华大学 袁博老师 数据挖掘课程
参考:https://www.cnblogs.com/earendil/p/8872001.html
代码参考:https://www.jianshu.com/p/ef16be5b66f4?utm_source=oschina-app
1. boosting与bagging的区别:
1)boosting是串行训练的,而bagging是可以将多个分类器并行训练
2)bagging是有放回的取样本,boosting不需要以bootstrap的方式取样
3)bagging每个样本的权重是一样的,boosting不同样本权重不一样,对分错的样本增加权重,分对的下调权重,从而达到更着重训练这些样本的目的
2.小例子(例子来源袁博老师课程):
先用数据训练第一个分类器c1,然后对c1进行测试,在c1中被分错的样本将在训练c2的时候着重训练(每次测试完,会对样本的权重进行调整)
训练得到c2后,继续进行测试,重新调整训练集,然后训练c3,一直训练到分类器个数达到要求。对重对N个学习器加权结合
3.Adaboost——经典的boosting算法
,Adaboost会给每个学习器添加一个α权重,这个α是固定的,不会变化,
是学习器错误率
分类正确的样本权重,分类错误的权重调整
伪代码:
import numpy as np
def getAlpha(error):
alpha = 0.5 * np.math.log((1.0 - error) / max(error, 1e-16))
return alpha
#通过阈值对数据分类+1 -1
#dimen为dataMat的列索引值,即特征位置;threshIneq为阈值对比方式,大于或小于
def stumpClassify(dataMatrix, dimen, threshVal, threshIneq):
retArray = np.ones((dataMatrix.shape[0],1))
#阈值的模式,将小于某一阈值的特征归类为-1
if threshIneq=='lt':#less than
retArray[dataMatrix[:,dimen] <= threshVal]=-1.0
#将大于某一阈值的特征归类为-1
else:#greater than
retArray[dataMatrix[:,dimen] > threshVal]=-1.0
return retArray
#单层决策树生成函数
def buildStump(dataArr, labels, D):
dataMatrix = dataArr
labels = np.squeeze(labels.T)
m, n = dataMatrix.shape #m是样本数,n是特征数
#步长或区间总数 最优决策树信息 最优单层决策树预测结果
numSteps=10.0
bestStump={}
bestClasEst = np.zeros((m,1))
minError = np.inf
#遍历数据集的每个特征:遍历特征的每个步长:遍历步长的每个阈值对比方式
for i in range(n):
rangeMin = dataMatrix[:, i].min()
rangeMax = dataMatrix[:, i].max()
stepSize = (rangeMax - rangeMin) / 2.
for j in range(-1, int(numSteps) + 1):
for inequal in ['lt', 'gt']:
thresV = rangeMin + float(j) * stepSize
predV = stumpClassify(dataMatrix, i, thresV, inequal)
errArr = np.ones((m, 1))
errArr[np.squeeze(predV.T) == labels] = 0
weightError = np.dot(D.T, errArr)
if weightError < minError:
minError = weightError
bestClasEst = predV.copy()
bestStump['dim']=i
bestStump['thresh']=thresV
bestStump['ineq']=inequal
return bestStump,minError,bestClasEst
def Adaboost(dataArr, labels, num=40):
weakClassArr = []
m = dataArr.shape[0]
D = np.ones((m, 1)) / m
aggClassEst = np.zeros((m, 1))
labels = labels[np.newaxis, :].T
for i in range(num):
bestStump, minError, bestClasEst = buildStump(dataArr, labels, D)
alpha = getAlpha(minError)
bestStump['alpha'] = alpha
weakClassArr.append(bestStump)
expon = np.multiply(-1 * alpha * labels, bestClasEst)
D = np.multiply(np.exp(expon), D) / np.sum(D)
# D = np.squeeze(D)
if len(D.shape) > 2:
D = np.squeeze(D, 0)
aggClassEst += alpha * bestClasEst
aggError = np.multiply(np.sign(aggClassEst) != labels.T, np.ones((m, 1)))
errorRate = aggError.sum() / m
if errorRate == 0:
break
return weakClassArr, errorRate, aggClassEst