From e0bdc42ed68e2c2667487b585d9e1dc9b8a39bee Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Fri, 25 Aug 2017 16:53:21 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=207.=E9=9B=86=E6=88=90?= =?UTF-8?q?=E6=96=B9=E6=B3=95=20AdaBoost=E9=A1=B9=E7=9B=AE=E6=A1=88?= =?UTF-8?q?=E4=BE=8B.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/7.集成方法-随机森林和AdaBoost.md | 34 +++++++++++++-------------- src/python/7.AdaBoost/adaboost.py | 13 +++++----- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/docs/7.集成方法-随机森林和AdaBoost.md b/docs/7.集成方法-随机森林和AdaBoost.md index 34724cf6..2c4a8825 100644 --- a/docs/7.集成方法-随机森林和AdaBoost.md +++ b/docs/7.集成方法-随机森林和AdaBoost.md @@ -356,15 +356,15 @@ def evaluate_algorithm(dataset, algorithm, n_folds, *args): #### 开发流程 ``` -收集数据:提供的文本文件。 -准备数据:确保类别标签是+1和-1,而非1和0。 -分析数据:手工检查数据。 -训练算法:在数据上,利用 adaBoostTrainDS() 函数训练出一系列的分类器。 -测试算法:我们拥有两个数据集。在不采用随机抽样的方法下,我们就会对 AdaBoost 和 Logistic 回归的结果进行完全对等的比较。 -使用算法:观察该例子上的错误率。不过,也可以构建一个 Web 网站,让驯马师输入马的症状然后预测马是否会死去。 +收集数据:提供的文本文件 +准备数据:确保类别标签是+1和-1,而非1和0 +分析数据:统计分析 +训练算法:在数据上,利用 adaBoostTrainDS() 函数训练出一系列的分类器 +测试算法:我们拥有两个数据集。在不采用随机抽样的方法下,我们就会对 AdaBoost 和 Logistic 回归的结果进行完全对等的比较 +使用算法:观察该例子上的错误率。不过,也可以构建一个 Web 网站,让驯马师输入马的症状然后预测马是否会死去 ``` -> 收集数据:提供的文本文件。 +> 收集数据:提供的文本文件 训练数据:horseColicTraining.txt
测试数据:horseColicTest.txt @@ -375,7 +375,7 @@ def evaluate_algorithm(dataset, algorithm, n_folds, *args): 2.000000 1.000000 38.300000 40.000000 24.000000 1.000000 1.000000 3.000000 1.000000 3.000000 3.000000 1.000000 0.000000 0.000000 0.000000 1.000000 1.000000 33.000000 6.700000 0.000000 0.000000 1.000000 ``` -> 准备数据:确保类别标签是+1和-1,而非1和0。 +> 准备数据:确保类别标签是+1和-1,而非1和0 ```python def loadDataSet(fileName): @@ -394,7 +394,7 @@ def loadDataSet(fileName): return dataArr, labelArr ``` -> 分析数据:手工检查数据。 +> 分析数据:统计分析 过拟合(overfitting, 也称为过学习) * 发现测试错误率在达到一个最小值之后有开始上升,这种现象称为过拟合。 @@ -405,7 +405,7 @@ def loadDataSet(fileName): ![过拟合](/images/7.AdaBoost/过拟合图解.png) -> 训练算法:在数据上,利用 adaBoostTrainDS() 函数训练出一系列的分类器。 +> 训练算法:在数据上,利用 adaBoostTrainDS() 函数训练出一系列的分类器 ```python def adaBoostTrainDS(dataArr, labelArr, numIt=40): @@ -420,7 +420,7 @@ def adaBoostTrainDS(dataArr, labelArr, numIt=40): """ weakClassArr = [] m = shape(dataArr)[0] - # 初始化 D,设置每个特征的权重值,平均分为m份 + # 初始化 D,设置每个样本的权重值,平均分为m份 D = mat(ones((m, 1))/m) aggClassEst = mat(zeros((m, 1))) for i in range(numIt): @@ -435,12 +435,12 @@ def adaBoostTrainDS(dataArr, labelArr, numIt=40): weakClassArr.append(bestStump) print "alpha=%s, classEst=%s, bestStump=%s, error=%s " % (alpha, classEst.T, bestStump, error) - # -1主要是下面求e的-alpha次方; 如果判断正确,乘积为1,否则成绩为-1,这样就可以算出分类的情况了 + # 分类正确:乘积为1,不会影响结果,-1主要是下面求e的-alpha次方 + # 分类错误:乘积为 -1,结果会受影响,所以也乘以 -1 expon = multiply(-1*alpha*mat(labelArr).T, classEst) - # 判断正确的,就乘以-1,否则就乘以1, 为什么? 书上的公式。 print '(-1取反)预测值expon=', expon.T # 计算e的expon次方,然后计算得到一个综合的概率的值 - # 结果发现: 判断错误的特征,D对于的特征的权重值会变大。 + # 结果发现: 判断错误的样本,D对于的样本权重值会变大。 D = multiply(D, exp(expon)) D = D/D.sum() @@ -460,10 +460,10 @@ def adaBoostTrainDS(dataArr, labelArr, numIt=40): ``` 发现: -alpha (模型权重)目的主要是计算每一个分类器实例的权重(组合就是分类结果) +alpha (模型权重)目的主要是计算每一个分类器实例的权重(加和就是分类结果) 分类的权重值:最大的值= alpha 的加和,最小值=-最大值 -D (特征权重)的目的是为了计算错误概率: weightedError = D.T*errArr,求最佳分类器 - 特征的权重值:如果一个值误判的几率越小,那么 D 的特征权重越少 +D (样本权重)的目的是为了计算错误概率: weightedError = D.T*errArr,求最佳分类器 + 样本的权重值:如果一个值误判的几率越小,那么 D 的样本权重越小 ``` ![AdaBoost算法权重计算公式](/images/7.AdaBoost/adaboost_alpha.png "AdaBoost算法权重计算公式") diff --git a/src/python/7.AdaBoost/adaboost.py b/src/python/7.AdaBoost/adaboost.py index c86cb94a..368895fb 100644 --- a/src/python/7.AdaBoost/adaboost.py +++ b/src/python/7.AdaBoost/adaboost.py @@ -148,15 +148,16 @@ def adaBoostTrainDS(dataArr, labelArr, numIt=40): # 得到决策树的模型 bestStump, error, classEst = buildStump(dataArr, labelArr, D) - # alpha目的主要是计算每一个分类器实例的权重(组合就是分类结果) - # 计算每个分类器的alpha权重值 + # alpha 目的主要是计算每一个分类器实例的权重(加和就是分类结果) + # 计算每个分类器的 alpha 权重值 alpha = float(0.5*log((1.0-error)/max(error, 1e-16))) bestStump['alpha'] = alpha # store Stump Params in Array weakClassArr.append(bestStump) # print "alpha=%s, classEst=%s, bestStump=%s, error=%s " % (alpha, classEst.T, bestStump, error) - # -1主要是下面求e的-alpha次方; 如果判断正确,乘积为1,否则成绩为-1,这样就可以算出分类的情况了 + # 分类正确:乘积为1,不会影响结果,-1主要是下面求e的-alpha次方 + # 分类错误:乘积为 -1,结果会受影响,所以也乘以 -1 expon = multiply(-1*alpha*mat(labelArr).T, classEst) # print '\n' # print 'labelArr=', labelArr @@ -166,11 +167,11 @@ def adaBoostTrainDS(dataArr, labelArr, numIt=40): # 判断正确的,就乘以-1,否则就乘以1, 为什么? 书上的公式。 # print '(-1取反)预测值expon=', expon.T # 计算e的expon次方,然后计算得到一个综合的概率的值 - # 结果发现: 判断错误的特征,D对于的特征的权重值会变大。 + # 结果发现: 判断错误的样本,D对于的样本权重值会变大。 D = multiply(D, exp(expon)) D = D/D.sum() - print "D: ", D.T - print '\n' + # print "D: ", D.T + # print '\n' # 预测的分类结果值,在上一轮结果的基础上,进行加和操作 # print '当前的分类结果:', alpha*classEst.T