文章目录
本文介绍了常用的skleran包,以及集成学习的bagging和boosting算法,然后配合图解讲了Blending和Stacking两种模型融合的方法
我们用到的skleran包
#Logistic regression
from sklearn.linear_model import LogisticRegression
#support vector Machine 支持向量机
from sklearn import svm
#Random Forest随机森林
from sklearn.ensemble import RandomForestClassifier
#KNN近邻
from sklearn.neighbors import KNeighborsClassifier
#naive_bayes朴素贝叶斯
from sklearn.naive_bayes import GaussianNB
#Decision Tree决策树
from sklearn.tree import DecisionTreeClassifier
#拆分数据
from sklearn.model_selection import train_test_split
#accuracy measure
from sklearn import metrics
#for confusion matrix 混淆矩阵
from sklearn.metrics import confusion_matrix
from sklearn.svm import SVC
bagging和boosting的思想简述各自的代表模型原理
Boosting
Boosting的算法原理
- Boosting算法的工作机制是首先从训练集用初始权重训练出一个弱学习器1,
- 根据弱学习的学习误差率表现来更新训练样不的权重,使之前弱学习器1学习误差率高的训练样本点的权重变高而这些误差率高的点在后面的弱学习器2中得到更多的重视。
- 然后基于调整权重后的训练集来训练弱学习器2
- 如此重复进行,直到弱学习器数达到事先指定的数日T,最终将这T个弱学习器通过集合策略进行整合,得到最终的强学习器
Boosting算法原理示意图
代表模型
Adaboost,前向加性模型,是一组基函数的加权和
另一个代表算法就是GBDT-梯度决定决策树
在GBDT的迭代中,假设我们前一轮迭代得到的强学习器是
f
t
−
1
(
x
)
f_{t-1}(x)
ft−1(x),损失函数是
L
(
y
,
f
t
−
1
(
x
)
)
L(y, f_{t-1}(x))
L(y,ft−1(x)),我们本轮迭代的目标是找到一个回归树模型的弱学习器
h
(
x
)
h(x)
h(x),让本轮的损失函数
L
(
y
,
f
t
(
x
)
)
=
L
(
y
,
f
t
−
1
(
x
)
+
h
t
(
x
)
)
L(y, f_t(x))=L(y,f_{t-1}(x)+ h_t(x))
L(y,ft(x))=L(y,ft−1(x)+ht(x))最小
也就是说,本轮迭代找到决策树,要让样本的损失尽量变得更小
GBDT的思想可以用一个通俗的例子解释,假如有个人30岁,我们首先用20岁去拟合,发现损失有10岁,这时我们用6岁去拟合剩下的损失,发现差距还有4岁,第三轮我们用3岁拟合剩下的差距,差距就只有一岁了。如果我们的迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小,最后把每次拟合的值加起来就是真实年龄
Bagging
Bagging的算法原理:
bagging的个体弱学习器的训练集是通过随机采样得到的。通过T次的随机采样我们就可以得到T个采样集,对于这T个采样集,我们可以分别独立的训练出T个弱学习器,再对这T个弱学习器通过集合策略来得到最终的强学习器。
随机采样- -般采用的是自助采样法( Bootstrap sampling),有 放回地采集T次,最终可以得到T个样本的采样集,由于是随机采样,这样每次的采样集是和原始训练集不同的,和其他采样集也是不同的,这样得到多个不同的弱学习器。
Bagging的算法原理示意图:
随机森林是bagging的一一个最常见的实现方案,随机森林有其特殊的地方
-
随机森林的弱学习器都是决策树。
-
随机森林在bagging的样本随机采样基础上,又加上了特征的随机选择
stacking和blending的原理和各自的优劣
模型融合有许多方法,简单的有平均融合,加权融合,投票融合等方法;较为复杂的就是Blending和Stacking了。后面两种模型融合方法理解起来比较困难,本文才有图解方式让读者可以更好的理解这两种融合方法。
Blending
Blending 流程
Blending相较于Stacking来说要简单一些,其流程大致分为以下几步:
- 将数据划分为训练集和测试集(test_set),其中训练集需要再次划分为训练集(train_set)和验证集(val_set);
- 创建第一层的多个模型,这些模型可以使同质的也可以是异质的;
- 使用train_set训练步骤2中的多个模型,然后用训练好的模型预测val_set和test_set得到val_predict, test_predict1;
- 创建第二层的模型,使用val_predict作为训练集训练第二层的模型;
- 使用第二层训练好的模型对第二层测试集test_predict1进行预测,该结果为整个测试集的结果
Blending 图解
Stacking
Stacking 流程
Stacking流程比较复杂因为涉及到交叉验证的过程,其流程与Blending类似,具体如下:
- 将数据划分为训练集和测试集(test_set),对训练集进行划分为K个大小相似的集合,取其中一份作为验证集val_set,其余的为训练集train_set;
- 创建第一层的多个模型,这些模型可以使同质的也可以是异质的;
- 对于每一个模型来说,train_set和val_set是不一样的,如下图所示;然后利用各自的train_set训练各自的模型,训练好的模型对各自的val_set和test_set进行预测,得到val_predict和test_predict;
- 创建第二层的模型,将每个模型对应的val_predict拼接起来作为第二层的训练集,将所有模型的test_predict取平均值作为第二层的测试集;用训练好的第二层模型对第二层的测试集进行预测,得到的结果即为整个测试集的结果
Stacking 图解
Blending与Stacking对比
Blending的优点在于:
-
比stacking简单(因为不用进行k次的交叉验证来获得stacker feature)
-
避开了一个信息泄露问题:generlizers和stacker使用了不一样的数据集
-
在团队建模过程中,不需要给队友分享自己的随机种子
而缺点在于:
-
使用了很少的数据(是划分hold-out作为测试集,并非cv)
-
blender可能会过拟合(其实大概率是第一点导致的)
-
stacking使用多次的CV会比较稳健
以上仅为作者一己之见,如有理解错误欢迎大佬评论指正。