機器學習 Stacking融合模型

2021-08-21 21:51:13 字數 3917 閱讀 6934

知乎(必讀):kaggle機器學習之模型融合(stacking)心得

mrlevo520的

blog:  

stacking learning在分類問題中的使用

blog:stacking models for improved predictions

blog:kaggle ensembling guide(註腳)

blog:如何在 kaggle 首戰中進入前 10%

github:[ikki407](stacking

神作:stacked generalization (stacking)

二. 基本原理

三.**實現

label為10類的乙個多酚類問題

from sklearn.model_selection import kfold

from sklearn.model_selection import train_test_split

from sklearn.datasets import load_digits

import numpy as np

from sklearn.svm import svc

from sklearn import metrics

from sklearn.ensemble import randomforestclassifier

from sklearn import preprocessing

import pandas as pd

# 匯入資料集切割訓練與測試資料

data = load_digits()

data_d = preprocessing.standardscaler().fit_transform(data.data)

data_l = data.target

data_train, data_test, label_train, label_test = train_test_split(data_d,data_l,random_state=1,test_size=0.7)

def selectmodel(modelname):

if modelname == "svm":

from sklearn.svm import svc

model = svc(kernel='rbf', c=16, gamma=0.125,probability=true)

elif modelname == "gbdt":

from sklearn.ensemble import gradientboostingclassifier

model = gradientboostingclassifier()

elif modelname == "rf":

from sklearn.ensemble import randomforestclassifier

model = randomforestclassifier()

elif modelname == "xgboost":

import xgboost as xgb

model = xgb()

elif modelname == "knn":

from sklearn.neighbors import kneighborsclassifier as knn

model = knn()

else:

pass

return model

def get_oof(clf,n_folds,x_train,y_train,x_test):

ntrain = x_train.shape[0]

ntest = x_test.shape[0]

classnum = len(np.unique(y_train))

kf = kfold(n_splits=n_folds,random_state=1)

oof_train = np.zeros((ntrain,classnum))

oof_test = np.zeros((ntest,classnum))

for i,(train_index, test_index) in enumerate(kf.split(x_train)):

kf_x_train = x_train[train_index] # 資料

kf_y_train = y_train[train_index] # 標籤

kf_x_test = x_train[test_index] # k-fold的驗證集

clf.fit(kf_x_train, kf_y_train)

oof_train[test_index] = clf.predict_proba(kf_x_test)

oof_test += clf.predict_proba(x_test)

oof_test = oof_test/float(n_folds)

return oof_train, oof_test

# 單純使用乙個分類器的時候

clf_second = randomforestclassifier()

clf_second.fit(data_train, label_train)

pred = clf_second.predict(data_test)

accuracy = metrics.accuracy_score(label_test, pred)*100

print accuracy

# 91.0969793323

# 使用stacking方法的時候

# 第一級,重構特徵當做第二級的訓練集

modelist = ['svm','gbdt','rf','knn']

newfeature_list =

newtestdata_list =

for modelname in modelist:

clf_first = selectmodel(modelname)

oof_train_ ,oof_test_= get_oof(clf=clf_first,n_folds=10,x_train=data_train,y_train=label_train,x_test=data_test)

# 特徵組合

newfeature = reduce(lambda x,y:np.concatenate((x,y),axis=1),newfeature_list)

newtestdata = reduce(lambda x,y:np.concatenate((x,y),axis=1),newtestdata_list)

# 第二級,使用上一級輸出的當做訓練集

clf_second1 = randomforestclassifier()

clf_second1.fit(newfeature, label_train)

pred = clf_second1.predict(newtestdata)

accuracy = metrics.accuracy_score(label_test, pred)*100

print accuracy

# 96.4228934817

這裡只是使用了兩層的stacking,完成了乙個基本的stacking操作,也可以同理構建三層,四層等等

對於第二級的輸入來說,特徵進行了變化(有一級分類器構成的判決作為新特徵),所以相應的測試集也需要進行同樣的轉換,畢竟分類器學習的訓練集已經不一樣了,學習的內容肯定是無法適用於舊的測試集的,要清楚的是,當初我們是對整個data集合隨機分測試集和訓練集的!

適用k-fold的方法,實質上使用了cv的思想,所以資料並沒有洩露(沒有用到測試集,用的是訓練集中的hold-set),所以這個方法也叫做out-of-folds

模型融合之stacking方法

之前一直對stacking一知半解,找到的資料也介紹的很模糊。所以有多看了幾篇文章,然後來此寫篇部落格,加深一下印象,順便給各位朋友分享一下。stacking的過程有一張圖非常經典,如下 雖然他很直觀,但是沒有語言描述確實很難搞懂。上半部分是用乙個基礎模型進行5折交叉驗證,如 用xgboost作為基...

學習法Stacking 機器學習

前面的博文中我們介紹了boosting和bagging兩種整合學習方法,這篇博文中我們繼續學習其他的整合學習方法。當訓練資料很多的時候,一種更為強大的結合策略是使用 學習法 即通過另外乙個學習器來進行結合。stacking是學習的典型代表。在學習法中將個體學習器稱為初級學習器,用於結合的學習器稱為次...

機器學習 GBDT演算法與stacking演算法

gbdt 梯度提公升迭代決策樹 總結 優先解決回歸問題,將第乙個資料的殘差傳入到第二個資料中去 詳述 gbdt也是boosting演算法的一種,但是和adaboost演算法不同 區別如下 adaboost演算法是利用前一輪的弱學習器的誤差來更新樣本權重值,然後一輪一輪 的迭代 gbdt也是迭代,但是...