目录
1.集成学习
(1)概述
集成学习的思想是众人拾柴火焰高。训练若干个个体学习期,通过一个集合策略,最终形成一个强学习器。因此,集成学习主要有两个问题需要解决:一是如何得到若干个个体学习器;二是如何选择结合策略。
(2)个体学习器
个体学习器的组成分为同质和异质。同质指所有个体学习器都是同一种;异质指个体学习器不全是同一种。通常使用同质个体学习器,且最常用的弱学习器一般为CART决策树或者神经网络。
如果弱学习器之间存在强依赖该系且是串行生成,代表为boosting;如果不存在强依赖关系且并行生成,则是bagging。
(3)boosting
训练集用初始样本权重训练出一个弱学习器1,根据学习误差率更新样本权重,提高误差率高的样本点的权重,基于新权重训练集来训练弱学习器2,如此反复达到要求。
(4)bagging
用自助法从训练集中经过T次采用得到T个采样集,用这T个采样集分别训练出T个弱分类器,通过结合策略生成强学习器。
(5)结合策略
a.平均法
H
(
x
)
=
1
T
∑
i
=
1
T
w
i
h
i
(
x
)
H(x)=\frac{1}{T}\sum _{i=1}^{T}w_{i}h_{i}(x)
H(x)=T1i=1∑Twihi(x)
其中,
H
(
x
)
H(x)
H(x)为强学习器,
T
T
T为弱学习器的个数,
h
i
(
x
)
h_{i}(x)
hi(x)为第
i
i
i个弱学习器,
w
i
w_{i}
wi为其系数且:
w
i
⩾
0
∑
i
=
1
T
w
i
=
1
w_{i}\geqslant 0\\ \sum_{i=1}^{T}w_{i}=1
wi⩾0i=1∑Twi=1
b.投票法
即多数表决。
c.学习法
最常用的为Stacking,将弱学习器的输出作为输入,重新输入到一个学习器中进行训练。
2.随机森林
(1)简介
随机森林属于bagging算法的一种,之所以叫随机森林,是因为主要做了以下两方面的改进:
a.随机选取若干个样本进行弱学习器的训练。
b.随机选取一部分特征进行分裂。CART决策树是在所有特征中选择基尼系数最小的进行分裂,RF只随机选择一部分特征,再从这部分特征中选择基尼系数最小的进行分裂。
需要注意的是,随机选择的样本和特征越少,泛化能力越强,但是偏移会越大。通常会使用交叉验证、网格搜索等方法来选择适合数量。
(2)算法流程
a.对样本集进行
T
T
T次随机采样,得到
T
T
T个采样集:
(
D
1
,
D
2
,
D
3
,
.
.
.
,
D
T
)
(D_{1},D_{2},D_{3},...,D_{T})
(D1,D2,D3,...,DT)
b.用第
t
t
t个采样机训练出第
t
t
t个弱学习器。在节点分裂时,随机选择一批特征,在这些特征中选择基尼系数最小的进行分裂。
c.训练出
T
T
T个弱学习器后,通过结合策略生成强学习器。
b.预测时,分类采用多数表决;回归采用平均法。
3.sklearn实现RF
(1)默认参数的RF
#使用默认参数的随机森林进行预测
from sklearn import ensemble,datasets,model_selection,metrics
iris=datasets.load_iris()
x,y=iris.data,iris.target
x_train,x_test,y_train,y_test=model_selection.train_test_split(x,y)
model1 = ensemble.RandomForestClassifier()
model1.fit(x_train,y_train)
y_pred1=model1.predict(x_test)
print(metrics.accuracy_score(y_pred1,y_test))
输出:
0.9736842105263158
(2)网格搜索确定弱学习器个数
#使用网格搜索对若学习器个数进行优化
parameter1 = {'n_estimators':range(25,60,5)}
cvModel1 = model_selection.GridSearchCV(estimator=ensemble.RandomForestClassifier(),
param_grid=parameter1,cv=5)
cvModel1.fit(x,y)
print(cvModel1.best_score_,cvModel1.best_params_)
输出:
0.9666666666666668 {'n_estimators': 45}
(3)网格搜索确定最大深度
#弱学习器个数为45,网格搜索确定最大深度
parameter2 = {'max_depth':range(2,14,2)}
cvModel2 = model_selection.GridSearchCV(estimator=ensemble.RandomForestClassifier(n_estimators=10),
param_grid=parameter1,cv=5)
cvModel2.fit(x,y)
print(cvModel2.best_score_,cvModel2.best_params_)
输出:
0.9666666666666668 {'n_estimators': 25}