持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情
当我们能够聚合众人的智慧来探讨一个复杂问题,往往会比单独找一个专家来回答要好,这被称为群体智慧(collective intelligence)。
同样的我们也可以聚合一组预测器的预测,得到的预测结果也会比单一的预测器结果要好。这一组预测器称为集成,这种技术叫集成学习。
投票分类器
介绍集成方法前,先来简单了解一下投票分类器。假设我们现在有好几个分类器已经做出了预测,然后我们将这些预测聚合,每个分类器的输出都相当于给某一个类别投票,最后得出票数最多的作为预测类别。这种以大多数结果作为预测结果的称为硬投票分类器。如下图所示:
图1 硬投票分类器
相对应的如果是分类器可以估算出类别的概率,那么也可以将所有的单个的概率进行平均,最后得出平均最高的类别概率作为预测结果,这被称为软投票法。
# 简单使用Scikit-Learn了解以下投票分类器
voting_clf = VotingClassifier(
# clf_1,clf_2 是需要先定义好的分类器
estimators=[("clf_1",clf_1),("clf_2",clf_2)],voting="hard")
)
复制代码
上面就是定义好的乐意硬投票分类器,如果需要修改成软投票,只需要将voting="soft"。
bagging和pasting
我们除了,可以实现用不同的预测器进行预测外,还可以是在同一个预测器下,使用不同的训练子集。
- 在采样时会将已经采样的数据放回继续采样的方法叫bagging(bootsrtap aggregating)
- 如果采样时样本不会放回的方法是pasting。
按照上面的介绍可以知道,这样的每个预测器的偏差肯定会比完整的原始数据集训练出来的要高,但是经过聚合之后的预测,偏差和方差都会下降。所以总的结果就是,比直接在原始数据上训练的单个预测器相比效果要好,方差更低。
我们只需要使用Scikit-Learn下的BaggingClassifier类就能够进行简单的实现,例子如下:
bag_clf = BaggingClassifier(
# xxClassifier 是我们提前选好的分类器
xxClassifier(),n_estimators=100,max_samples=20,bootstrap=True)
)
复制代码
简单的介绍一下上面的参数:
n_estimators
-训练n个预测器,上面就是训练100个xxClassifierbootstrap
-True:bagging方法,False:pasting方法max_samples
-每次随机取多少个样本进行训练
这边需要注意的是,如果预测器可以返回预测概率,那么BaggingClassifier()默认会使用软投票方法。
包外评估
因为随机的原因,其实在bagging中,我们是有一定比例的训练实例是永远无法被训练到的(这个概率是37%左右,当然每一个预测器采样都是训练不同的实例,但是概率相同)。
这部分的实例被称为包外实例,我们可以通过在BaggingClassifier()中设置超参数oob_score=True
,将这部分的实例利用起来,用他们来评估。