Stacking模型融合

Contents

一、背景

集成学习主要包括(Bagging,Boosting,Stacking),而 Stacking(stacked generalization)是在比赛中常用的一种模型融合方法,以提高模型准确度,下面以我的理解借着图形进行简要介绍。

二、Stacking经典图

我们先来看两幅图
图1 image1

图2 image2

我们使用 m 个算法,分别求出对于我们数据而言,相对的预测结果 P1、P2 … Pm,我们不直接使用这 m 个预测结果进行综合来得到预测结果。而是将这个 m 个预测结果作为输入,再添加一层算法 Meta-Classifer,训练一个新的模型,用这个新的模型的输出作为我们最终的预测结果。 从图2可以看出这整个过程。

而图1 则表明了每个模型进行K折交叉验证后得出的模型预测结果
每一次的交叉验证包含两个过程

  • 基于 training data 训练模型;
  • 基于 training data 训练生成的模型对 testing data 进行预测。

对于Stacking模型,几层是一个超参数,每层我们使用多少个模型,又是一个超参数,正因为如此,Stacking模型相应会复杂很多,也正因为复杂性,很容易过拟合。

三、 代码

下面我们使用一款功能强大的stacking利器,mlxtend库,它可以很快地完成对sklearn模型地Stacking。 这里我们介绍最基本的使用方法,用前面分类器产生的特征输出作为最后总的meta-classifier的输入数据。 下面的代码依旧使用之前的特征

from sklearn import svm
from sklearn.svm import LinearSVC
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from xgboost import XGBClassifier
from lightgbm  import LGBMClassifier
from mlxtend.classifier import StackingClassifier
import numpy as np
 
clf1 = svm.SVC(kernel = 'linear', probability=True)
clf2 = svm.SVC(kernel='poly', probability=True)
clf3 = LinearSVC(C=0.05, penalty='l2', dual=True)
clf4 = RandomForestClassifier(n_estimators=40, criterion='gini', max_depth=9)
clf5 = XGBClassifier(learning_rate=0.1, max_depth=3, n_estimators=50)
clf6 = LGBMClassifier(boosting_type='gbdt', learning_rate=0.01, max_depth=5, n_estimators=250, num_leaves=90)

lr = LogisticRegression(penalty='l1', C = 0.1)


sclf = StackingClassifier(classifiers=[clf1, clf2, clf3, clf4, clf5, clf6], 
                          meta_classifier=lr)
 
print('5-fold cross validation:\n')
 
for clf, label in zip([clf1, clf2, clf3, clf4, clf5, clf6, sclf], 
                      ['svm.SVC_linear', 
                       'svm.SVC_poly', 
                       'LinearSVC',
                       'RandomForestClassifier',
                       'xgb.XGBClassifier',
                       'lgb.LGBMClassifier', 
                       'StackingClassifier',
                      ]):
 
    scores = model_selection.cross_val_score(clf, X_train, y_train, 
                                              cv=5, scoring='accuracy')
    print("Accuracy: %0.2f (+/- %0.2f) [%s]" 
          % (scores.mean(), scores.std(), label))

输出

5-fold cross validation:

Accuracy: 0.79 (+/- 0.01) [svm.SVC_linear]
Accuracy: 0.76 (+/- 0.01) [svm.SVC_poly]
Accuracy: 0.79 (+/- 0.02) [LinearSVC]
Accuracy: 0.79 (+/- 0.01) [RandomForestClassifier]
Accuracy: 0.80 (+/- 0.01) [xgb.XGBClassifier]
Accuracy: 0.80 (+/- 0.01) [lgb.LGBMClassifier]
Accuracy: 0.78 (+/- 0.01) [StackingClassifier]

四、小结

我们在这里仅介绍最基本的使用方法,用前面分类器产生的特征输出作为最后总的 meta-classifier 的输入数据,另一种使用第一层基本分类器产生的类别概率值作为 meta-classfier 的输入,另外一种方法是对训练基中的特征维度进行操作的。后续我们可能讲到。

References

[1] 详解stacking过程
[2] 集成学习总结 & Stacking方法详解
[3] StackingClassifier

Further Reading

[1] StackingClassifier


转载请注明:yezuolin的博客 » 点击阅读原文