机器学习:集成方法之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:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。

你可能感兴趣的:(经验分享,python,机器学习,numpy)