集成学习-个人笔记

集成学习通过某种策略对单个学习器进行结合,通常可获得比单一学习器显著优越的泛化性能,因此在许多学习任务当中都应用了集成学习。本文先介绍集成学习的基本理论思想,再结合scikit-learn官方文档给出常见的几种集成学习算法的Python实现。

集成学习的一般结构:先产生一组“个体学习器”,再用某种策略将它们结合起来。若集成中只包含同类型的学习器,这样的集成就是“同质”的,每一单个学习器称为“基学习器”;如果集成中包含了多种类型的学习器,这种集成就是“异质”的,每一单个学习器称为“组件学习器”,也可直接称为个体学习器。

通常来说,把好的和坏的结合在一起,那么结果会比好的差点,比坏的好点。要使集成获得比最好的个体学习器更好的性能,个体学习器应“好而不同”,即个体学习器要有一定的“准确性”且各学习器间具有差异。当我们假设基学习器的误差相互独立时,随着集成种个体分类器数目的增加,集成的错误率将指数下降,最终趋向于0。

根据个体学习器的生成方式,可将集成学习分为两大类:一类是个体学习器间不存在强依赖关系、可同时生成的并行化集成,其代表是Bagging和Random Forest;另一类是个体学习器间存在强依赖关系、只能串行生成的序列化集成,其代表是Boosting。

Bagging

要使个体学习器尽可能相互独立,我们可以对训练样本进行采样,产生若干个随机子集,再从每个子集中训练出一个基学习器。基于不同的采样方法,得到了不同的集成算法。基于自助采样法产生子集的算法就是Bagging算法。而结合策略Bagging通常对分类任务采用简单投票法,对回归任务采用简单平均法。

官方文档给的样例Python代码:

>>> from sklearn.ensemble import BaggingClassifier
>>> from sklearn.neighbors import KNeighborsClassifier
>>> bagging = BaggingClassifier(KNeighborsClassifier(),
...                             max_samples=0.5, max_features=0.5)

这里给出几个主要参数:

base_estimator:基学习器类型,默认为决策树

n_estimators:集成中基学习器个数,默认10

max_samples:每个子训练集的采样次数,默认为1.0,即次数=原始训练集个数

max_features:每个样本中所取属性个数,默认为1.0,即全取

bootstrap:是否有放回采样,默认为True.(自助采样就是有放回的)

bootstrap_features:属性选取是否有放回,默认为True

oob_score:是否使用“包外样本”估计泛化性能,默认False(自助采样为有放回采样,每个子集只包含部分样本,其余样本为包外样本)

Random Forest(随机森林,RF)

RF基于Bagging,其基学习器为决策树,在其基础上引入随机属性,即对于决策树每个结点,从属性集d中选取包含k个属性的子集用于划分,推荐k=log(2)d。随机森林的起始性能往往相对较差,因为引入了属性扰动,但随着个体学习器数目的增加,随机森林通常会收敛到更低的泛化误差。

样例Python代码

>>> from sklearn.ensemble import RandomForestClassifier
>>> from sklearn.datasets import make_classification
>>>
>>> X, y = make_classification(n_samples=1000, n_features=4,
...                            n_informative=2, n_redundant=0,
...                            random_state=0, shuffle=False)
>>> clf = RandomForestClassifier(max_depth=2, random_state=0)
>>> clf.fit(X, y)
RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
            max_depth=2, max_features='auto', max_leaf_nodes=None,
            min_impurity_decrease=0.0, min_impurity_split=None,
            min_samples_leaf=1, min_samples_split=2,
            min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1,
            oob_score=False, random_state=0, verbose=0, warm_start=False)
>>> print(clf.feature_importances_)
[ 0.17287856  0.80608704  0.01884792  0.00218648]
>>> print(clf.predict([[0, 0, 0, 0]]))
[1]

n_estimators:基学习器个数

criterion:属性划分标准,默认“gini”

max_features:默认‘auto’,即对属性集开方

max_depth:决策树层数

......

Boosting基本工作机制:先从初始训练集中训练一个基学习器,再根据基学习器的表现对训练数据样本分布进行调整,使得先前基学习器做错的样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器,如此重复,直至基学习器达到事先指定的值T,再将这T个学习器进行加权结合。其代表:AdaBoost

AdaBoost官方代码:

from sklearn.ensemble import AdaBoostClassifier
from sklearn import datasets
n_estimators = 400
learning_rate = 1.0
X, y = datasets.make_hastie_10_2(n_samples=12000, random_state=1)

X_test, y_test = X[2000:], y[2000:]
X_train, y_train = X[:2000], y[:2000]
ada_real = AdaBoostClassifier(
    base_estimator=dt_stump,
    learning_rate=learning_rate,
    n_estimators=n_estimators,
    algorithm="SAMME.R")
ada_real.fit(X_train, y_train)

具体参数的含义参考博文:点击打开链接

官方文档中还给了具体的结合策略,此处先不写了。只是个人笔记,希望以后能用得上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值