Ensemble Learning 集成学习

个体与集成

集成学习通过构建并结合多个学习器来完成学习任务。
Image Loading
要获得好的集成,个体学习器应好而不同。
集成学习方法分为两大类:

  • 个体学习器间存在强依赖关系、必须串行生成的序列化方法。Boosting。降低偏差。
  • 个体学习器间不存在强依赖关系、可同时生成的并行化方法。Bagging 和 Random Forest。降低方差。

Boosting

Boosting

Bagging 与 Random Forest

Bagging 与 Random Forest

结合策略

学习器结合的好处:泛化性能变好、避免局部极小、扩大假设空间。
Image Loading
假设集成包含 TT 个学习器{h1,h2,,hT}\{h_1, h_2, \ldots,h_T\},其中hih_i在示例xx上的输出为hi(x)h_i(x)

平均法 averaging

对于数值型输出。
Image Loading
Image Loading
不同的集成学习方法可视为通过不同的方式来确定加权平均法中的基学习器权重。
加权平均法的权重一般从训练数据中习得,并不可靠,也可能过拟合。所以加权平均法未必一定优于简单平均法。个体学习器性能相差较大时可用加权平均法,否则简单平均法就可以了。

投票法 majority voting

对于分类任务。
Image Loading
Image Loading
注意,若基学习器的类型不同,则其类概率值不能直接进行比较。这种情况下,就将类概率输出转化为类标记输出(1或0)然后再投票。

学习法 stacking

训练数据很多时。
Image Loading
用另一个学习器 meta-learner来结合,stacking。
Stacking 先从初始数据集训练出初级学习器,然后生成一个新数据集用于训练次级学习器。在这个新数据集中,初级学习器的输出被当做样例输入特征,而初始样本的标记仍被当做样例标记。
在训练阶段,次级训练集是利用初级学习器生成的,如果直接用初级学习器的训练集生成次级训练集,容易过拟合。所以一般会使用交叉验证或者留一法,用训练初级学习器未使用的样本来产生次级学习器的训练样本。
Image Loading

Things to be mindful of

  • With time sensitive data - respect time
  • Diversity as important as performance
  • Diversity may come from
    • Different algorithms.
    • Different input features.
  • Performance plateauing after N models
  • Meta model is normally modest.

Stacking example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from sklearn.ensemble import RandomForestRegressor  # import model
from sklearn.linear_model import LinearRegression # import model
import numpy as np # import numpy for stats
from sklearn.model_selection import train_test_split # split the training data

# train is the training data
# y is the target variable for the train data
# test is the test data

# split train data in 2 parts, training and validation.
training, valid, ytraining, yvalid = train_test_split(train, y, test_size = 0.5)
# specify models
model1 = RandomForestRegressor()
model2 = LinearRegression()
# fit models
model1.fit(training, ytraining)
model2.fit(training, ytraining)
# make predictions for validation
preds1 = model1.predict(valid)
preds2 = model2.predict(valid)
# make predictions for test data
test_preds1 = model1.predict(test)
test_preds2 = model2.predict(test)
# form a new dataset for valid and test via stacking the predictions
stacked_predictions = np.column_stack((preds1, preds2))
stacked_test_predictions = np.column_stack((test_preds1, test_preds2))
# specify meta model
meta_model = LinearRegression()
# fit meta model on stacked predictions
meta_model.fit(stacked_predictions, yvalid)
# make predictions on the stacked predictions of the test data
final_predictions = meta_model.predict(stacked_test_predictions)

StackNet

todo

多样性

增强多样性的方法,一般思路是在学习过程中引入随机性。常见做法主要是对数据样本(不稳定的基学习器)、输入属性(包含大量冗余属性的数据)、输出表示、算法参数进行扰动。

Ref

[1] 机器学习 - 周志华
[2] 第06章:深入浅出ML之Boosting家族 | 计算广告与机器学习
[3] Coursera - How to Win a Data Competition