blending集成方法
思路介绍
综合多个基础模型,提高最后预测(回归问题或分类问题)的正确率
算法流程
(1)将总的数据集被分成训练集和测试集,再将训练集拆分成训练集和验证集,所以数据总共分为三类,测试集,验证集,测试集,训练集是为了训练模型,验证集是为了调整模型(调参),测试集则是为了检验模型的正确率。 (2)使用训练集创建了K个模型,如SVM、random forests、XGBoost等,这个是第一层的模型。 训练好模型后将验证集输入模型进行预测,得到K组不同的输出,我们记作 𝐴1,…,𝐴𝐾 ,然后将测试集输入K个模型也得到K组输出,我们记作 𝐵1,…,𝐵𝐾 ,其中 𝐴𝑖 的样本数与验证集一致, 𝐵𝑖 的样本数与测试集一致。 (3)使用K组2400个样本的验证集结果 𝐴1,…,𝐴𝐾 作为第二层分类器的特征,验证集的2400个标签为因变量,训练第二层分类器. (4)K组2000个样本的结果 𝐵1,…,𝐵𝐾 放入第二层分类器,得到2000个测试集的预测结果。
基础blending实例介绍
使用make_blobs生成数据集
data, target = make_blobs(n_samples=10000, centers=2, random_state=1, cluster_std=1.0 )
通过SVC,随机森林和k邻近算法将数据分类:
clfs = [SVC(probability = True),RandomForestClassifier(n_estimators=5, n_jobs=-1, criterion='gini'),KNeighborsClassifier()]
for i,clf in enumerate(clfs):
clf.fit(X_train,y_train)
val_feature = clf.predict_proba(X_val)[:, 1]
test_feature = clf.predict_proba(X_test)[:,1]
val_features[:,i] = val_feature
test_features[:,i] = test_feature
之后将第一层的验证集的结果输入第二层训练第二层分类器
from sklearn.model_selection import cross_val_score
lr.fit(val_features,y_val)
cross_val_score(lr,test_features,y_test,cv=5)
stacking集成算法
思路介绍
综合多个基础模型,提高最后预测(回归问题或分类问题)的正确率
算法流程
stacking算法与blending算法思路类似,主要的差别在于数据的使用上。 1.首先将所有数据集生成测试集和训练集(假如训练集为10000,测试集为2500行),那么上层会进行5折交叉检验,使用训练集中的8000条作为训练集,剩余2000行作为验证集(橙色)。 2.每次验证相当于使用了蓝色的8000条数据训练出一个模型,使用模型对验证集进行验证得到2000条数据,并对测试集进行预测,得到2500条数据,这样经过5次交叉检验,可以得到中间的橙色的5* 2000条验证集的结果(相当于每条数据的预测结果),5* 2500条测试集的预测结果。 3.接下来会将验证集的5* 2000条预测结果拼接成10000行长的矩阵,标记为 𝐴1 ,而对于5* 2500行的测试集的预测结果进行加权平均,得到一个2500一列的矩阵,标记为 𝐵1 。 4.上面得到一个基模型在数据集上的预测结果 𝐴1 、 𝐵1 ,这样当我们对3个基模型进行集成的话,相于得到了 𝐴1 、 𝐴2 、 𝐴3 、 𝐵1 、 𝐵2 、 𝐵3 六个矩阵。 5.之后我们会将 𝐴1 、 𝐴2 、 𝐴3 并列在一起成10000行3列的矩阵作为training data, 𝐵1 、 𝐵2 、 𝐵3 合并在一起成2500行3列的矩阵作为testing data,让下层学习器基于这样的数据进行再训练。 再训练是基于每个基础模型的预测结果作为特征(三个特征),次学习器会学习训练如果往这样的基学习的预测结果上赋予权重w,来使得最后的预测最为准确。
对stacking模型的一些理解(有参考网上的一些解释)
stacking模型就是训练一个多层(一般是两层,本文中默认两层)的学习器结构,第一层(也叫学习层)用n个不同的分类器(或者参数不同的模型)将得到预测结果合并为新的特征集,并作为下一层分类器的输入。 Stacking的输出层为什么用逻辑回归:为了降低过拟合的问题,第二层分类器应该是较为简单的分类器,广义线性如逻辑回归是一个不错的选择。在特征提取的过程中,我们已经使用了复杂的非线性变换,因此在输出层不需要复杂的分类器。这一点可以对比神经网络的激活函数或者输出层,都是很简单的函数,一点原因就是不需要复杂函数并能控制复杂度。
|