目录
1. Blending简介
Blending是一种模型融合的方式,第一层通过将训练集出一部分作为holdout set,然后通过剩下的数据生成模型对holdout set 进行预测,第二层,直接对预测结果建模生成第二层的模型,如图所示。Blending是 Netflix获胜者提出来的模型融合方法,更偏向工程类,因此本文不会有太多的公式。
2. Blending模型
Blending模型包括第一层模型、第二层模型和分类规则,下面分别介绍
2.1 第一层模型
Blending第一层将训练集需要划分为训练集(train_set)和验证集(val_set)。第一层中可以选择多个模型,这些模型可以是同质的也可以是异质的。然后分别使用训练集对这些模型训练,将训练好的模型对验证集进行验证得到预测特征。这些预测特征将作为第二层的训练集。第一层模型的训练代码如下:
train_data1, train_data2, train_label1, train_label2 = train_test_split(train_data, train_label, test_size=0.5, random_state=2019)
# train set in the second layer
train_predict_feature = np.zeros((train_data2.shape[0], self.k))
trained_model = []
# the first layer in Blending
for j, clf in enumerate(self.classifier_set):
# train each submodel
print(j, clf)
clf.train(train_data1, train_label1)
train_predict_feature[:, j] = clf.predict(train_data2)[:, 0]
# save the trained model in the first layer
trained_model.append(clf)
2.2 第二层模型
Blending第二层模型就是普通的计算学习方法,其训练集是第一层得到的预测特征,这里以单层感知机为例,其代码如下
# the second layer in Blending
layer2_clf = PerceptronClassifier()
layer2_clf.train(train_predict_feature, train_label2)
2.3 分类规则
Blending在测试过程中,也分为两层。在第一层中,使用训练好的模型对测试数据进行预测,得到测试集的预测特征;在第二层中使用训练好的单层感知机对预测特征进行预测,得到最终的预测结果,其代码如下:
test_predict_feature = np.zeros((test_data.shape[0], self.k))
# the first layer in Blending
for j, clf in enumerate(self.layer1_classifier_set):
test_predict_feature[:, j] = clf.predict(test_data)[:, 0]
# the second layer in Blending
probability = self.layer2_classifier.predict(test_predict_feature)
3. 总结与分析
Blending是一种较为简单的融合方式,其分类器的选择多种多样,不同的分类器组合可以得到不同的效果,因此在实际应用过程中选择分类器占了大部分的时间。最后看一下检测效果,本文使用了如下的分类器组合
clfs = [PerceptronClassifier(), PerceptronClassifier(), LogisticRegressionClassifier(), LogisticRegressionClassifier()]
然后和感知机和Logistic回归分别进行比较,其检测结果如下:
可以看到运行时间大概为基本分类器的时间之和,但是效果有了一定的提升。
本文相关代码和数据集:https://github.com/Ryuk17/MachineLearning
参考文献: