【Machine Learning】模型融合之Stacking
阿新 • • 發佈:2019-02-18
一、Stacking簡介
Stacking(stacked generalization)是在大資料競賽中不可缺少的武器,其指訓練一個用於組合(combine)其他多個不同模型的模型,具體是說首先我們使用不同的演算法或者其他方法能夠訓練出多個不同的模型,然後將這些模型的輸出作為新的資料集,即將這些訓練的模型的輸出再作為為輸入訓練一個模型,最後得到一個最終的輸出,下圖為Stacking的大致流程圖:
如果可以選用任意的組合演算法,那麼理論上,Stacking可以表示上面提到的各種Ensemble方法。但是在實際應用中通常使用單層logistic迴歸作為組合模型。
二、程式碼示例
在這裡使用了mlxtend庫,它可以很好地完成對sklearn模型地stacking。
# -*- coding: utf-8 -*-
import pickle
from xgboost import XGBClassifier
from sklearn.ensemble import ExtraTreesClassifier, RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from mlxtend.classifier import StackingCVClassifier
with open('../data/training_df.pkl', 'rb') as f:
df = pickle.load(f)
with open(r'../data/selected_feat_names.pkl', 'rb') as f:
selected_feat_names = pickle.load(f)
print("data loaded")
# train on full data set
y = df["attack_type"].values
X = df[selected_feat_names].values
xgb = XGBClassifier(learning_rate =0.5 ,n_estimators=300,max_depth=5,gamma=0,subsample=0.8,)
rfc = RandomForestClassifier(n_jobs=-1, n_estimators=35, criterion="entropy")
etc = ExtraTreesClassifier(n_jobs=-1, n_estimators=5, criterion="entropy")
lr = LogisticRegression(n_jobs=-1, C=8) # meta classifier
sclf = StackingCVClassifier(classifiers=[xgb, rfc, etc], meta_classifier=lr, use_probas=True, n_folds=3, verbose=3)
sclf.fit(X, y)
print("training finished")
# save model for later predicting
with open(r'../data/stacking.pkl', 'wb') as f:
pickle.dump(sclf, f)
print("model dumped")