二十六.集成学习之随机森林(RF)的原理和sklearn实现

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=1Twihi(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 wi0i=1Twi=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}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值