- 集成学习概念
集成学习通过构建并结合多个学习器来完成学习任务。
集成学习的一般结构:先产生一组个体学习器,再用某种策略将他们结合起来。
聚合一组预测器(比如分类器或回归器)的预测,得到的预测结果比最好的单个预测器要好,这样的一组预测器,我们称为集成,这种技术称为集成学习,集成学习的算法被称为集成算法。 - 个体学习器的概念
个体学习器通常由一个现有的学习算法从训练数据产生,例如C4.5决策树算法、BP神经网络算法,此时集成中只包含同种类型的个体学习器,例如决策树集成的全是决策树,神经网络集成的全是神经网络,这样的集成是同质的。异质集成中的个体学习器由不同的学习算法生成,这时就不再有基学习算法;相应的,个体学习器一般不称为基学习器,常称为“组件学习器”或直接称为个体学习器。 - Boosting和Bagging
(1)Boosting(串行)
Boosting是一族可将弱学习器提升为强学习器的算法。这族算法的工作机制类似:先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复进行,直至基学习器数目达到事先指定的值T,最终将这T个基学习器进行加权结合。(e.g AdaBoost、梯度提升)
Boosting算法要求基学习器能对特定的数据分布进行学习,这可通过“重赋权法”实施,即在训练过程的每一轮中,根据样本分布为每个训练样本重新赋予一个权重。对无法接受带权样本的基学习算法,则可通过“重采样法”来处理,即在每一轮学习中,根据样本分布对训练集重新进行采样,再用重采样而得的样本集对基学习器进行训练。一般而言,这两种做法没有显著的优劣差别。需注意的是,Boosting算法在训练的每一轮都要检查当前生成的基学习器是否满足基本条件(检查当前基分类器是否比随机猜测好),一旦条件不满足,则当前基学习器即被抛弃,且学习过程停止。在此种情形下,初始设置的学习论述T也许还远未达到,可能导致最终集成中只包含很少的基学习器而性能不佳。若采用“重采样法”,则可获得“重启动”机会以避免训练过程中过早停止,即在抛弃不满足条件的当前基学习器之后,可根据当前分布重新对训练样本进行采样,再基于新的采样结果重新训练出基学习器,从而使得学习过程可以持续到预设的T轮完成。
Boosting主要关注降低偏差,因此Boosting能基于泛化性能相当弱的学习器构建出很强的集成。
(2)Bagging(并行)
使用自助采样法,给定包含m个样本的数据集,先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中,这样,经过m次随机采样操作,我们得到含m个样本的采样集,初始训练集中有的样本在采样集里多次出现,有的则从未出现。照这样,我们可采样出T个含m个样本的采样集,然后基于每个采样集训练出一个基学习器,再将这些基学习器进行结合,这就是Bagging的基本流程。在对预测输出进行结合时,Bagging通常对分类任务使用简单投票法,对回归任务使用简单平均法。若分类预测时出现两个类收到同样票数的情形,则最简单的做法是随机选择一个,也可进一步考察学习器投票的置信度来确定最终胜利者。
与标准AdaBoost只适用于二分类任务不同,Bagging能不经修改的用于多分类、回归等任务。
自助采样过程还给Bagging带来另一个优点:由于每个基学习器只使用了初始训练集中部分样本(63.2%),剩下的样本(36.8%)的样本可用作验证集来对泛化性能进行“包外估计”。包外估计可用来辅助剪枝;包外估计可用来估计决策树中各节点的后验概率以辅助对零训练样本结点的处理;包外估计可用来辅助早起停止以减小基学习器是神经网络的过拟合风险。
Bagging主要关注降低方差,它在不剪枝决策树、神经网络等易受样本扰动的学习器上效用更为明显。 - 结合策略
(1)平均法
对于数值型输出,最常见的结合策略是使用平均法。一是简单平均法,二是加权平均法。加权平均法的权重一般是从训练数据中学习而得,现实任务中的训练样本通常不充分或存在噪声,这将使得学出的权重不完全可靠。尤其是对规模比较大的集成来说,要学习的权重比较多,较容易导致过拟合。因此,史艳和应用均显示出,加权平均法未必一定由于简单平均法。一般而言,在个体学习器性能相差较大时宜使用加权平均法,而在个体学习器性能相近时宜使用简单平均法。
(2)投票法
聚合每个分类器的预测,然后将得票最多的结果作为预测类型,这种大多数投票分类器被称为硬投票分类器。
如果所有分类器都能够估算出类别的概率(即predict_proba()方法),那么你可以将概率在所有单个分类器上平均,然后让sklearn给出平均概率最高的类别作为预测,这被称为软投票。通常来说,软投票比硬投票的表现更优,因为它给予那些高度自信的投票更高的权重。
(3)学习法
当训练数据很多时,一种更为强大的结合策略是使用“学习法”,即通过另一个学习器来进行结合。Stacking是学习法的典型代表,堆叠法,又称层叠泛化法。它基于一个简单的想法:与其使用一些简单的函数(比如硬投票)来聚合集成中所有预测器的预测,不如我们训练一个模型来执行这个聚合。底部的几个预测器分别预测了不同的值,然后最终的预测器(称为混合器或元学习器)将这些预测作为输入,进行最终预测。 - 随机森林思想
随机森林是Bagging的一个扩展变体。RF在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择。在RF中,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属性用于划分。这里的参数k控制了随机性的引入程度:若令k=d,则基决策树的构建与传统决策树相同;若令k=1,则是随机选择一个属性用于划分;
随机森林简单、容易实现、计算开销小,在很多现实任务中展现出强大的性能,随机森林对Bagging只做了小改动,但是与Bagging中基学习器的“多样性”仅通过样本扰动而来不同,随机森林中基学习器的多样性不仅来自样本扰动,还来自属性扰动,这就使得最终集成的泛化性能可通过个体学习器之间差异度的增加而进一步提升。 - 随机森林推广
随机森林里单棵树的生长过程中,每个节点在分裂时仅考虑到了一个随机子集做包含的特征。如果我们对每个特征使用随机阈值,而不是搜索得出的最佳阈值(如常规决策树),则可能让决策树生长的更加随机。这种极端随机的决策树组成的森林被称为极端随机树。它是以更高的偏差换取更低的方差。极端随机树训练起来比常规随机森林要快很多,因为在每个节点上找到每个特征的最佳阈值是决策树生长中最耗时的任务之一。
通常来说,很难预先知道一个RandomForestClassifier是否会比一个ExtraTreesClassifier更好或更差。唯一方法是两种都尝试一遍,然后使用交叉验证(还需要使用网格搜索调整超参数)进行比较。 - 优缺点
Boosting优点是将弱学习器提升为强学习器,但这种依序学习技术有一个重要的缺陷就是无法并行,因为每个预测器只能在前一个预测器训练完成并评估之后才能开始训练,因此在拓展方面它的表现不如Bagging。
随机森林优点:(引用自https://blog.csdn.net/keepreder/article/details/47273297)
(1)在当前的很多数据集上,相对其他算法有着很大的优势,表现良好
(2)它能够处理很高维度(feature很多)的数据,并且不用做特征选择
PS:特征子集是随机选择的
(3)在训练完后,它能够给出哪些feature比较重要
PS:http://blog.csdn.net/keepreder/article/details/47277517
(4)在创建随机森林的时候,对generlization error使用的是无偏估计,模型泛化能力强
(5)训练速度快,容易做成并行化方法
PS:训练时树与树之间是相互独立的
(6) 在训练过程中,能够检测到feature间的互相影响
(7) 实现比较简单
(8)对于不平衡的数据集来说,它可以平衡误差。
(9)如果有很大一部分的特征遗失,仍可以维持准确度。
随机森林缺点:(引用自https://blog.csdn.net/keepreder/article/details/47273297)
(1)随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟
(2)对于有不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响,所以随机森林在这种数据上产出的属性权值是不可信的。 - sklearn参数
class sklearn.ensemble.RandomForestClassifier/RandomForestRegressor(
n_estimators=10:森林中树的数量
criterion=‘gini’/‘mse’:树生产时使用的指标,分类树为‘gini’或’entropy’,回归树为’mse’或’mae’
max_features=‘auto’:int/float/string/None,搜索分支时考虑的特征数
‘auto’/‘sqrt’,max_features=sqrt(n_features)
‘log2’,max_features=log2(n_features)
None,max_features=n_features
max_depth=None:树生产的最大高度
min_samples_split=2:节点允许进一步分枝时的最低样本数
min_samples_leaf=1:叶节点的最低样本量
min_weight_fraction_leaf=0.0:有权重的叶节点的最低权重分值
max_leaf_nodes=None:最高叶节点数量
min_impurity_decrease=0.0:分枝时需要的最低信息量下降量
bootstrap=True:是否使用可放回的bootstap抽样
oob_score=False:是否使用oob方式计算模型准确率
n_jobs=1,random_state=None
verbose=0,warm_start=False,class_weight=None - 应用场景
(1)投票分类器
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import VotingClassifier
from sklearn.svm import SVC
log_clf=LogisticRegression()
rnd_clf=RandomForestClassifier()
svm_clf=SVC()
voting_clf=VotingClassifier(
estimators=[(‘lr’,log_clf),(‘rf’,rnd_clf),(‘svc’,svm_clf)],
voting=‘hard’
)
voting_clf.fit(X_train,y_train)
(2)Bagging
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
bag_clf=BaggingClassifier(
DecisionTreeClassifier(),n_estimators=500,
max_samples=100,bootstrap=True,n_jobs=-1
)
bag_clf.fit(X_train,y_train)
y_pred=bag_clf.predict(X_test)
(3)随机森林
from sklearn.ensemble import RandomForestClassifier
rnd_clf=RandomForestClassifier(n_estimators=500,max_leaf_modes=16,n_jobs=-1)
rnd_clf.fit(X_train,y_train)
y_pred_rf=rnd_clf.predict(X_test)
(4)Adaboost
from sklearn.ensemble import AdaBoostClassifier
ada_clf=AdaBoostClassifier(
DecisionTreeClassifier(max_depth=1),n_estimators=200,
algorithm=“SAMME.R”,learning_rate=0.5
)
ada_clf.fit(X_train,y_train)
(5)梯度提升
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
X_train,X_val,y_train,y_val=train_test_split(X,y)
gbrt=GradientBoostingRegressor(max_depth=2,n_estimators=120)
gbrt.fit(X_train,y_train)
errors=[mean_squared_error(y_val,y_pred)
for y_pred in gbrt.staged_predict(x_val)]
bst_n_estimators=np.argmin(errors)
gbrt_best=GradientBoostingRegressor(max_depth=2,n_estimators=bst_n_estimators)
gbrt_best.fit(X_train,y_train)
作业一
最新推荐文章于 2020-08-18 18:46:26 发布