目录
前言
集成模型(ensemble)
1、装袋法(Bagging)
BaggingClassifier
BaggingRegression
RandomForest
2、提升法( Boosting )
AdaBoostClassifier
Gradient Boosting Decision Tree
3、堆叠法(Stacking)
4、VotingClassifier
总结
前言
“三个臭皮匠,赛过诸葛亮”
单个模型的结果会有一定的片面性,将多个模型(可以相同也可以不同)的结果用某种策略将他们结合起来通常可获得比单一模型更好的泛化性能。这种为获取更好的泛化性能的多模型组合称为集成模型。
集成模型(ensemble)
常用的集成方法有装袋法(Bagging)、提升法( Boosting )、堆叠法(Stacking)、投票法(VotingClassifier)。
装袋法通过并行的组合多个模型,尽可能使其相互独立。用于分类中,得到强分类器,可有效减小方差。用于回归亦可减少均方误差。
提升法通过串行的组合多个模型,采用策略提升单个模型效果。用于分类中,组合得到强分类器,有效减小偏差。
堆叠法通过组合多个不同模型,将每个模型的预测结果当做最后模型的输入,建立一个高层的综合模型,可以有效改进预测效果。
1、装袋法(Bagging)
装袋法的核心方法是自助抽样(Bootstrap)和聚合(Aggregating)。
可用于分类与回归。对分类问题采用多数投票法进行预测;对回归问题采用平均法进行预测。
每个基模型在训练时,采用有放回的自助抽样(Bootstrap)从训练集中抽取部分样本训练。理论上不会超过63.2%的样本被抽中用于训练,没抽中的样本称为袋外样本。
对袋外样本,作为测试集,测试基模型对它的分类情况,计算错误率(袋外),评估分类模型的泛化性能;对回归情况,计算均方误差(袋外误差),评估回归模型的泛化性能。
BaggingClassifier
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
model_DT=DecisionTreeClassifier(random_state=1) #实例化基模型,本例使用决策树
bag_DT=BaggingClassifier(n_estimators=100, #基模型个数
max_samples=1.0 #基模型使用的训练集中样本的比例(float)或个数(int)
max_features=1.0 #基模型使用的训练集中特征的比例(float)或个数(int)
base_estimator=model_DT, #基模型
oob_score=True, #计算袋外样本得分
random_state=10,
bootstrap=True #有放回抽样本
bootstrap_features=True #有放回的抽特征
)
bag_DT.fit(X_train,y_train)
BaggingRegression
from sklearn.ensemble import BaggingRegressor
BR=BaggingRegressor()
...
RandomForest
基模型为决策树
Random:
对样本进行有放回抽样(boostrap)
对特征进行随机抽样(共𝑑个特征,一般随机选取𝑚 = + 1)
from sklearn.ensemble import RandomForestClassifier
model=RandomForestClassifier(n_estimators=100,
criterion='gini',
max_depth=None,
min_samples_split=2,
min_samples_leaf=1,
min_weight_fraction_leaf=0.0,
max_features='auto',
random_state=1,
oob_score=True)
model.fit(X_train,y_train)
2、提升法( Boosting )
AdaBoostClassifier
Boosting的典型代表,利用同一训练样本的不同加权版本,训练一组弱分类器, 然后把这些弱分类器以加权的形式集成起来,形成一个强分类器
特点:
改变样本权重的方式训练弱分类器,后一个弱分类器基于前一个分类器的结果来训练
能够自动学习多个弱分类器集成时的分类器权重,权重越高,证明弱分类器效果更好
from sklearn.ensemble import AdaBoostClassifier
model_ada=AdaBoostClassifier(base_estimator=None, #default DecisionTreeClassifier
n_estimators=50,
random_state=1,
algorithm="SAMME")
model_ada.fit(X_train,y_train)
Gradient Boosting Decision Tree
梯度提升树,Gradient Boosting Decision Tree
以回归树为基学习器的boosting方法
用损失函数的负梯度来拟合每轮损失的近似值
输入:训练集𝑇 = { 𝑥1, 𝑦1 , … , (𝑥𝑚, 𝑦𝑚)},最大迭代次数𝑇,损失函数L
输出强学习器𝑓(𝑥):
初始化弱学习器:
对迭代轮数𝑡 = 1,2, … , 𝑇:
对样本𝑖 = 1,2, … , 𝑚,计算负梯度:
利用(
,
)拟合一棵CART回归树,得到第𝑡棵树,其对应的叶子节点区域为𝑅𝑡𝑖,𝑗 = 1,2, … ,𝐽,𝐽为叶子节点个数 对于叶子区域𝑗 = 1,2, … ,𝐽,计算最佳拟合值:
更新强学习器:
强学习器:
from sklearn.ensemble import GradientBoostingClassifier
model_gbdt=GradientBoostingClassifier(random_state=10,subsample=.7)
model_gbdt.fit(X_train,y_train)
3、堆叠法(Stacking)
stacking 的是学习几个不同的弱学习器,并通过训练一个综合模型来组合它们,然后基于这些弱模型返回的多个预测结果输出最终的预测结果。
因此,要构建 stacking 模型,需要确定 n个学习器以及组合它们的模型。
例如,对于分类问题来说,我们可以选择 KNN 分类器、logistic 回归和SVM 作为弱学习器,并决定学习神经网络作为综合模型。然后,神经网络将会把三个弱学习器的输出作为输入,并返回基于该输入的最终预测。
from sklearn.ensemble import StackingClassifier
from sklearn.ensemble import StackingRegressor
4、VotingClassifier
组合不同的基分类器,最终通过多数投票(硬投票)或概率平均(软投票)的方式来预测样本类别
硬投票:
对于一个样本,每个基分类器都预测一个类别,所有的基分类器预测类别中最多的类将被 作为最终结果。
软投票:
在每个基分类器输出测试样本属于各个类的概率,将所有基分类器对每个类的预测概率进行平均得到最终测试样本属于每个类的概率,从中选择拥有最大概率的类。
对每个基分类器设置权重,用于对预测概率求进行加权平均,控制每个基分类器的贡献。
model_DT=DecisionTreeClassifier(random_state=1)
model_LR=LogisticRegression(random_state=1, class_weight='balanced')
#多模型的硬投票
model_vote_hard = VotingClassifier(estimators=[('DT',model_DT), ('LR',model_LR)])
model_vote_hard.fit(X_train, y_train)
#多模型的软投票
model_vote_soft = VotingClassifier(estimators=[('DT',model_DT), ('LR',model_LR)], voting='soft')
model_vote_soft.fit(X_train, y_train)
#####################################################################################
best_RF = RandomForestClassifier(max_features=6, n_estimators=500, random_state=10)
best_gbdt = GradientBoostingClassifier(n_estimators=200, learning_rate=0.01, subsample=0.3, random_state=10)
#集成模型的硬投票
model_vote_soft = VotingClassifier(estimators=[('RF',best_RF), ('GBDT',best_gbdt)])
model_vote_soft.fit(X_train, y_train)
#集成模型的软投票
model_vote_soft = VotingClassifier(estimators=[('RF',best_RF), ('GBDT',best_gbdt)], voting='soft')
model_vote_soft.fit(X_train, y_train)
总结
待完善@#¥%……&