从零实现机器学习算法(七) Blending

时间:2024-03-14 16:12:07

目录

1. Blending简介

2. Blending模型

2.1 第一层模型

2.2 第二层模型

2.3 分类规则

3. 总结与分析


1. Blending简介

Blending是一种模型融合的方式,第一层通过将训练集出一部分作为holdout set,然后通过剩下的数据生成模型对holdout set 进行预测,第二层,直接对预测结果建模生成第二层的模型,如图所示。Blending是 Netflix获胜者提出来的模型融合方法,更偏向工程类,因此本文不会有太多的公式。

从零实现机器学习算法(七) Blending

 

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回归分别进行比较,其检测结果如下:

从零实现机器学习算法(七) Blending

 

可以看到运行时间大概为基本分类器的时间之和,但是效果有了一定的提升。

本文相关代码和数据集:https://github.com/DandelionLau/MachineLearning

 

参考文献:

[1] 图解Blending&Stacking

[2] KAGGLE ENSEMBLING GUIDE