更新AdaBoost算法

This commit is contained in:
jiangzhonglian
2017-07-10 16:42:52 +08:00
parent ea3231b6b4
commit c701ebebbd
4 changed files with 58 additions and 52 deletions

View File

@@ -11,7 +11,7 @@
机器学习处理问题时又何尝不是如此? 这就是元算法(meta-algorithm)背后的思想。
* 集成方法: 1. 投票选举 2. 再学习
> bagging基于数据随机重抽样的分类构造方法
> bagging基于数据随机重抽样的分类构造方法
* 自举汇聚法(bootstrap aggregating)也称为bagging方法是在从原始数据集选择S次后得到S个新数据集的一种技术。
1. 新数据集和原数据集的大小相等。
@@ -71,7 +71,7 @@
```
发现:
alpha目的主要是计算每一个分类器实例的权重(组合就是分类结果)
分类的权重值:最大的值,为alpha的加和最小值-最大值
分类的权重值:最大的值=alpha的加和最小值=-最大值
D的目的是为了计算错误概率 weightedError = D.T*errArr求最佳分类器
特征的权重值如果一个值误判的几率越小那么D的特征权重越少
```
@@ -92,6 +92,8 @@ D的目的是为了计算错误概率 weightedError = D.T*errArr求最佳
如果错误率等于0.0,则退出循环
```
![AdaBoost代码流程图](/images/7.AdaBoost/adaboost_code-flow-chart.jpg "AdaBoost代码流程图")
## 处理非均衡分类问题
> 概念

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

View File

@@ -43,9 +43,9 @@ def stumpClassify(dataMat, dimen, threshVal, threshIneq):
"""stumpClassify(将数据集按照feature列的value进行 二分法切分比较来赋值分类)
Args:
dataMat Matrix数据集
dimen 特征列
threshVal 特征列要比较的值
dataMat Matrix数据集
dimen 特征列
threshVal 特征列要比较的值
Returns:
retArray 结果集
"""
@@ -110,11 +110,11 @@ def buildStump(dataArr, labelArr, D):
# 例如: 一个都没错,那么错误率= 0.2*0=0 5个都错那么错误率= 0.2*5=1 只错3个那么错误率= 0.2*3=0.6
weightedError = D.T*errArr
'''
dim 表示 feature列
threshVal 表示树的分界值
inequal 表示计算树左右颠倒的错误率的情况
weightedError 表示整体结果的错误率
bestClasEst 预测的最优结果
dim 表示 feature列
threshVal 表示树的分界值
inequal 表示计算树左右颠倒的错误率的情况
weightedError 表示整体结果的错误率
bestClasEst 预测的最优结果
'''
# print "split: dim %d, thresh %.2f, thresh ineqal: %s, the weighted error is %.3f" % (i, threshVal, inequal, weightedError)
if weightedError < minError:
@@ -155,7 +155,7 @@ def adaBoostTrainDS(dataArr, labelArr, numIt=40):
# store Stump Params in Array
weakClassArr.append(bestStump)
# print "alpha=%s, classEst=%s, bestStump=%s, error=%s " % (alpha, classEst.T, bestStump, error)
print "alpha=%s, classEst=%s, bestStump=%s, error=%s " % (alpha, classEst.T, bestStump, error)
# -1主要是下面求e的-alpha次方 如果判断正确乘积为1否则成绩为-1这样就可以算出分类的情况了
expon = multiply(-1*alpha*mat(labelArr).T, classEst)
print '\n'
@@ -207,8 +207,11 @@ def plotROC(predStrengths, classLabels):
Args:
predStrengths 最终预测结果的权重值
classLabels 原始数据的分类结果集
classLabels 原始数据的分类结果集
"""
print 'predStrengths=', predStrengths
print 'classLabels=', classLabels
import matplotlib.pyplot as plt
# variable to calculate AUC
ySum = 0.0
@@ -221,6 +224,8 @@ def plotROC(predStrengths, classLabels):
# argsort函数返回的是数组值从小到大的索引值
# get sorted index, it's reverse
sortedIndicies = predStrengths.argsort()
# 测试结果是否是从小到大排列
print 'sortedIndicies=', sortedIndicies, predStrengths[0, 176], predStrengths.min(), predStrengths[0, 293], predStrengths.max()
# 开始创建模版对象
fig = plt.figure()
@@ -239,7 +244,7 @@ def plotROC(predStrengths, classLabels):
ySum += cur[1]
# draw line from cur to (cur[0]-delX, cur[1]-delY)
# 画点连线 (x1, x2, y1, y2)
# print cur[0], cur[0]-delX, cur[1], cur[1]-delY
print cur[0], cur[0]-delX, cur[1], cur[1]-delY
ax.plot([cur[0], cur[0]-delX], [cur[1], cur[1]-delY], c='b')
cur = (cur[0]-delX, cur[1]-delY)
# 画对角的虚线线
@@ -260,47 +265,46 @@ def plotROC(predStrengths, classLabels):
if __name__ == "__main__":
# 我们要将5个点进行分类
dataArr, labelArr = loadSimpData()
print 'dataArr', dataArr, 'labelArr', labelArr
# # 我们要将5个点进行分类
# dataArr, labelArr = loadSimpData()
# print 'dataArr', dataArr, 'labelArr', labelArr
# D表示最初值对1进行均分为5份平均每一个初始的概率都为0.2
# D的目的是为了计算错误概率 weightedError = D.T*errArr
D = mat(ones((5, 1))/5)
print 'D=', D.T
# # D表示最初值对1进行均分为5份平均每一个初始的概率都为0.2
# # D的目的是为了计算错误概率 weightedError = D.T*errArr
# D = mat(ones((5, 1))/5)
# print 'D=', D.T
# bestStump, minError, bestClasEst = buildStump(dataArr, labelArr, D)
# print 'bestStump=', bestStump
# print 'minError=', minError
# print 'bestClasEst=', bestClasEst.T
# # bestStump, minError, bestClasEst = buildStump(dataArr, labelArr, D)
# # print 'bestStump=', bestStump
# # print 'minError=', minError
# # print 'bestClasEst=', bestClasEst.T
# # 分类器weakClassArr
# # 历史累计的分类结果集
# weakClassArr, aggClassEst = adaBoostTrainDS(dataArr, labelArr, 9)
# print '\nweakClassArr=', weakClassArr, '\naggClassEst=', aggClassEst.T
# 分类器weakClassArr
# 历史累计的分类结果集
weakClassArr, aggClassEst = adaBoostTrainDS(dataArr, labelArr, 9)
print '\nweakClassArr=', weakClassArr, '\naggClassEst=', aggClassEst.T
# """
# 发现:
# 分类的权重值最大的值为alpha的加和最小值为-最大值
# 特征的权重值如果一个值误判的几率越小那么D的特征权重越少
# """
"""
发现:
分类的权重值最大的值为alpha的加和最小值为-最大值
特征的权重值如果一个值误判的几率越小那么D的特征权重越少
"""
# # 测试数据的分类结果, 观测aggClassEst分类的最终权重
# print adaClassify([0, 0], weakClassArr).T
# print adaClassify([[5, 5], [0, 0]], weakClassArr).T
# 测试数据的分类结果, 观测aggClassEst分类的最终权重
print adaClassify([0, 0], weakClassArr).T
print adaClassify([[5, 5], [0, 0]], weakClassArr).T
# # 马疝病数据集
# # 训练集合
# dataArr, labelArr = loadDataSet("input/7.AdaBoost/horseColicTraining2.txt")
# weakClassArr, aggClassEst = adaBoostTrainDS(dataArr, labelArr, 40)
# print weakClassArr, '\n-----\n', aggClassEst.T
# # 计算ROC下面的AUC的面积大小
# plotROC(aggClassEst.T, labelArr)
# # 测试集合
# dataArrTest, labelArrTest = loadDataSet("input/7.AdaBoost/horseColicTest2.txt")
# m = shape(dataArrTest)[0]
# predicting10 = adaClassify(dataArrTest, weakClassArr)
# errArr = mat(ones((m, 1)))
# # 测试:计算总样本数,错误样本数,错误率
# print m, errArr[predicting10 != mat(labelArrTest).T].sum(), errArr[predicting10 != mat(labelArrTest).T].sum()/m
# 马疝病数据集
# 训练集合
dataArr, labelArr = loadDataSet("input/7.AdaBoost/horseColicTraining2.txt")
weakClassArr, aggClassEst = adaBoostTrainDS(dataArr, labelArr, 40)
print weakClassArr, '\n-----\n', aggClassEst.T
# 计算ROC下面的AUC的面积大小
plotROC(aggClassEst.T, labelArr)
# 测试集合
dataArrTest, labelArrTest = loadDataSet("input/7.AdaBoost/horseColicTest2.txt")
m = shape(dataArrTest)[0]
predicting10 = adaClassify(dataArrTest, weakClassArr)
errArr = mat(ones((m, 1)))
# 测试:计算总样本数,错误样本数,错误率
print m, errArr[predicting10 != mat(labelArrTest).T].sum(), errArr[predicting10 != mat(labelArrTest).T].sum()/m

View File

@@ -4,7 +4,7 @@
"""
Created on 2017-07-10
Updated on 2017-07-10
@author: 片刻Noel Dawe
@author: 片刻Noel Dawe
《机器学习实战》更新地址https://github.com/apachecn/MachineLearning
sklearn-AdaBoost译文链接: http://cwiki.apachecn.org/pages/viewpage.action?pageId=10813457
"""