利用Python实现adaboost算法
时间: 2023-06-10 18:02:40 浏览: 99
Adaboost算法是一种非常流行的集成学习算法,它能够通过组合多个弱分类器来得到一个强分类器。利用Python实现Adaboost算法的步骤如下:
1. 准备数据集:Adaboost算法需要使用一个训练集来训练多个弱分类器,所以需要准备一个带标签的数据集。
2. 初始化权重向量:对于每个样本点,初始时都赋予相同的权重。
3. 对于每个弱分类器:
- 训练弱分类器:根据当前的权重向量,使用训练数据集训练一个弱分类器。
- 计算错误率:对于所有分类错误的样本点,增加它们的权重,减少分类正确的样本点的权重。
- 计算弱分类器的权重:根据分类器的错误率计算其权重。
- 更新权重向量:根据样本点的分类情况,更新每个样本点的权重。
4. 将所有弱分类器组合起来形成一个强分类器,其分类结果是所有弱分类器的加权和。
代码实现可以参考以下例子:
```python
import numpy as np
def stumpClassify(dataMatrix, dimen, threshVal, threshIneq):
retArray = np.ones((np.shape(dataMatrix)[0], 1))
if threshIneq == 'lt':
retArray[dataMatrix[:, dimen] <= threshVal] = -1.0
else:
retArray[dataMatrix[:, dimen] > threshVal] = -1.0
return retArray
def buildStump(dataArr, classLabels, D):
dataMatrix = np.mat(dataArr)
labelMat = np.mat(classLabels).T
m, n = np.shape(dataMatrix)
numSteps = 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)/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 = np.mat(np.ones((m,1)))
errArr[predictedVals == labelMat] = 0
weightedError = D.T * errArr
if weightedError < minError:
minError = weightedError
bestClassEst = predictedVals.copy()
bestStump['dim'] = i
bestStump['thresh'] = threshVal
bestStump['ineq'] = inequal
return bestStump, minError, bestClassEst
def adaBoostTrainDS(dataArr, classLabels, numIt=40):
weakClassArr = []
m = np.shape(dataArr)[0]
D = np.mat(np.ones((m,1))/m)
aggClassEst = np.mat(np.zeros((m,1)))
for i in range(numIt):
bestStump, error, classEst = buildStump(dataArr, classLabels, D)
alpha = float(0.5*np.log((1.0-error)/max(error, 1e-16)))
bestStump['alpha'] = alpha
weakClassArr.append(bestStump)
expon = np.multiply(-1*alpha*np.mat(classLabels).T, classEst)
D = np.multiply(D, np.exp(expon))
D = D/D.sum()
aggClassEst += alpha*classEst
aggErrors = np.multiply(np.sign(aggClassEst) != np.mat(classLabels).T, np.ones((m,1)))
errorRate = aggErrors.sum()/m
print "total error: ",errorRate
if errorRate == 0.0: break
return weakClassArr, aggClassEst
dataMat = np.mat([[0,0.1],[1.0,1.0],[1.3,1.0],[1.4,0.9],[1.5,-0.1],[1.8,0.8],[2.0,1.0],[0.7,0.2],[1.7,0.3]])
classLabels = [1.0,1.0,-1.0,-1.0,-1.0,1.0,1.0,-1.0,-1.0]
weakClassArr, aggClassEst = adaBoostTrainDS(dataMat, classLabels, 9)
```
注:以上代码仅为示例,实际应用时可能需要进行调整。
阅读全文