diff --git a/docs/7.1.利用AdaBoost元算法提高分类.md b/docs/7.1.利用AdaBoost元算法提高分类.md index 75a3a2ff..75f705c9 100644 --- a/docs/7.1.利用AdaBoost元算法提高分类.md +++ b/docs/7.1.利用AdaBoost元算法提高分类.md @@ -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代码流程图") + ## 处理非均衡分类问题 > 概念 diff --git a/images/7.AdaBoost/adaboost_code-flow-chart.jpg b/images/7.AdaBoost/adaboost_code-flow-chart.jpg new file mode 100644 index 00000000..f1e288be Binary files /dev/null and b/images/7.AdaBoost/adaboost_code-flow-chart.jpg differ diff --git a/src/python/7.AdaBoost/adaboost.py b/src/python/7.AdaBoost/adaboost.py index 9bd19538..1672f9bd 100644 --- a/src/python/7.AdaBoost/adaboost.py +++ b/src/python/7.AdaBoost/adaboost.py @@ -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 diff --git a/src/python/7.AdaBoost/sklearn-adaboost-demo.py b/src/python/7.AdaBoost/sklearn-adaboost-demo.py index f313aefe..c685d9c9 100644 --- a/src/python/7.AdaBoost/sklearn-adaboost-demo.py +++ b/src/python/7.AdaBoost/sklearn-adaboost-demo.py @@ -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 """