Bagging
- Bagging方法也称为汇聚法(Bootstrap Aggregating),属于集成学习中一种
- Bagging的方法过程,在原始的数据集中进行随机抽样(可以放回抽样,也可以不放回抽样)
- 使用得到的随机子集来训练评估器,该过程重复n次,每次训练得到一个评估器,最终聚合每个单独的评估器预测。
- 预测会使用多数投票(分类)或者求均值(回归)的方式来统计最终的结果。
- 通俗的讲,Bagging就是我们去指定一个基本的评估器,然后随机重数据集中抽样出指定数量的数据集进行训练,随机抽样n次,形成n个评估器。最终综合预测
Bagging的算法总结
- bagging算法可以降低模型的方差,但是,在降低模型偏差方面,作用不大。
- 通过bagging方法,就可以非常便捷的对基本评估器进行改进,而无需去修改基本评估器底层的实现。
- 因为bagging方法可以有效的降低过拟合,因此,bagging方法适用于强大而复杂的模型。
Bagging与随机森林概念对比记忆
- 随机森林指定了基本评估器,就是决策树,我们只需要指定建立多少颗决策树就可以了,然后是每个基本评估器都会从全部数据集中抽取指定特征数量的数据进行建立决策树,然后让每个决策树对于自己的数据进行评估,最后综合得出结论
- Bagging需要我们去指定基本评估器,然后指定评估器的数量m,指定每个评估器选择多少样本数量进行训练,选择每个样本选择的特征数量。个人理解,Bagging实际上,是在我们设置好所有的条件之后,然后在数据集中抽取我们指定样本数量(每个样本特征数也是我们指定)作为新的数据集,这样的抽取方式抽取m次,然后用我们指定的评估器复制m-1份,用抽取出来的数据集分别在复制出来的独立的评估器上训练,一对一的训练,最后综合得到结果。那所谓的综合,分类,就是投票选择。回归,就是平均
必要的库
- sklearn.ensemble,集成模块,提供一些集成学习的算法实现。
- BaggingClassifier,sklearn中提供Bagging算法分类的实现,在sklearn.ensemble包下。
- BaggingRegressor,sklearn中提供Bagging算法回归的实现,在sklearn.ensemble包下。
Bagging代码实现(分类)
from sklearn.datasets import make_classification
from sklearn.ensemble import BaggingClassifier
from sklearn.model_selection import train_test_split
# 使用make_classification得到一个分类型数据集
# n_samples(样本个数),n_features(特征个数),n_informative(多信息特征的个数),
# n_classes(分类类别),random_state(随机种子)
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_classes=3, random_state=0)
# 分裂数据集,得到训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=0)
# base_estimator(基本评估器对象),n_estimators(组合基本评估器的数量)
# max_samples(每个基本评估器样本数量),
# max_features=1.0 每个基本评估器所选取特征的数量。该值也可以是int类型或float类型,意义与max_samples相同。
# bootstrap:是否进行放回抽样(默认为True。)
# bootstrap_features:是否可以重复选取特征。默认为False。
bag = BaggingClassifier(lr, n_estimators=100, max_samples=0.5, max_features=0.75)
bag.fit(X, y)
print(bag.score(X_train, y_train))
print(bag.score(X_test, y_test))
Bagging代码实现(回归)
# 导入糖尿病病情预测的示例
from sklearn.datasets import load_diabetes
# BaggingRegressor sklearn提供用于回归的bagging算法的实现。
from sklearn.ensemble import BaggingRegressor
# 分裂得到训练集和测试集
from sklearn.model_selection import train_test_split
# 得到数据集中的x与y
X, y = load_diabetes(return_X_y=True)
# 分裂数据集,得到测试集和训练集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=0)
# 得到 回归用的 Bagging
bag = BaggingRegressor(lr, n_estimators=100, max_samples=0.5, max_features=0.75)
# 开始训练
bag.fit(X, y)
print("bagging R ^ 2值:")
print(bag.score(X_train, y_train))
print(bag.score(X_test, y_test))
boosting
- 上述所说的俩个集成学习的实现(Bagging与随机森林)都有一个共同点,基本评估器之间并没有联系,也就是说,基本评估器之间是相互独立的。
- 而,集成的另外一种实现,个体学习器间存在强依赖关系、必须串行生成的序列化方法。这种实现的代表就是boosting
- 提升学习(Boosting)是一种机器学习技术,可以用于回归和分类的问题,其每一步产生弱预测模型,并加权累加到总模型中。
- 通俗的讲,提升学习,增强学习,从字面意思理解,就是每个基本的评估器是建立在之前的评估器之上的,步步提升。
- 我了解的提升学习有三种(Adboost、GBDT、Xgboost)

AdaBoost
- Adaptive Boosting(AdaBoost)是一种迭代算法。每轮迭代中会在训练集上产生一个新的学习器,然后使用该学习器对所有样本进行预测,以评估每个样本的重要性。
- 算法会为每个样本赋予一个权重,每次用训练好的学习器标注/预测各个样本,如果某个样本点被预测的越正确,则将其权重降低;否则提高样本的权重。
- 权重越高的样本在下一个迭代训练中所占的比重就越大,也就是说越难区分的样本在训练过程中会变得越重要。整个迭代过程直到错误率足够小或者达到一定的迭代次数为止。
- Adaboost算法将基本学习器的线性组合作为强学习器,同时给误差率较小的基本学习器以较大的权重,给误差率较大的基本学习器以较小的权重。构建的线性组合为:
f(x)=∑i=1mαiGi(x)f(x) = \sum_{i=1}^{m}\alpha_iG_i(x)f(x)=∑i=1mαiGi(x)
其中,α\alphaα就是每个基本学习器的权重。
对于分类,则在最终的结果上进行sign函数的转换即可:
G(x)=sign(f(x))=sign(∑i=1mαiGi(x))G(x) = sign(f(x)) = sign(\sum_{i=1}^{m}\alpha_iG_i(x))G(x)=si