stacking和blending的區(qū)別

看到網(wǎng)上有很多關(guān)于BlendingStacking有什么區(qū)別的討論,但感覺(jué)并沒(méi)有說(shuō)到點(diǎn)子上不从,最近在國(guó)外看了一篇比較好的博客,簡(jiǎn)潔明了地貼出了代碼和討論,所以我在這里總結(jié)一下病蛉。

直接說(shuō),其實(shí)Blending和Stacking基本上是一樣的瑰煎,除了有一點(diǎn)不同铺然,Blending它在訓(xùn)練基礎(chǔ)模型base model的時(shí)候,并沒(méi)有使用kfold方法(Stacking使用了Kfold)酒甸,而是拿了一部分?jǐn)?shù)據(jù)魄健,比如說(shuō)20%的數(shù)據(jù),這部分?jǐn)?shù)據(jù)不加入基礎(chǔ)模型的訓(xùn)練插勤,而是在基礎(chǔ)模型都訓(xùn)練好了以后沽瘦,去預(yù)測(cè)這部分沒(méi)有參與訓(xùn)練的數(shù)據(jù)得到預(yù)測(cè)概率,然后以各個(gè)模型的預(yù)測(cè)概率作為最終模型的特征农尖。

image

相關(guān)代碼如下:

from sklearn.model_selection import train_test_split
class BlendingAveragedModels(BaseEstimator, RegressorMixin, TransformerMixin):
    def __init__(self, base_models, meta_model, holdout_pct=0.2, use_features_in_secondary=False):
        self.base_models = base_models
        self.meta_model = meta_model
        self.holdout_pct = holdout_pct
        self.use_features_in_secondary = use_features_in_secondary
        
    def fit(self, X, y):
        self.base_models_ = [clone(x) for x in self.base_models]
        self.meta_model_ = clone(self.meta_model)
        
        X_train, X_holdout, y_train, y_holdout = train_test_split(X, y, test_size=self.holdout_pct)
                
        holdout_predictions = np.zeros((X_holdout.shape[0], len(self.base_models)))
        for i, model in enumerate(self.base_models_):
            model.fit(X_train, y_train)
            y_pred = model.predict(X_holdout)
            holdout_predictions[:, i] = y_pred
        if self.use_features_in_secondary:
            self.meta_model_.fit(np.hstack((X_holdout, holdout_predictions)), y_holdout)
        else:
            self.meta_model_.fit(holdout_predictions, y_holdout)
            
        return self
    
    def predict(self, X):
        meta_features = np.column_stack([
            model.predict(X) for model in self.base_models_
        ])
        if self.use_features_in_secondary:
            return self.meta_model_.predict(np.hstack((X, meta_features)))
        else:
            return self.meta_model_.predict(meta_features)

Blending的好處就是訓(xùn)練時(shí)間縮短析恋,這個(gè)比較好理解,畢竟拿了一部分?jǐn)?shù)據(jù)出來(lái)做holdout盛卡,在前面訓(xùn)練基模型的時(shí)候就只用了較少的數(shù)據(jù)助隧,在后面訓(xùn)練meta模型的時(shí)候holdout數(shù)據(jù)量又不大,自然總體上時(shí)間要加快窟扑。但壞處也比較明顯喇颁,主要體現(xiàn)在holdout數(shù)據(jù)量少這個(gè)問(wèn)題上。一個(gè)是前面在訓(xùn)練基模型的時(shí)候用的數(shù)據(jù)量比stacking少嚎货,第二個(gè)是在訓(xùn)練meta模型的時(shí)候holdout數(shù)據(jù)量少橘霎,可能會(huì)造成meta模型對(duì)于holdout數(shù)據(jù)的過(guò)擬合,第三個(gè)是因?yàn)閔oldout數(shù)據(jù)和訓(xùn)練數(shù)據(jù)不一樣殖属,自然會(huì)比使用kfold的stacking方式要精度更低姐叁。

stacking相當(dāng)于是按照n折對(duì)數(shù)據(jù)迭代劃分,每次劃分都有n-1份數(shù)據(jù)作為訓(xùn)練集洗显,1份數(shù)據(jù)作為預(yù)測(cè)后的結(jié)果外潜,更新到特征當(dāng)中。經(jīng)過(guò)n次后挠唆,那么就會(huì)產(chǎn)生最終的預(yù)測(cè)分?jǐn)?shù)处窥,當(dāng)然有很多數(shù)據(jù)都是重復(fù)使用的,這樣的好處就是數(shù)據(jù)量充足玄组,能夠充分利用數(shù)據(jù)滔驾,精度也會(huì)更高谒麦,壞處就是可能會(huì)造成信息泄露的問(wèn)題,因?yàn)樵趉fold當(dāng)中除了第一輪以外都是拿著用來(lái)訓(xùn)練好的模型去預(yù)測(cè)之前用來(lái)訓(xùn)練這個(gè)模型的數(shù)據(jù)哆致,會(huì)有這個(gè)風(fēng)險(xiǎn)绕德。

第一輪迭代

image

第二輪迭代

image

代碼如下:

class StackingAveragedModels(BaseEstimator, RegressorMixin, TransformerMixin):
    def __init__(self, base_models, meta_model, n_folds=5, use_features_in_secondary=False):
        self.base_models = base_models
        self.meta_model = meta_model
        self.n_folds = n_folds
        self.use_features_in_secondary = use_features_in_secondary
        
    def fit(self, X, y):
        """Fit all the models on the given dataset"""
        self.base_models_ = [list() for x in self.base_models]
        self.meta_model_ = clone(self.meta_model)
        kfold = KFold(n_splits=self.n_folds, shuffle=True, random_state=42)
        
        # Train cloned base models and create out-of-fold predictions
        out_of_fold_predictions = np.zeros((X.shape[0], len(self.base_models)))
        for i, model in enumerate(self.base_models):
            for train_index, holdout_index in kfold.split(X, y):
                instance = clone(model)
                self.base_models_[i].append(instance)
                instance.fit(X[train_index], y[train_index])
                y_pred = instance.predict(X[holdout_index])
                out_of_fold_predictions[holdout_index, i] = y_pred
        
        if self.use_features_in_secondary:
            self.meta_model_.fit(np.hstack((X, out_of_fold_predictions)), y)
        else:
            self.meta_model_.fit(out_of_fold_predictions, y)
            
        return self
    
    def predict(self, X):
        meta_features = np.column_stack([
            np.column_stack([model.predict(X) for model in base_models]).mean(axis=1)
            for base_models in self.base_models_ ])
        if self.use_features_in_secondary:
            return self.meta_model_.predict(np.hstack((X, meta_features)))
        else:
            return self.meta_model_.predict(meta_features)

參考資料

A guide to Ensemble Learning - Towards Data Science

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市摊阀,隨后出現(xiàn)的幾起案子耻蛇,更是在濱河造成了極大的恐慌,老刑警劉巖胞此,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臣咖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡豌鹤,警方通過(guò)查閱死者的電腦和手機(jī)亡哄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)布疙,“玉大人,你說(shuō)我怎么就攤上這事愿卸×榱伲” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵趴荸,是天一觀的道長(zhǎng)儒溉。 經(jīng)常有香客問(wèn)我,道長(zhǎng)发钝,這世上最難降的妖魔是什么顿涣? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮酝豪,結(jié)果婚禮上涛碑,老公的妹妹穿的比我還像新娘。我一直安慰自己孵淘,他們只是感情好蒲障,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著瘫证,像睡著了一般揉阎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上背捌,一...
    開(kāi)封第一講書(shū)人閱讀 51,115評(píng)論 1 296
  • 那天毙籽,我揣著相機(jī)與錄音,去河邊找鬼毡庆。 笑死坑赡,一個(gè)胖子當(dāng)著我的面吹牛烙如,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播垮衷,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼厅翔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了搀突?” 一聲冷哼從身側(cè)響起刀闷,我...
    開(kāi)封第一講書(shū)人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仰迁,沒(méi)想到半個(gè)月后甸昏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡徐许,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年施蜜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雌隅。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡翻默,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出恰起,到底是詐尸還是另有隱情修械,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布检盼,位于F島的核電站肯污,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏吨枉。R本人自食惡果不足惜蹦渣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望貌亭。 院中可真熱鬧柬唯,春花似錦、人聲如沸属提。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)冤议。三九已至斟薇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間恕酸,已是汗流浹背堪滨。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蕊温,地道東北人袱箱。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓遏乔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親发笔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盟萨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 1、數(shù)據(jù)量比較大的時(shí)候了讨,svm和lr哪個(gè)更快? svm適用于相對(duì)稀疏的數(shù)據(jù)捻激,所以xgb的效果比svm要好。面試官也...
    DaiMorph閱讀 2,286評(píng)論 0 0
  • 一般來(lái)說(shuō)前计,通過(guò)融合多個(gè)不同的模型胞谭,可能提升機(jī)器學(xué)習(xí)的性能,這一方法在各種機(jī)器學(xué)習(xí)比賽中廣泛應(yīng)用男杈,比如在kaggle...
    塵囂看客閱讀 19,508評(píng)論 3 19
  • 1.Voting 投票法針對(duì)分類(lèi)模型丈屹,多個(gè)模型的分類(lèi)結(jié)果進(jìn)行投票,少數(shù)服從多數(shù)伶棒。除了公平投票外旺垒,還可以給投...
    ZAK_ML閱讀 2,263評(píng)論 0 1
  • [TOC] About Trs 只是閱讀過(guò)程中對(duì)其中一些進(jìn)行注腳而已,更確切的內(nèi)容還是英文原文來(lái)的清晰肤无,有些翻譯反...
    mrlevo520閱讀 1,193評(píng)論 0 0
  • 同DataWhale一起組隊(duì)學(xué)習(xí):https://tianchi.aliyun.com/notebook-ai/d...
    612twilight閱讀 1,019評(píng)論 0 2