在数据挖掘中,分类算法能够说是核心算法,其中 AdaBoost 算法与随机森林算法同样都属于分类算法中的集成算法。
/*请尊重做者劳动成果,转载请标明原文连接:*/
集成的含义就是集思广益,博取众长,当咱们作决定的时候,咱们先听取多个专家的意见,再作决定。集成算法一般有两种方式,分别是投票选举(bagging)和再学习(boosting)。投票选举的场景相似把专家召集到一个会议桌前,当作一个决定的时候,让 K 个专家(K 个模型)分别进行分类,而后选择出现次数最多的那个类做为最终的分类结果。再学习至关于把 K 个专家(K 个分类器)进行加权融合,造成一个新的超级专家(强分类器),让这个超级专家作判断。
因此你能看出来,投票选举和再学习仍是有区别的。Boosting 的含义是提高,它的做用是每一次训练的时候都对上一次的训练进行改进提高,在训练的过程当中这 K 个“专家”之间是有依赖性的,当引入第 K 个“专家”(第 K 个分类器)的时候,其实是对前 K-1 个专家的优化。而 bagging 在作投票选举的时候能够并行计算,也就是 K 个“专家”在作判断的时候是相互独立的,不存在依赖性。
2、 AdaBoost 的工做原理
AdaBoost 的英文全称是 Adaptive Boosting,中文含义是自适应提高算法。它由 Freund 等人于 1995 年提出,是对 Boosting 算法的一种实现。
什么是 Boosting 算法呢?Boosting 算法是集成算法中的一种,同时也是一类算法的总称。这类算法经过训练多个弱分类器,将它们组合成一个强分类器,也就是咱们俗话说的“三个臭皮匠,顶个诸葛亮”。为何要这么作呢?由于臭皮匠好训练,诸葛亮却很差求。所以要打造一个诸葛亮,最好的方式就是训练多个臭皮匠,而后让这些臭皮匠组合起来,这样每每能够获得很好的效果。这就是 Boosting 算法的原理。
我能够用上面的图来表示最终获得的强分类器,你能看出它是经过一系列的弱分类器根据不一样的权重组合而成的。
假设弱分类器为 G_{i}(x) ,它在强分类器中的权重 α_{i} ,那么就能够得出强分类器 f(x):
有了这个公式,为了求解强分类器,你会关注两个问题:
1.如何获得弱分类器,也就是在每次迭代训练的过程当中,如何获得最优弱分类器?
2.每一个弱分类器在强分类器中的权重是如何计算的?
咱们先来看下第二个问题。实际上在一个由 K 个弱分类器中组成的强分类器中,若是弱分类器的分类效果好,那么权重应该比较大,若是弱分类器的分类效果通常,权重应该下降。因此咱们须要基于这个弱分类器对样本的分类错误率来决定它的权重,用公式表示就是:
其中 e_{i} 表明第 i 个分类器的分类错误率。
而后咱们再来看下第一个问题,如何在每次训练迭代的过程当中选择最优的弱分类器?
实际上,AdaBoost 算法是经过改变样本的数据分布来实现的。AdaBoost 会判断每次训练的样本是否正确分类,对于正确分类的样本,下降它的权重,对于被错误分类的样本,增长它的权重。再基于上一次获得的分类准确率,来肯定此次训练样本中每一个样本的权重。而后将修改过权重的新数据集传递给下一层的分类器进行训练。这样作的好处就是,经过每一轮训练样本的动态权重,可让训练的焦点集中到难分类的样本上,最终获得的弱分类器的组合更容易获得更高的分类准确率。
咱们能够用 D_{k+1} 表明第 k+1 轮训练中,样本的权重集合,其中 W_{k+1,1} 表明第 k+1 轮中第一个样本的权重,以此类推 W_{k+1,N} 表明第 k+1 轮中第 N 个样本的权重,所以用公式表示为:
第 k+1 轮中的样本权重,是根据该样本在第 k 轮的权重以及第 k 个分类器的准确率而定,具体的公式为:
3、 AdaBoost 算法示例
了解 AdaBoost 的工做原理以后,咱们看一个例子,假设我有 10 个训练样本,以下所示:
如今我但愿经过 AdaBoost 构建一个强分类器。
该怎么作呢?按照上面的 AdaBoost 工做原理,咱们来模拟一下。
首先在第一轮训练中,咱们获得 10 个样本的权重为 1/10,即初始的 10 个样本权重一致,D1=(0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1)。
假设我有 3 个基础分类器:
咱们能够知道分类器 f1 的错误率为 0.3,也就是 x 取值 六、七、8 时分类错误;分类器 f2 的错误率为 0.4,即 x 取值 0、一、二、9 时分类错误;分类器 f3 的错误率为 0.3,即 x 取值为 三、四、5 时分类错误。
这 3 个分类器中,f一、f3 分类器的错误率最低,所以咱们选择 f1 或 f3 做为最优分类器,假设咱们选 f1 分类器做为最优分类器,即第一轮训练获得:
根据分类器权重公式获得:
而后咱们对下一轮的样本更新求权重值,代入 W_{k+1,i} 和 D_{k+1} 的公式,能够获得新的权重矩阵:D2=(0.0715, 0.0715, 0.0715, 0.0715, 0.0715, 0.0715, 0.1666, 0.1666, 0.1666, 0.0715)。
在这 3 个分类器中,f3 分类器的错误率最低,所以咱们选择 f3 做为第二轮训练的最优分类器,即:
根据分类器权重公式获得:
一样,咱们对下一轮的样本更新求权重值,代入 W_{k+1,i} 和 D_{k+1} 的公式,能够获得 D3=(0.0455,0.0455,0.0455,0.1667, 0.1667,0.01667,0.1060, 0.1060, 0.1060, 0.0455)。
在第三轮训练中,咱们继续统计三个分类器的准确率,能够获得分类器 f1 的错误率为 0.1060*3,也就是 x 取值 六、七、8 时分类错误。分类器 f2 的错误率为 0.0455*4,即 x 取值为 0、一、二、9 时分类错误。分类器 f3 的错误率为 0.1667*3,即 x 取值 三、四、5 时分类错误。
在这 3 个分类器中,f2 分类器的错误率最低,所以咱们选择 f2 做为第三轮训练的最优分类器,即:
咱们根据分类器权重公式获得:
假设咱们只进行 3 轮的训练,选择 3 个弱分类器,组合成一个强分类器,那么最终的强分类器 G(x) = 0.4236G1(x) + 0.6496G2(x)+0.7514G3(x)。
实际上 AdaBoost 算法是一个框架,你能够指定任意的分类器,一般咱们能够采用 CART 分类器做为弱分类器。经过上面这个示例的运算,你体会一下 AdaBoost 的计算流程便可。
4、 如何使用 AdaBoost 工具
咱们能够直接在 sklearn 中使用 AdaBoost。若是咱们要用 AdaBoost 进行分类,须要在使用前引用代码:
1 from sklearn.ensemble import AdaBoostClassifier
咱们以前讲到过,若是你看到了 Classifier 这个类,通常都会对应着 Regressor 类。AdaBoost 也不例外,回归工具包的引用代码以下:
1 from sklearn.ensemble import AdaBoostRegressor
咱们先看下如何在 sklearn 中建立 AdaBoost 分类器。
咱们须要使用 AdaBoostClassifier(base_estimator=None, n_estimators=50, learning_rate=1.0, algorithm=’SAMME.R’, random_state=None) 这个函数,其中有几个比较主要的参数,我分别来说解下:
1. base_estimator:表明的是弱分类器。在 AdaBoost 的分类器和回归器中都有这个参数,在 AdaBoost 中默认使用的是决策树,通常咱们不须要修改这个参数,固然你也能够指定具体的分类器。
2. n_estimators:算法的最大迭代次数,也是分类器的个数,每一次迭代都会引入一个新的弱分类器来增长原有的分类器的组合能力。默认是 50。
3. learning_rate:表明学习率,取值在 0-1 之间,默认是 1.0。若是学习率较小,就须要比较多的迭代次数才能收敛,也就是说学习率和迭代次数是有相关性的。当你调整 learning_rate 的时候,每每也须要调整 n_estimators 这个参数。
4. algorithm:表明咱们要采用哪一种 boosting 算法,一共有两种选择:SAMME 和 SAMME.R。默认是 SAMME.R。这二者之间的区别在于对弱分类权重的计算方式不一样。
5. random_state:表明随机数种子的设置,默认是 None。随机种子是用来控制随机模式的,当随机种子取了一个值,也就肯定了一种随机规则,其余人取这个值能够获得一样的结果。若是不设置随机种子,每次获得的随机数也就不一样。
那么如何建立 AdaBoost 回归呢?
咱们可使用 AdaBoostRegressor(base_estimator=None, n_estimators=50, learning_rate=1.0, loss=‘linear’, random_state=None) 这个函数。
你能看出来回归和分类的参数基本是一致的,不一样点在于回归算法里没有 algorithm 这个参数,但多了一个 loss 参数。
loss 表明损失函数的设置,一共有 3 种选择,分别为 linear、square 和 exponential,它们的含义分别是线性、平方和指数。默认是线性。通常采用线性就能够获得不错的效果。
建立好 AdaBoost 分类器或回归器以后,咱们就能够输入训练集对它进行训练。咱们使用 fit 函数,传入训练集中的样本特征值 train_X 和结果 train_y,模型会自动拟合。使用 predict 函数进行预测,传入测试集中的样本特征值 test_X,而后就能够获得预测结果。
5、 如何用 AdaBoost 对房价进行预测
了解了 AdaBoost 工具包以后,咱们看下 sklearn 中自带的波士顿房价数据集。 这个数据集一共包括了 506 条房屋信息数据,每一条数据都包括了 13 个指标,以及一个房屋价位。
13 个指标的含义,能够参考下面的表格:
这些指标分析得仍是挺细的,但实际上,咱们不用关心具体的含义,要作的就是如何经过这 13 个指标推导出最终的房价结果。
首先加载数据,将数据分割成训练集和测试集,而后建立 AdaBoost 回归模型,传入训练集数据进行拟合,再传入测试集数据进行预测,就能够获得预测结果。最后将预测的结果与实际结果进行对比,获得二者之间的偏差。具体代码以下:
复制代码
1 from sklearn.model_selection import train_test_split
2
3 from sklearn.metrics import mean_squared_error
4
5 from sklearn.datasets import load_boston
6
7 from sklearn.ensemble import AdaBoostRegressor
8
9 # 加载数据
10
11 data=load_boston()
12
13 # 分割数据
14
15 train_x, test_x, train_y,www.yisheng3yuL.com test_y = train_test_split(data.data, data.target, test_size=0.25, random_state=33)
16
17 # 使用 AdaBoost 回归模型
18
19 regressor=AdaBoostRegressor()
20
21 regressor.fit(train_x,train_y)
22
23 pred_y = regressor.predict(test_www.qunfenyul.com x)
24
25 mse = mean_squared_error(test_y, pred_y)
26
27 print(" 房价预测结果 ", pred_y)
28
29 print(" 均方偏差 = ",round(mse,2))
复制代码
运行结果:
复制代码
1 房价预测结果 [20.2 10.4137931 14.63820225 17.80322581 24.58931298 21.25076923
2
3 27.52222222 17.8372093 31.www.chaoyul.com 79642857 20.86428571 27.87431694 31.09142857
4
5 12.81666667 24.13131313 12.81666667 24.58931298 17.80322581 17.66333333
6
7 27.83 24.58931298 17.66333333 20.90823529 20.10555556 20.90823529
8
9 28.20877193 20.10555556 21.16882129 24.58931298 13.27619048 31.09142857
10
11 17.08095238 26.19217391 9.975 21.03404255 26.74583333 31.09142857
12
13 25.83960396 11.859375 13.38235294 24.58931298 14.97931034 14.46699029
14
15 30.12777778 17.66333333 26.19217391 20.10206186 17.70540541 18.45909091
16
17 26.19217391 20.10555556 17.www.renheeyuLe.com 66333333 33.31025641 14.97931034 17.70540541
18
19 24.64421053 20.90823529 25.83960396 17.08095238 24.58931298 21.43571429
20
21 19.31617647 16.33733333 46.04888889 21.25076923 17.08095238 25.83960396
22
23 24.64421053 11.81470588 17.80322581 27.63636364 23.59731183 17.94444444
24
25 17.66333333 27.7253886 20.21465517 46.04888889 14.97931034 9.975
26
27 17.08095238 24.13131313 21.03404255 13.4 11.859375 26.19214286
28
29 21.25076923 21.03404255 47.11395349 16.33733333 43.21111111 31.65730337
30
31 30.12777778 20.10555556 17.8372093 18.40833333 14.97931034 33.31025641
32
33 24.58931298 22.88813559 18.27179487 17.80322581 14.63820225 21.16882129
34
35 26.91538462 24.64421053 13.05 14.97931034 9.975 26.19217391
36
37 12.81666667 26.19214286 49.46511628 13.27619048 17.70540541 25.83960396
38
39 31.09142857 24.13131313 21.25076923 21.03404255 26.91538462 21.03404255
40
41 21.16882129 17.8372093 12.81666667 21.03404255 21.03404255 17.08095238
42
43 45.16666667]
44
45 均方偏差 = 18.05
复制代码
这个数据集是比较规范的,咱们并不须要在数据清洗,数据规范化上花太多精力,代码编写起来比较简单。
一样,咱们可使用不一样的回归分析模型分析这个数据集,好比使用决策树回归和 KNN 回归。
编写代码以下:
复制代码
1 # 使用决策树回归模型
2
3 dec_regressor=DecisionTreeRegressor()
4
5 dec_regressor.fit(train_x,train_y)
6
7 pred_y = dec_regressor.predict(test_x)
8
9 mse = mean_squared_error(test_www.kunlunyule.com, pred_y)
10
11 print(" 决策树均方偏差 = ",round(mse,2))
12
13 # 使用 KNN 回归模型
14
15 knn_regressor=KNeighborsRegressor()
16
17 knn_regressor.fit(train_x,train_y)
18
19 pred_y = knn_regressor.predict(test_x)
20
21 mse = mean_squared_error(test_y, pred_y)
22
23 print("KNN 均方偏差 = ",round(mse,2))
复制代码
运行结果:
1 决策树均方偏差 = 23.84
2
3 KNN 均方偏差 = 27.87
你能看到相比之下,AdaBoost 的均方偏差更小,也就是结果更优。虽然 AdaBoost 使用了弱分类器,可是经过 50 个甚至更多的弱分类器组合起来而造成的强分类器,在不少状况下结果都优于其余算法。所以 AdaBoost 也是经常使用的分类和回归算法之一。
分类: Python,机器学习算法