使用AdaBoost算法训练分类器 Parameters: dataArr - 数据矩阵 classLabels - 数据标签 numIt - 最大迭代次数 Returns: weakClassArr - 训练好的分类器 aggClassEst - 类别估计累计值
(dataArr, classLabels, numIt = 40)
| 83 | return bestStump, minError, bestClasEst |
| 84 | |
| 85 | def adaBoostTrainDS(dataArr, classLabels, numIt = 40): |
| 86 | """ |
| 87 | 使用AdaBoost算法训练分类器 |
| 88 | Parameters: |
| 89 | dataArr - 数据矩阵 |
| 90 | classLabels - 数据标签 |
| 91 | numIt - 最大迭代次数 |
| 92 | Returns: |
| 93 | weakClassArr - 训练好的分类器 |
| 94 | aggClassEst - 类别估计累计值 |
| 95 | """ |
| 96 | weakClassArr = [] |
| 97 | m = np.shape(dataArr)[0] |
| 98 | D = np.mat(np.ones((m, 1)) / m) #初始化权重 |
| 99 | aggClassEst = np.mat(np.zeros((m,1))) |
| 100 | for i in range(numIt): |
| 101 | bestStump, error, classEst = buildStump(dataArr, classLabels, D) #构建单层决策树 |
| 102 | # print("D:",D.T) |
| 103 | alpha = float(0.5 * np.log((1.0 - error) / max(error, 1e-16))) #计算弱学习算法权重alpha,使error不等于0,因为分母不能为0 |
| 104 | bestStump['alpha'] = alpha #存储弱学习算法权重 |
| 105 | weakClassArr.append(bestStump) #存储单层决策树 |
| 106 | # print("classEst: ", classEst.T) |
| 107 | expon = np.multiply(-1 * alpha * np.mat(classLabels).T, classEst) #计算e的指数项 |
| 108 | D = np.multiply(D, np.exp(expon)) |
| 109 | D = D / D.sum() #根据样本权重公式,更新样本权重 |
| 110 | #计算AdaBoost误差,当误差为0的时候,退出循环 |
| 111 | aggClassEst += alpha * classEst #计算类别估计累计值 |
| 112 | # print("aggClassEst: ", aggClassEst.T) |
| 113 | aggErrors = np.multiply(np.sign(aggClassEst) != np.mat(classLabels).T, np.ones((m,1))) #计算误差 |
| 114 | errorRate = aggErrors.sum() / m |
| 115 | # print("total error: ", errorRate) |
| 116 | if errorRate == 0.0: break #误差为0,退出循环 |
| 117 | return weakClassArr, aggClassEst |
| 118 | |
| 119 | |
| 120 | def plotROC(predStrengths, classLabels): |