之前的文章中談到了機(jī)器學(xué)習(xí)項(xiàng)目中俏险,要想使得使得機(jī)器學(xué)習(xí)模型進(jìn)一步提升,我們必須使用到模型融合的技巧整吆,今天我們就來談?wù)勀P腿诤现斜容^常見的一種方法——stacking疹鳄。翻譯成中文叫做模型堆疊,接下來我們就來了解下篓冲,此法到底如何將模型做堆疊從而提升模型效果的李破。
stacking具體流程
我們就對(duì)著下圖(兩層的stacking)來詳細(xì)描述一下如何做模型stacking:
- 首先將數(shù)據(jù)分為5份,
- 在stacking的第一層定義5個(gè)基模型[model_1 ,model_2,model_3,model_4,model_5]壹将,其中每個(gè)模型選擇做一下5折的交叉驗(yàn)證的預(yù)測嗤攻,這樣就相當(dāng)于每個(gè)模型將所有數(shù)據(jù)預(yù)測了一遍,舉個(gè)例子诽俯,最終每一個(gè)訓(xùn)練數(shù)據(jù)會(huì)被轉(zhuǎn)換為[1,1,1,1,0]形狀妇菱,維度為5的向量。
- 將第一層5個(gè)基模型的輸出預(yù)測向量[1,1,1,1,0],作為第二層模型model_6的特征做訓(xùn)練闯团,
- 做test時(shí)辛臊,直接將test的數(shù)據(jù)喂給之前第一層訓(xùn)練好的5個(gè)基模型,5個(gè)模型預(yù)測出的至平均后作為第二層模型的輸入偷俭。
大家可以簡單的將stacking的第一層模型理解成一個(gè)超強(qiáng)的特征轉(zhuǎn)換層浪讳。
Stacking注意事項(xiàng)
做Stacking模型融合時(shí)需要注意以下個(gè)點(diǎn),我們拿2層stacking模型融合來舉例子:
- 第一層的基模型最好是強(qiáng)模型涌萤,而第二層的基模型可以放一個(gè)簡單的分類器淹遵,防止過擬合。
- 第一層基模型的個(gè)數(shù)不能太小负溪,因?yàn)橐粚幽P蛡€(gè)數(shù)等于第二層分類器的特征維度透揣。大家可以把勉強(qiáng)將其想象成神經(jīng)網(wǎng)絡(luò)的第一層神經(jīng)元的個(gè)數(shù),當(dāng)然這個(gè)值也不是越多越好川抡。
- 第一層的基模型必須準(zhǔn)而不同"辐真,如果有一個(gè)性能很差的模型出現(xiàn)在第一層,將會(huì)嚴(yán)重影響整個(gè)模型融合的效果(筆者在實(shí)驗(yàn)過程中就遇到這樣的坑)崖堤。
通過上述的描述侍咱,大家沒有發(fā)現(xiàn)其實(shí)2層的stacking 其實(shí)和兩層的神經(jīng)網(wǎng)絡(luò)有些相像,只不過stacking將神經(jīng)網(wǎng)絡(luò)第一層的神經(jīng)元換成了強(qiáng)大的機(jī)器學(xué)習(xí)模型密幔。
實(shí)驗(yàn)部分
數(shù)據(jù)準(zhǔn)備
from sklearn.datasets import make_classification
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingClassifier as GBDT
from sklearn.ensemble import ExtraTreesClassifier as ET
from sklearn.ensemble import RandomForestClassifier as RF
from sklearn.ensemble import AdaBoostClassifier as ADA
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score
import numpy as np
x,y = make_classification(n_samples=6000)
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.5)
定義第一層模型
由于Stacking的第一層最后選擇比較強(qiáng)的模型楔脯,所以這里筆者選了四個(gè)本身就是集成模型的強(qiáng)模型,GBDT胯甩,RandomForest昧廷,ExtraTrees,和 Adaboost偎箫。
### 第一層模型
clfs = [ GBDT(n_estimators=100),
RF(n_estimators=100),
ET(n_estimators=100),
ADA(n_estimators=100)
]
X_train_stack = np.zeros((X_train.shape[0], len(clfs)))
X_test_stack = np.zeros((X_test.shape[0], len(clfs)))
數(shù)據(jù)輸入第一層模型木柬,輸出即將喂給第二層模型特征
6折交叉驗(yàn)證,同時(shí)通過第一層的強(qiáng)模型訓(xùn)練預(yù)測生成喂給第二層的特征數(shù)據(jù)淹办。
### 6折stacking
n_folds = 6
skf = StratifiedKFold(n_splits=n_folds, shuffle=True, random_state=1)
for i,clf in enumerate(clfs):
# print("分類器:{}".format(clf))
X_stack_test_n = np.zeros((X_test.shape[0], n_folds))
for j,(train_index,test_index) in enumerate(skf.split(X_train,y_train)):
tr_x = X_train[train_index]
tr_y = y_train[train_index]
clf.fit(tr_x, tr_y)
#生成stacking訓(xùn)練數(shù)據(jù)集
X_train_stack [test_index, i] = clf.predict_proba(X_train[test_index])[:,1]
X_stack_test_n[:,j] = clf.predict_proba(X_test)[:,1]
#生成stacking測試數(shù)據(jù)集
X_test_stack[:,i] = X_stack_test_n.mean(axis=1)
用第一層模型的輸出特征眉枕,訓(xùn)練第二層模型
為了防止過擬合,第二層選擇了一個(gè)簡單的Logistics回歸模型怜森。輸出Stacking模型的auc得分齐遵。
###第二層模型LR
clf_second = LogisticRegression(solver="lbfgs")
clf_second.fit(X_train_stack,y_train)
pred = clf_second.predict_proba(X_test_stack)[:,1]
roc_auc_score(y_test,pred)#0.9946
同時(shí)筆者對(duì)比了第一層四個(gè)基模型的得分情況。
GBDT分類器性能
###GBDT分類器
clf_1 = clfs[0]
clf_1.fit(X_train,y_train)
pred_1 = clf_1.predict_proba(X_test)[:,1]
roc_auc_score(y_test,pred_1)#0.9922
隨機(jī)森林分類器性能
###隨機(jī)森林分類器
clf_2 = clfs[1]
clf_2.fit(X_train,y_train)
pred_2 = clf_2.predict_proba(X_test)[:,1]
roc_auc_score(y_test,pred_2)#0.9944
ExtraTrees分類器性能
###ExtraTrees分類器
clf_3 = clfs[2]
clf_3.fit(X_train,y_train)
pred_3 = clf_3.predict_proba(X_test)[:,1]
roc_auc_score(y_test,pred_3)#0.9930
AdaBoost分類器性能
###AdaBoost分類器
clf_4 = clfs[3]
clf_4.fit(X_train,y_train)
pred_4 = clf_4.predict_proba(X_test)[:,1]
roc_auc_score(y_test,pred_4)#0.9875
最終結(jié)果如下圖所示:其中Stacking集成模型得分最高為0.9946,而且筆者做了多次實(shí)驗(yàn)塔插,性能也比較穩(wěn)定。
結(jié)語
確實(shí)Stacking集成模型后拓哟,模型的性能有了提升想许,同時(shí)筆者說說實(shí)驗(yàn)過程中遇的坑,之前的筆者在Stacking第一層放了一個(gè)Logistic回歸模型,其本身的性能就不好流纹,最終導(dǎo)致Stacking的效果反而變差糜烹,所以一定要記住,Stacking前面層的模型性能一定要強(qiáng)漱凝,還是類比神經(jīng)網(wǎng)絡(luò)疮蹦,特征提取網(wǎng)絡(luò)(NLP領(lǐng)域的:Tansformer,圖像領(lǐng)域的:Resnet)一定要強(qiáng)茸炒,這樣才能產(chǎn)生好的效果愕乎。做完整個(gè)實(shí)驗(yàn),筆者感悟到:Stacking貌似做的還是特征轉(zhuǎn)換壁公,或者叫表示學(xué)習(xí)感论。