一、集成学习分类
集成学习是机器学习中的一种思想,它通过多个模型的组合形成一个精度更高的模型,参与组合的模型成为弱学习器(基学习器)。训练时,使用训练集依次训练出这些弱学习器,对未知的样本进行预测时,使用这些弱学习器联合进行预测。传统机器学习算法 (例如:决策树,逻辑回归等) 的目标都是寻找一个最优分类器尽可能的将训练数据分开。集成学习 (Ensemble Learning) 算法的基本思想就是将多个分类器组合,从而实现一个预测效果更好的集成分类器。集成算法可以说从一方面验证了中国的一句老话:三个臭皮匠,赛过诸葛亮。
集成学习算法一般分为:bagging和boosting。
Baggging 框架通过有放回的抽样产生不同的训练集,从而训练具有差异性的弱学习器,然后通过平权投票、多数表决的方式决定预测结果。
Boosting是一组可将弱学习器升为强学习器算法。这类算法的工作机制类似:
1.先从初始训练集训练出一个基学习器
2.在根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续得到最大的关注。
3.然后基于调整后的样本分布来训练下一个基学习器;
4.如此重复进行,直至基学习器数目达到实现指定的值T为止。
5.再将这T个基学习器进行加权结合得到集成学习器。
二、随机森林
随机森林是bagging思想中的一种算法,它的思想是将一颗颗决策树作为一个个的弱学习器,通过有放回的采样数据和特征分别让这些弱学习期学习,然后进行平权投票、多数表决的方式得到结果,即收集每一个弱学习器的预测结果,多数的为最终结果。
随机森林API:
sklearn.ensemble.RandomForestClassifier()
n_estimators:决策树数量,(default = 10)
Criterion:entropy、或者 gini, (default = gini)
max_depth:指定树的最大深度,(default = None 表示树会尽可能的生长)
max_features="auto”, 决策树构建时使用的最大特征数量
If "auto", then
max_features=sqrt(n_features)
.If "sqrt", then
max_features=sqrt(n_features)
(same as "auto").If "log2", then
max_features=log2(n_features)
.If None, then
max_features=n_features
.bootstrap:是否采用有放回抽样,如果为 False 将会使用全部训练样本,(default = True)
min_samples_split: 结点分裂所需最小样本数,(default = 2)
如果节点样本数少于min_samples_split,则不会再进行划分.
如果样本量不大,不需要设置这个值.
如果样本量数量级非常大,则推荐增大这个值.
min_samples_leaf: 叶子节点的最小样本数,(default = 1)
如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝.
较小的叶子结点样本数量使模型更容易捕捉训练数据中的噪声.
min_impurity_split: 节点划分最小不纯度
如果某节点的不纯度(基尼系数,均方差)小于这个阈值,则该节点不再生成子节点,并变为叶子节点.
一般不推荐改动默认值1e-7。
from sklearn.ensemble import RandomForestClassifier
rfc=RandomForestClassifier(max_depth=6,random_state=9)
rfc.fit(X_train,y_train)
rfc_y_pred=rfc.predict(X_test)
rfc.score(X_test,y_test)
三、adaboost
Adaptive Boosting(自适应提升)基于 Boosting思想实现的一种集成学习算法核心思想是通过逐步提高那些被前一步分类错误的样本的权重来训练一个强分类器。弱分类器的性能比随机猜测强就行,即可构造出一个非常准确的强分类器。其特点是:训练时,样本具有权重,并且在训练过程中动态调整。被分错的样本的样本会加大权重,算法更加关注难分的样本。
Adaboost自适应在于:“关注”被错分的样本,“器重”性能好的弱分类器:(观察下图)
(1)不同的训练集--->调整样本权重
(2)“关注”--->增加错分样本权重
(3)“器重”--->好的分类器权重大
(4) 样本权重间接影响分类器权重
思想:给定样本初始的权重,然后对决策树的预测结果算出错误率,错误率等于预测个数乘样本权重, 选择错误率最小的分裂点进行弱学习器的分裂或分类,通过错误率重新给样本权重赋值,预测正确的样本减小样本权重,预测错误的样本增加样本权重,然后通过错误率和样本权重给弱学习器赋予模型权重,最终的结果为每个弱学习器的预测结果乘以模型权重之和。
ada= AdaBoostClassifier(base_estimator=tree,n_estimators=500,learning_rate=0.1,random_state=0) ada = ada.fit(X_train,y_train)
base_estimator表示基学习器,learning_rate表示梯度下降算法的学习率
四、GBDT
梯度提升树(Gradient Boosting Decision Tre)是提升树(Boosting Decision Tree)的一种改进算法,所以在讲梯度提升树之前先来介绍一下提升树。
假如有个人30岁,我们首先用20岁去拟合,发现损失有10岁,这时我们用6岁去拟合剩下的损失,发现差距还有4岁,第三轮我们用3岁拟合剩下的差距,差距就只有一岁了。如果我们的迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小。最后将每次拟合的岁数加起来便是模型输出的结果。
思想:计算决策树分裂后的误差(平方和误差等等)来选择分裂点,预测值为分裂后各类样本的平均值,而真实值减去预测值就是下一个弱学习器的目标值,这样就能一步一步迭代,添加新的弱学习器来拟合残差,这里的残差恰好就是真实值和预测值之差,最后的结果就是各个学习器的结果之和。
梯度提升树不再使用拟合残差,而是利用最速下降的近似方法,利用损失函数的负梯度作为提升树算法中的残差近似值。
假设:
我们前一轮迭代得到的强学习器是:fi-1(x)
损失函数是:L(y,fi−1(x))
本轮迭代的目标是找到一个弱学习器:hi(x)
让本轮的损失最小化: L(y, fi(x))=L(y, fi−1(x)) + hi(x))
from sklearn.ensemble import GradientBoostingClassifier
gbc=GradientBoostingClassifier()
gbc.fit(X_train,y_train)
五、XGboost
XGBoost 是对GBDT的改进:
求解损失函数极值时使用泰勒二阶展开
在损失函数中加入了正则化项
XGB 自创一个树节点分裂指标。这个分裂指标就是从损失函数推导出来的。XGB 分裂树时考虑到了树的复杂度。
XGBoost(Extreme Gradient Boosting)全名叫极端梯度提升树,XGBoost是集成学习方法的王牌,在Kaggle数据挖掘比赛中,大部分获胜者用了XGBoost。
XGBoost在绝大多数的回归和分类问题上表现的十分顶尖
正则化项中包含树叶子节点个数和叶子节点输出值的向量,通过控制他们来控制树的复杂度从而缓解过拟合问题
API:
bst = XGBClassifier(n_estimators, max_depth, learning_rate, objective)