集成树模型(Ensemble)

介绍下rf,adaboost,gbdt,xgboost的算法原理?(注意adaboost,gbdt,xgboost的区别)

RF的算法原理:
随机森林是有很多随机得决策树构成,它们之间没有关联。得到RF以后,在预测时分别对每一个决策树进行判断,最后使用Bagging的思想进行结果的输出;
主要步骤:
现在有N个训练样本,每个样本的特征为M个,需要建K颗树
1)从N个训练样本中有放回的取N个样本作为一组训练集(其余未取到的样本作为预测分类,评估其误差)
2)从M个特征中取m个特征左右子集特征
3)重复上述过程K次
4)行程随机森林,通过投票表决确定分类;

Adaboost算法原理:
该算法是模型为加法模型,损失函数为指数函数,学习算法为前向分步算法时的学习方法。Adaboost的训练误差是以指数速率下降的,它具有自适应性,它能自适应弱分类器的训练误差率。另外, Adaboost算法是稳健的,具有robost,调参数没有这么麻烦。一般适用于分类问题,也可用于回归。传统的adaboost算法只能适用于二分类的情况。也可以将adaboost算法调整到适合处理多分类任务的方法。
目标函数只能是:指数函数。
主要步骤:
1) 初始化样本的权值为1/n。
2) 基于样本与权值训练弱分类器;这里的弱分类器就是个二分类器。
3) 根据分类器对样本进行判别,如果判别正确,此样本的权值降低,判别错误,降低样本的权值,同时根据识别率计算出此分类器的权值;
4) 利用改变权值的样本训练下一个分类器;
5) 循环得到N个分类器与其对应的权值;
6) 基于加权的分类器组合成为最终的模型。

1)首先介绍Adaboost Tree,是一种boosting的树集成方法。基本思路是依次训练多棵树,每棵树训练时对分错的样本进行加权。树模型中对样本的加权实际是对样本采样几率的加权,在进行有放回抽样时,分错的样本更有可能被抽到
2)GBDT是Adaboost Tree的改进,每棵树都是CART(分类回归树),树在叶节点输出的是一个数值,分类误差就是真实值减去叶节点的输出值,得到残差。GBDT要做的就是使用梯度下降的方法减少分类误差值
在GBDT的迭代中,假设我们前一轮迭代得到的强学习器是ft−1(x), 损失函数是L(y,ft−1(x)), 我们本轮迭代的目标是找到一个CART回归树模型的弱学习器ht(x),让本轮的损失损失L(y,ft(x)=L(y,ft−1(x)+ht(x))最小。也就是说,本轮迭代找到决策树,要让样本的损失尽量变得更小。
3)得到多棵树后,根据每颗树的分类误差进行加权投票
gbdt的算法原理:
gbdt是一种提升树算法,它每次迭代产生一个弱分类器模型,并且累加到总模型中。但是gbdt每一次迭代中弱分类器的生成都是依据损失函数的梯度方向,也就是用梯度下降的方法来拟合残差。
目标函数:分类(对数似然损失,指数损失(sklearn中,如果函数是指数,则等价于adaboost))
回归(‘LS’均方差, ‘lad’ 绝对误差, Hube损失(鲁棒性回归损失,lad和LS的结合))
gbdt与adaboost的区别(除了目标函数外,其他一样),gbdt将adaboost模型中的所分类器改为回归决策树(如果处理分类问题,是通过设定阈值的方法),目标函数不同,优化过程不同。

主要步骤:
1) 将基本学习器初始化为一个常数;
2) 开始迭代:a.根据给定的误差函数,来计算当前模型的梯度,近似残差(对于最小均方误差来说,梯度就是当前模型的结果和label的残差);b.根据梯度(也叫作伪残差)拟合下一个基学习器。c.根据一维线性搜索来计算步长;d.根据步长和学习率对当前模型进行更新;

xgboost的算法原理:
xgboost可以说是一种基于梯度提升的加强版本;GBDT通过梯度来拟合残差,只用到了一阶导数信息。而xgboost对目标函数进行二阶泰勒展开,同时用到了一阶导数和二阶导数信息来拟合残差,得到新的目标函数。同时定义的每棵树的复杂度结构部分q和叶子权重部分w,作为正则项加入到新的目标函数中。然后通过贪心算法获取最优切分点,进行划分直到满足某个阈值或得到纯节点。
除此之外,xgboost还有其他优点:支持线性分类器,列抽样,缺失值的处理,并行计算等;

补充LightGBM的特点:
微软出了个LightGBM,号称性能更强劲,速度更快。
性能提升的原因主要是两个:①histogram算法替换了传统的Pre-Sorted,某种意义上是牺牲了精度(但是作者声明实验发现精度影响不大)换取速度,直方图作差构建叶子直方图挺有创造力的。(xgboost的分布式实现也是基于直方图的,利于并行)②带有深度限制的按叶子生长 (leaf-wise) 算法代替了传统的(level-wise) 决策树生长策略,提升精度,同时避免过拟合危险。

GBDT算法和随机森林的区别?
组成随机森林的树可以是分类树,也可以是回归树;而GBDT只由回归树组成
组成随机森林的树可以并行生成;而GBDT只能是串行生成
对于最终的输出结果而言,随机森林采用多数投票等;而GBDT则是将所有结果加权累加起来
随机森林对训练集一视同仁,GBDT是基于权值的弱分类器的集成
随机森林对异常值不敏感,GBDT对异常值非常敏感
随机森林是通过减少模型方差提高性能,GBDT是通过减少模型偏差提高性能

GBDT和XGBOOST的区别?
传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。
传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。
xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。
Shrinkage(缩减),相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(补充:传统GBDT的实现也有学习速率)
列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。
xgboost工具支持并行。xgboost的并行是在特征粒度上的。xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。

参数调节
GBDT调节参数?
我们把重要参数分为两类,第一类是Boosting框架的重要参数,第二类是弱学习器即CART回归树的重要参数。一般先调框架参数,再调弱学习器的参数;
boosting框架相关的重要参数
n_estimators: 也就是弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,又容易过拟合,一般选择一个适中的数值。默认是100。在实际调参的过程中,我们常常将n_estimators和下面介绍的参数learning_rate一起考虑。
learning_rate: 即每个弱学习器的权重缩减系数,也称作步长,所以这两个参数n_estimators和learning_rate要一起调参。一般来说,可以从一个小一点的步长开始调参,默认是1。
subsample: 样本子采样比例,取值为(0,1]。
init: 即我们的初始化的时候的弱学习器,常数;一般用在我们对数据有先验知识,或者之前做过一些拟合的时候,如果没有的话就不用管这个参数了。
loss: 即我们GBDT算法中的损失函数。分类模型和回归模型的损失函数是不一样的。
对于分类模型,有对数似然损失函数”deviance”和指数损失函数”exponential”两者输入选择。默认是对数似然损失函数”deviance”。
对于回归模型,有均方差”ls”, 绝对损失”lad”, Huber损失”huber”和分位数损失“quantile”。如果数据的噪音点不多,用默认的均方差”ls”比较好。如果是噪音点较多,则推荐用抗噪音的损失函数”huber”。而如果我们需要对训练集进行分段预测的时候,则采用“quantile”。
alpha:这个参数只有GradientBoostingRegressor有,当我们使用Huber损失”huber”和分位数损失“quantile”时,需要指定分位数的值。默认是0.9,如果噪音点较多,可以适当降低这个分位数的值。
GBDT类库弱学习器参数
max_features 划分时考虑的最大特征数: 默认是”None”,意味着划分时考虑所有的特征数;如果是”log2”意味着划分时最多考虑 log2N l o g 2 N 个特征;如果是”sqrt”或者”auto”意味着划分时最多考虑 N N 个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比xN)取整后的特征数。
max_depth 决策树最大深度。默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。
min_samples_split 内部节点再划分所需最小样本数,默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
min_samples_leaf 叶子节点最少样本数。这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。如果样本量数量级非常大,则推荐增大这个值。
min_weight_fraction_leaf 叶子节点最小的样本权重和。这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。
max_leaf_nodes最大叶子节点数: 通过限制最大叶子节点数,可以防止过拟合;
min_impurity_split 节点划分最小不纯度。这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。

XGBOOST调节参数?
通用参数
booster [default=gbtree] 有两中模型可以选择gbtree和gblinear。gbtree使用基于树的模型进行提升计算,-
gblinear使用线性模型进行提升计算。缺省值为gbtree;
silent [default=0] 取0时表示打印出运行时信息,取1时表示以缄默方式运行,不打印运行时信息。缺省值为0
nthread XGBoost运行时的线程数。缺省值是当前系统可以获得的最大线程数
学习目标参数
Objective “reg:linear” –线性回归。“reg:logistic” –逻辑回归。“binary:logistic” –二分类的逻辑回归问题,输出为概率。“binary:logitraw” –二分类的逻辑回归问题,输出的结果为wTx。“count:poisson” –计数问题的poisson回归,输出结果为poisson分布。
“multi:softmax” –让XGBoost采用softmax目标函数处理多分类问题,同时需要设置参数num_class(类别个数)“multi:softprob” –和softmax一样,但是输出的是ndata * nclass的向量,可以将该向量reshape成ndata行nclass列的矩阵。没行数据表示样本所属于每个类别的概率。“rank:pairwise” –set XGBoost to do ranking task by minimizing the pairwise loss
eval_metric:rmse 均方根误差,mae 平均绝对误差,logloss 负对数似然函数值error 二分类错误率(阈值为0.5),merror 多分类错误率,mlogloss 多分类,logloss损失函数,auc 曲线下面积;
seed:随机数的种子
Parameter for Tree Booster
eta [default=0.3] 为了防止过拟合,更新过程中用到的收缩步长。在每次提升计算之后,算法会直接获得新特征的权重。 eta通过缩减特征的权重使提升计算过程更加保守。
gamma [default=0] 节点分裂所需的最小损失函数下降值,这个参数越大,算法越保密。
max_depth [default=6] 数的最大深度。缺省值为6取值范围为:[1,∞]
subsample [default=1] GBM中的subsample参数一样。这个参数控制对于每棵树,随机采样的比例
colsample_bytree [default=1] 和GBM里面的max_features参数类似。用来控制每棵随机采样的列数的占比(每一列是一个特征)。
min_child_weight [default=1] 孩子节点中最小的样本权重和。如果一个叶子节点的样本权重和小于-
min_child_weight则拆分过程结束。
max_delta_step [default=0] 这参数限制每棵树权重改变的最大步长
Parameter for Linear Booster
lambda [default=0] L2正则的惩罚系数;
alpha [default=0] L1正则的惩罚系数;
lambda_bias 在偏置上的L2正则。缺省值为0(在L1上没有偏置项的正则,因为L1时偏置不重要)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
集成学习是一种通过组合多个基本模型来提高预测准确性的机器学习方法。下面是一个使用Python实现集成学习模型的示例代码: ```python # 导入所需的库 from sklearn.ensemble import VotingClassifier from sklearn.tree import DecisionTreeClassifier from sklearn.neighbors import KNeighborsClassifier from sklearn.svm import SVC from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 加载数据集 iris = load_iris() X, y = iris.data, iris.target # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 定义基本模型 model1 = DecisionTreeClassifier() model2 = KNeighborsClassifier() model3 = SVC() # 定义集成学习模型 ensemble_model = VotingClassifier(estimators=[('dt', model1), ('knn', model2), ('svm', model3)], voting='hard') # 训练集成学习模型 ensemble_model.fit(X_train, y_train) # 在测试集上进行预测 y_pred = ensemble_model.predict(X_test) # 计算准确率 accuracy = accuracy_score(y_test, y_pred) print("准确率:", accuracy) ``` 在上面的代码中,我们使用了三个基本模型:决策分类器(DecisionTreeClassifier)、K近邻分类器(KNeighborsClassifier)和支持向量机分类器(SVC)。然后,我们使用VotingClassifier来定义集成学习模型,其中estimators参数指定了基本模型的名称和实例,voting参数指定了投票策略('hard'表示多数表决)。最后,我们使用fit方法训练集成学习模型,并使用predict方法在测试集上进行预测,最后计算准确率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值