0. 題首
由于sklearn是python機(jī)器學(xué)習(xí)中最重要的庫(kù)隐岛,幾乎封裝了所有常見(jiàn)的機(jī)器學(xué)習(xí)算法区匠,因而這個(gè)庫(kù)內(nèi)容非常多入宦。在學(xué)習(xí)有時(shí)候會(huì)有一種“不知廬山真面目九巡,只緣身在此山中”的感覺(jué)图贸。這個(gè)時(shí)候我們需要跳出現(xiàn)在學(xué)習(xí)的框架,站在更高的高度來(lái)俯視就可以獲得全貌了冕广。
比如這次的bagging算法疏日,和上一次的投票法Votting一樣,都是集成在sklearn的ensemble模塊中撒汉,這個(gè)時(shí)候我們打開(kāi)sklearn的官方文檔沟优,可以一窺ensemble模塊的全貌。如下:
可以看到sklearn.ensemble模塊下封裝了好多集成算法睬辐。除了我們之前學(xué)習(xí)的Voting和本期的Bagging意以外挠阁,常用的還有Adaboost、 GBDT溯饵、RandomForest等侵俗。通過(guò)這種一覽全貌的做法,我們也可以熟悉那個(gè)方法封裝在那個(gè)模塊下面瓣喊。因?yàn)閟klearn的設(shè)計(jì)全面而博大精深坡慌,在使用的時(shí)候經(jīng)常會(huì)遇到忘記某個(gè)模塊的具體位置。
1. Bagging原理概述
Bagging是Bootstrap Aggregation的縮寫(xiě)藻三,常翻譯為裝袋法洪橘。因而要了解bagging,先從Bootstrap說(shuō)起棵帽。Bootstrap熄求,即pull up by your own bootstraps,意思就是白手起家逗概,自立更生的意思弟晚,因而bootstrap可以引申為自助采樣法,它是一種有放回的抽樣方法逾苫,目的為了得到統(tǒng)計(jì)量的分布以及置信區(qū)間卿城,其算法過(guò)程如下:
A)從原始樣本集中抽取訓(xùn)練集。每輪從原始樣本集中使用Bootstraping的方法抽取n個(gè)訓(xùn)練樣本(在訓(xùn)練集中铅搓,有些樣本可能被多次抽取到瑟押,而有些樣本可能一次都沒(méi)有被抽中)。共進(jìn)行k輪抽取星掰,得到k個(gè)訓(xùn)練集多望。(k個(gè)訓(xùn)練集之間是相互獨(dú)立的)
B)每次使用一個(gè)訓(xùn)練集得到一個(gè)模型嫩舟,k個(gè)訓(xùn)練集共得到k個(gè)模型。(注:這里并沒(méi)有具體的分類(lèi)算法或回歸方法怀偷,我們可以根據(jù)具體問(wèn)題采用不同的分類(lèi)或回歸方法家厌,如決策樹(shù)、感知器等)
C)對(duì)分類(lèi)問(wèn)題:將上步得到的k個(gè)模型采用投票的方式得到分類(lèi)結(jié)果椎工;對(duì)回歸問(wèn)題饭于,計(jì)算上述模型的均值作為最后的結(jié)果。(所有模型的重要性相同)
使用流程圖更加直觀:
bagging的集合策略也比較簡(jiǎn)單晋渺,對(duì)于分類(lèi)問(wèn)題镰绎,通常使用簡(jiǎn)單投票法脓斩,得到最多票數(shù)的類(lèi)別或者類(lèi)別之一為最終的模型輸出木西。對(duì)于回歸問(wèn)題,通常使用簡(jiǎn)單平均法随静,對(duì)T個(gè)弱學(xué)習(xí)器得到的回歸結(jié)果進(jìn)行算術(shù)平均得到最終的模型輸出八千。
由于Bagging算法每次都進(jìn)行采樣來(lái)訓(xùn)練模型,因此泛化能力很強(qiáng)燎猛,對(duì)于降低模型的方差很有作用恋捆。當(dāng)然對(duì)于訓(xùn)練集的擬合程度就會(huì)差一些,也就是模型的偏倚會(huì)大一些重绷。
2. 實(shí)例分析
Sklearn為我們提供了
[BaggingRegressor]與 [BaggingClassifier]
兩種Bagging方法的API沸停,我們?cè)谶@里通過(guò)一個(gè)完整的例子演示Bagging在分類(lèi)問(wèn)題上的具體應(yīng)用。這里兩種方法的默認(rèn)基模型是樹(shù)模型昭卓。
# evaluate bagging algorithm for classification
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.ensemble import BaggingClassifier
我們創(chuàng)建一個(gè)含有1000個(gè)樣本20維特征的隨機(jī)分類(lèi)數(shù)據(jù)集:
# test classification dataset
from sklearn.datasets import make_classification
# define dataset
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=5)
# summarize the dataset
print(X.shape, y.shape)
>>>
(1000, 20) (1000,)
我們將使用重復(fù)的分層k-fold交叉驗(yàn)證來(lái)評(píng)估該模型愤钾,一共重復(fù)3次,
每次有10個(gè)fold候醒。我們將評(píng)估該模型在所有重復(fù)交叉驗(yàn)證中性能的平均值和標(biāo)準(zhǔn)差能颁。
# evaluate bagging algorithm for classification
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.ensemble import BaggingClassifier
# define dataset
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=5)
# define the model
model = BaggingClassifier()
# evaluate the model
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
n_scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise')
# report performance
print('Accuracy: %.3f (%.3f)' % (mean(n_scores), std(n_scores)))
>>>
Accuracy: 0.867 (0.034)
最終模型的效果是Accuracy: 0.867 標(biāo)準(zhǔn)差0.034