模型融合 Stacking Blending

2021-09-24 21:33:14 字數 4009 閱讀 2055

模型融合是指通過分層對模型進行整合,比如以兩層為例,第一層為基學習器,使用原始訓練集訓練基學習器,每個基學習器的輸出生成新的特徵,作為第二層模型的輸入,這樣就生成了新的訓練集;第二層模型在新的訓練集上再進行訓練,從而得到融合的模型。

stacking

stacking是模型融合的常用方法,重點是在第一層中,如何用基學習器生成新特徵,包含訓練資料集的新特徵和測試資料集的新特徵。

1、訓練資料集新特徵的生成

如果直接在訓練資料集中對基學習器進行訓練,然後用輸出作為新特徵,容易造成過擬合。所以為了減少過擬合的影響,可以採取k-folds的方式生成新特徵。如下圖,以5-folds為例,mi為第i個基學習器。

(1)將訓練資料集train隨機等分為5份,分別為fold1~fold5;

(2)對i=1, 2, ...,n:

在上對mi進行訓練,得到學習器mi_1,然後對fold1進行**,得到新特徵在fold1上的值newfeaturei_1,以此類推,依次得到newfeaturei_2~newfeaturei_5,最後將newfeaturei_1~newfeaturei_5合併在一起,得到新特徵newfeaturei;

(3)新特徵組成了新的訓練資料集newtrain=,作為下一層的訓練資料集。

2、測試資料集新特徵的生成

在上面的k-folds方法中,每一次在訓練集上得到基學習器後,就對測試資料集test進行**,然後對k次的**結果求平均,就得到了test上的新特徵,如下圖。

除了上面的k-folds方法,還可以對全部訓練集進行訓練得到mi,然後用mi對測試集**得到新特徵,如下圖。

採用上述方法,得到新的訓練集和測試集後,就可以進行第二層的模型訓練了。

blending

blending和stacking比較相似,但相對簡單。只需將訓練集train分成2部分,train1訓練基學習器,train2的**值作為訓練集的新特徵,test的**值作為測試集的新特徵。

stacking和blending比較

1、stacking更複雜,需要進行經過k-fold生成新特徵,而blending相對簡單;

2、stacking通過k-fold會更穩定,而blending使用的資料更少,更容易過擬合。

heamy模組實現模型融合

除了自己動手實現stacking和blending,python中的heamy模組很好地實現了stacking和blending,可以直接使用。簡單列一下該模組的使用方法。

1、heamy.dataset.dataset(x_train=none, y_train=none, x_test=none, y_test=none, preprocessor=none, use_cache=true)
用於構建資料集合,將訓練集的x、訓練集的y、測試集的x、測試集的y集合在一起。其中y_test可為none。如下構建資料集合model_dataset:

from heamy.dataset import datasetmodel_dataset = dataset(x_train=xtrain, y_train=ytrain, x_test=xtest)
2、heamy.estimator.classifier(dataset, estimator=none, parameters=none, name=none, use_cache=true, probability=true)
用於構建基學習器,如下構建model_xgb和model_lgb:

from heamy.estimator import classifierimport lightgbm as lgbimport xgboost as xgbdef xgb_model(x_train, y_train, x_test, y_test=none):# 模型引數params =dtrain = xgb.dmatrix(x_train, label=y_train)dtest = xgb.dmatrix(x_test)model = xgb.train(params, dtrain, num_boost_round=300)predict = model.predict(dtest)return predictdef lgb_model(x_train, y_train, x_test, y_test=none):lgb_train = lgb.dataset(x_train, y_train)params =model = lgb.train(params, lgb_train, num_boost_round=300)predict = model.predict(x_test)return predictmodel_xgb = classifier(dataset=model_dataset, estimator=xgb_model,name='xgb',use_cache=false)model_lgb = classifier(dataset=model_dataset, estimator=lgb_model,name='lgb',use_cache=false)
3、heamy.pipeline.modelspipeline(*args)
將基學習器組合在一起:

from heamy.pipeline import modelspipelinepipeline = modelspipeline(model_xgb, model_lgb)
pipeline.stack()用於stacking
# 構建第一層新特徵,其中full_test=true,對全部訓練集進行訓練得到基學習器,然後用基學習器對測試集**得到新特徵stack_ds = pipeline.stack(k=5, seed=111, full_test=true)# 第二層使用邏輯回歸進行stackstacker = classifier(dataset=stack_ds, estimator=logisticregression, parameters=)# 測試集的**結果predict_stack = stacker.predict()
pipeline.blend()用於模型blending
# 構建第一層新特徵,將訓練集切分成8:2,其中80%用於訓練基學習器,20%用於構建新特徵blend_ds = pipeline.blend(proportion=0.2,seed=111)# 第二層使用邏輯回歸進行blendblender = classifier(dataset=blend_ds, estimator=logisticregression, parameters=)# 測試集的**結果predict_blend = blender.predict()

keras模型融合

1.構建模型 模型1 33次風運動 defmodel1 ipt layer1 dense units 512,input dim input node,kernel initializer normal activation sigmoid name layer1 ipt layer2 dense ...

模型融合方法總結

即各模型結果的均值 各模型結果 權值再求和,其中權值通過交叉驗證確定,權值之和為1 適合模型結果差異比較小的情況 從特徵,引數,樣本的多樣性差異性來做多模型融合,參考隨機森林 首先將訓練集分為兩部分 d1和d2 一部分用於第一層 level 1 的訓練,另一部分用於第二層 level 2 的訓練。l...

演算法實踐 模型融合

表現最好的模型是gbdt和xgboost。以準確率和auc值為判別標準 模型評估 如下 gbdt 訓練集 標籤和概率輸出 train gbdt predict clf gbdt.predict x train train gbdt predict pro clf gbdt.predict proba...