机器学习:集成方法之Bagging和Boosting
Posted JiYH
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习:集成方法之Bagging和Boosting相关的知识,希望对你有一定的参考价值。
集成方法(ensemble method)
通过组合多个学习器来完成学习任务,颇有点“三个臭皮匠顶个诸葛亮”的意味。
基分类器一般采用的是弱可学习(weakly learnable)分类器,通过集成方法,组合成一个强可学习(strongly learnable)分类器。
所谓弱可学习,是指学习的正确率仅略优于随机猜测的多项式学习算法;
强可学习指正确率较高的多项式学习算法。
集成学习的泛化能力一般比单一的基分类器要好,这是因为大部分基分类器的分类错误的概率远低于单一基分类器的。
集成方法主要包括Bagging和Boosting
Bagging和Boosting都是将已有的分类或回归算法通过一定方式组合起来,形成一个性能更加强大的分类器,更准确的说这是一种分类算法的组装方法,把弱分类器组装成强分类器的方法。
Bagging
全程自举汇聚法(bootstrap aggregating),称为bagging方法。Bagging对训练数据采用自举采样(boostrap sampling),即有放回地采样数据。
主要思想:
- 从原始样本集中抽取训练集。每轮从原始样本集中使用自助法(Bootstraping)的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的)
- 每次使用一个训练集得到一个模型,k个训练集共得到k个模型。
- 对分类问题:将上步得到的k个模型采用投票的方式(就是预测的哪个类别多就是哪个类别)得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。
代表算法是随机森林
用UCI上的红酒数据集举例:
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
import numpy as np
from sklearn.model_selection import cross_val_score
from sklearn.svm import SVC
import time
from sklearn.model_selection import train_test_split
# 加载数据
data = np.loadtxt('wine.data', delimiter=',')
X = data[:, 1:]
Y = data[:, :1].ravel()
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2)
clf =RandomForestClassifier()
print('随机森林:')
print('5折交叉验证平均值:', cross_val_score(clf, X, Y).mean())
strat = time.time()
clf.fit(X_train, y_train)
end = time.time()
print('训练时间:', end - start)
Boosting
Boosting是一种与Bagging很类似的技术。Boosting的思路则是采用重赋权(re-weighting)法迭代地训练基分类器,
主要思想
- 每一轮的训练数据样本赋予一个权重,并且每一轮样本的权值分布依赖上一轮的分类结果。
- 基分类器之间采用序列式的线性加权方式进行组合
代表算法由Adaboost,GBDT,XGBoost算法
贴一个Adaboost的代码
###########Adaboost##################
def adjust_Adaboost():
best = 0
for depth in range(1, 11):
for n in [50, 60, 70, 80, 90]:
ada = AdaBoostClassifier(DecisionTreeClassifier(max_depth=depth),
n_estimators=n,
learning_rate=1.)
temp = cross_val_score(ada, X, Y).mean()
if temp > best:
best = temp
d = depth
e = n
print(best, d, e)
print('Adaboost:')
ada = AdaBoostClassifier(DecisionTreeClassifier(max_depth=3),
n_estimators=60
)
print('5折交叉验证平均值:', cross_val_score(ada, X, Y).mean())
start = time.time()
ada.fit(X_train, y_train)
end = time.time()
print('运行时间:', end - start)
区别
采样区别
- Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。
- Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。
权重
- Bagging:使用均匀取样,每个样例的权重相等。
- Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。(但这样会导致改算法对异常数据过于敏感)
预测函数
- Bagging:所有预测函数的权重相等。
- Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。
以上是关于机器学习:集成方法之Bagging和Boosting的主要内容,如果未能解决你的问题,请参考以下文章
机器学习实战之 第七章 集成方法(随机森林和 AdaBoost)