知乎(必讀):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也是迭代,但是...