集成学习与随机森林---理论与代码结合详细讲解

集成学习:

综合各方意见,做出决策

集成学习获得较好泛化性能,一般集成学习会通过重采样获得一定数量的样本,然后训练多个弱学习器(分类精度稍大于50%),采用投票法,即“少数服从多数”原则来选择分类结果,当少数学习器出现错误时,也可以通过多数学习器来纠正结果。

1.Voting 模型-------Voting Classifier、VotingRegressor
使用scikit-learn的集成分类器Voting Classifier构建模型,并进行投票预测,Voting Classifier里面用参数voting来做决策

from sklearn.ensemble import VotingClassifier
voting_clf = VotingClassifier(estimators=[ 
 ('log_clf', LogisticRegression()),      
 ('knn_clf', KNeighborsClassifier(n_neighbors=5)),
 ('dt_clf', DecisionTreeClassifier(random_state=666))],
                             voting='hard')
voting_clf.fit(X_train, y_train)
voting_clf.score(X_test, y_test) # 计算模型得分

#estimators传入要集成的算法列表,列表的每一项都是一个元组,元组包括两个元素:(estimator名字,estimator实例)

1)voting = ‘hard’:表示最终决策方式为 Hard Voting Classifier:根据少数服从多数来定最终结果;
2)voting = ‘soft’:表示最终决策方式为 Soft Voting Classifier:
• 将所有模型预测样本为某一类别的概率的平均值作为标准,概率最高的对应的类型为最终的预测结果;
• Soft Voting 的决策方式,要求集合的每一个模型都能估计概率;

Voting:虽然有很多机器学习算法,但从投票的角度看,模型数量依然有限,需要创建更多的子模型,集成更多子模型的意见
例子:假如每个子模型的准确率为51%
解释:三个子模型的集成模型,只要有大于等于2个预测准确,说明这个模型就预测准确了,则如下:
在这里插入图片描述
通过这种集成学习方法,每一个子模型不需要太高的准确率,而整体就可以得到非常高的准确率,即用多个弱学习器实现强学习器的效果,Bagging模型

2.Bagging模型-----BaggingClassifier、BaggingRegressor

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier

#以决策树为基学习器,创建具有100个基学习器的Bagging模型
bagging_clf = BaggingClassifier(DecisionTreeClassifier(random_state=666),
                                n_estimators=100,
                                max_samples = 100, 
                                random_state=42,
bootstrap = True,
max_features = 1,
bootstrap_features = True
)

bagging_clf.fit(X_train, y_train)
bagging_clf.score(X_test, y_test)
#设置bootstrap = True,表示有放回取样
#max_features:对特征进行取样的个数;
#max_samples:int或float,可选(默认值= 1.0)从X抽取以训练每个基本估计量的样本数。
#bootstrap_features:对特征是否进行有放回取样

为了让集成学习学习更强,会先设定:子模型之间不能一致,要有差异性
如何让子模型具有差异性?
每个子模型只学习样本数据的一部分
例如:一共有1000个样本;每个子模型只学习100个样本数据
取样max_samples:每个子模型只学习样本数据的一部分

两种取样方式: 1)有放回取样; 2)无放回取样

样本什么时候被放回?-----在构建一个子模型的过程中,样本被抽取后立刻放回
放回取样导致一部分样本很可能没有被取到,平均大约有37%的样本没有被取到,这些数据叫包外数据,Out-Of-Bag(OOB),不用使用测试集,而使用这些包外数据进行模型测试

%%time 
bagging_clf = BaggingClassifier(DecisionTreeClassifier(random_state=666),
                                n_estimators=5000,
                                max_samples = 100, 
                                random_state=42,
                               bootstrap = True,
                               oob_score=True,
                               n_jobs=1)

#在训练的时候传入所有数据
bagging_clf.fit(X, y)
#设置oob_score = True,表示需要用包外数据进行模型评估,这时候训练样本的时候就直接传入所有数据
Bagging这样的思路极易进行并行化,因为Bagging 的基学习器之间是相互独立,没有依赖关系的,所以可以做并行化,通过设置参数n_jobs来实现并行化。
#设置n_jobs = 1,表示只使用1个内核进行计算
#n_jobs = -1:使用所有的核

随机森林:

1.随机森林
------------RandomForestClassifier、RandomForestRegressor

其实随机森林可表示为:Bagging模型 + 基学习器为决策树时
随机森林是Bagging模型的改进:

普通决策树:会在结点上所有的n个样本特征中选择一个最优的特征进行划分

扩展之处:从结点的特征集合中随机选择一个包含 k个属性的子集,再从这个子集中选择一个最优划分,进一步扩大了基学习器的差异性,提升模型泛化性能

from sklearn.datasets import load_wine
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier

wine = load_wine()
X = wine.data
y = wine.target
#设置基学习器决策树数量为100
rdf_clf = RandomForestClassifier(n_estimators = 100, 
                                 random_state = 6, 
                                 oob_score=True)
rdf_clf.fit(X, y)  #训练
rdf_clf.oob_score_ # 计算模型得分

# 在RandomForest里bootstrap是默认是True的,所以不需要手动的去指定
#因为随机森林就是bagging模型的改进,随机森林拥有决策树和BaggingClassifier的所有参数
# 具体改进:普通决策树----会在结点上所有的n个样本特征中选择一个最优的特征进行划分
          # 从结点的特征集合中随机选择一个包含 k个属性的子集,再从这个子集中选择一个最优的特征划分

2.ExtraTrees(极限随机树)

也是一个森林,只是比random forest里更随机

随机森林:从结点的特征集合中随机选择一个包含 k个属性的子集,再从这个子集中选择一个最优划分
ExtraTrees:从k个属性的子集中,每个属性上随机选择一个阈值,再选一个最优划分

ExtraTrees相比较随机森林提供额外的随机性,进一步增强模型的泛化能力,加快训练速度

from sklearn.ensemble import ExtraTreesClassifier

et_clf = ExtraTreesClassifier(n_estimators=100, 
                              oob_score=True, 
                              bootstrap=True,
                              random_state=666)

et_clf.fit(X, y)
et_clf.oob_score_
#设置bootstrap = True,表示有放回取样
# 在ExtraTrees里bootstrap是默认是False的,所以需要手动的去指定
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值