ML 監(jiān)督學(xué)習(xí) 集成學(xué)習(xí) Boosting

集成學(xué)習(xí)是用多個弱分類器構(gòu)成一個強分類器底洗,其哲學(xué)思想是“三個臭皮匠賽過諸葛亮”祝懂。一般的弱分類器可以由決策樹,神經(jīng)網(wǎng)絡(luò)坠敷,貝葉斯分類器妙同,K-近鄰等構(gòu)成射富。

弱學(xué)習(xí)器:泛華性能略優(yōu)于隨機猜測的學(xué)習(xí)器?
集成學(xué)習(xí)通常可獲得比單一學(xué)習(xí)器顯著優(yōu)越的泛華性能

為什么要集成

如果每個個體學(xué)習(xí)器都互相獨立渐溶,集成模型會工作的很好
但是每個個體學(xué)習(xí)器都在同一個訓(xùn)練集上訓(xùn)練辉浦,可能會犯同一種錯誤,導(dǎo)致集成的準(zhǔn)確率下降?茎辐。
得到多樣的分類器的方法之一:用完全不同的算法浅缸,提高集成的正確率?贾节。

1.模型選擇

假設(shè)各弱分類器間具有一定差異性(如不同的算法,不同參數(shù))教届,這會導(dǎo)致生成的分類決策邊界不同懊亡。將它們結(jié)合后能得到更合理的邊界依啰,減少整體錯誤,實現(xiàn)更好的分類效果店枣。

  1. 數(shù)據(jù)集過大或過小

數(shù)據(jù)集較大時速警,可以分為不同的子集,分別進行訓(xùn)練鸯两,然后再合成分類器闷旧。
數(shù)據(jù)集過小時,可使用自舉技術(shù)(bootstrapping)钧唐,從原樣本集有放回的抽取m個子集忙灼,訓(xùn)練m個分類器,進行集成钝侠。

集成學(xué)習(xí)通過投票來預(yù)測類別

硬投票分類器
創(chuàng)建一個更好的分類器的方法整合每一個分類器的預(yù)測然后經(jīng)過投票去預(yù)測分類這種分類器叫做硬投票分類器

軟投票分類器
如果分類器能夠估計分為每一類的概率---有predict_proba()方法那么可以對每個分類器的概率取平均该园,再預(yù)測具有最高類概率的類?必須要確保所有分類器都可以估計類的概率

要獲得好的集成,個體學(xué)習(xí)器應(yīng)“好而不同"---準(zhǔn)確性和多樣性
1.每個弱分類器的錯誤率不能高于0.5
2.弱分類器之間的性能要有較大的差別

集成學(xué)習(xí)方法

個體學(xué)習(xí)器之間存在強依賴性關(guān)系帅韧,必須串行生成的序列化方法

Boosting

一族可將弱學(xué)習(xí)器提升為強學(xué)習(xí)器的算法
a.先從初始數(shù)據(jù)集訓(xùn)練出一個基學(xué)習(xí)器
b.根據(jù)基學(xué)習(xí)器的表現(xiàn)對訓(xùn)練樣本分布進行調(diào)整
c.基于調(diào)整后的樣本分布來訓(xùn)練下一個基學(xué)習(xí)器
d.重復(fù)以上步驟里初,直到基學(xué)習(xí)器數(shù)目達到事先指定的值N
e.最后將N個基學(xué)習(xí)器進行加權(quán)結(jié)合??????

Boosting算法在訓(xùn)練的每一輪都要檢查當(dāng)前基分類器是否比隨機猜測好
否則拋棄當(dāng)前基學(xué)習(xí)器,學(xué)習(xí)過程停止忽舟,則可能未達到N???双妨,那么可根據(jù)當(dāng)前分布重新對訓(xùn)練樣本進行采樣,再重新訓(xùn)練出基學(xué)習(xí)器萧诫,使之達到N?

Boosting算法中代表性算法

AdaBoost(自適應(yīng)增強)

Gradient Boosting + Exponential Loss + Binary base classifier

https://youtu.be/k4G2VCuOMMg

基于數(shù)據(jù)集多重抽樣的分類器斥难,Adaboost是一種迭代算法,算法本身是通過改變數(shù)據(jù)權(quán)值分布來實現(xiàn)帘饶。

a. 給訓(xùn)練數(shù)據(jù)集中的每一個樣本賦予權(quán)重哑诊,權(quán)重初始化相等值,這些權(quán)重形成向量D及刻。一般初始化所有訓(xùn)練樣例的權(quán)重為1 / N,其中N是樣例數(shù)
b.在訓(xùn)練集上訓(xùn)練出弱分類器并計算該分類器的錯誤率
c.同一數(shù)據(jù)集上再次訓(xùn)練分類器镀裤,調(diào)整樣本的權(quán)重竞阐,將第一次分對的樣本權(quán)重降低,第一次分錯的樣本權(quán)重提高
d.最后給每一個分類器分配一個權(quán)重值α暑劝,α = 0.5*ln((1-錯誤率)/錯誤率)
e.計算出alpha值后骆莹,可以對權(quán)重向量D進行更新,以使得正確分類的樣本權(quán)重降低而錯分樣本的權(quán)重升高担猛。
f.Adaboost算法會不斷地重復(fù)訓(xùn)練和調(diào)整權(quán)重幕垦,直到訓(xùn)練錯誤率為0或者弱分類器的數(shù)目達到指定的值。

標(biāo)準(zhǔn)AdaBoost只適用于二分類
Scikit-learn中對應(yīng)為AdaBoostClassifier類傅联,如果要多分類先改,則可以設(shè)置參數(shù)algorithm=”SAMME”,?如果分類器可以預(yù)測概率(有predict_proba()),則設(shè)置參數(shù)algorithm=”SAMME.R” R代表REAL如果AdaBoost集成過擬合蒸走,可以減少基分類器的數(shù)量或?qū)诸惼魇褂酶鼜姷恼齽t化?

GBDT 積跬步以至千里

GB:梯度迭代 Gradient Boosting
通過迭代多棵樹來共同決策仇奶。

DT:回歸樹 Regression Decision Tree

1.先用初始數(shù)據(jù)集來學(xué)習(xí)一顆決策樹,可得到每一片葉子的預(yù)測值比驻。以及預(yù)測之后的殘差(真實值-預(yù)測值)
2.然后下一次迭代的決策樹就基于上一次決策樹的殘差數(shù)據(jù)來學(xué)習(xí)该溯,得到的結(jié)果是上一輪殘差的預(yù)測值,以及本輪殘差
3.不斷迭代别惦,直到最后一輪的殘差為0或者非常小
4.把所用輪次的模型預(yù)測值累加起來就是最終的預(yù)測值

GDBT Boosting參數(shù)

loss:損失函數(shù)狈茉,對于分類模型,有對數(shù)似然函數(shù)“deviance”和指數(shù)損失函數(shù)“exponential” 選擇指數(shù)損失函數(shù)就是Adaboost算法
n_estimators:默認100步咪,最大的弱學(xué)習(xí)器的個數(shù)/弱學(xué)習(xí)器的最大迭代次數(shù)
learning_rate:默認0.1

例子
###1.投票分類器---由幾個不同的分類器組成
from sklearn.datasets import load_iris, make_moons
from sklearn.model_selection import cross_val_score, train_test_split
from sklearn.preprocessing import StandardScaler,LabelEncoder
from sklearn.metrics import accuracy_score
from sklearn.ensemble import RandomForestClassifier,VotingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
import warnings
warnings.filterwarnings("ignore")


#創(chuàng)建一個半月形的數(shù)據(jù)集论皆,數(shù)據(jù)集劃分
x, y = make_moons(n_samples=1000, noise=0.25, random_state=0)
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=0)

#構(gòu)建模型
lr=LogisticRegression()
rf=RandomForestClassifier()
svm1=SVC()
svm2=SVC(probability=True)#SVC默認probability=False,改為True猾漫,將使用交叉驗證
voting_hard=VotingClassifier(estimators=[('lr',lr),('rf',rf),('svm',svm1)],voting='hard')
voting_soft=VotingClassifier(estimators=[('lr',lr),('rf',rf),('svm',svm2)],voting='soft')
voting_hard.fit(x_train,y_train)
voting_soft.fit(x_train,y_train)
#如果用KNN,LogisticRegression最好標(biāo)準(zhǔn)化特征StandardScaler


#訓(xùn)練模型并進行預(yù)測
print('hard voting')
for mla in (lr,rf,svm1,voting_hard):
    mla.fit(x_train,y_train)
    y_pred1=mla.predict(x_test)
    print(mla.__class__.__name__, accuracy_score(y_test, y_pred1))
    
print('-'*10)
print('soft voting')
for mlas in (lr,rf,svm2,voting_hard):
    mlas.fit(x_train,y_train)
    y_pred2=mlas.predict(x_test)
    print(mlas.__class__.__name__, accuracy_score(y_test, y_pred2))

###2.AdaBoostClassifier
from sklearn.ensemble import AdaBoostClassifier
ada=AdaBoostClassifier(DecisionTreeClassifier(max_depth=1),n_estimators=200,algorithm="SAMME.R",learning_rate=0.5)
ada.fit(x_train,y_train)
y_pred3=ada.predict(x_test)
print('-'*10)
print('AdaBoost',accuracy_score(y_test,y_pred3))
#當(dāng)然對于回歸也有AdaBoostRegressor

from sklearn.datasets import load_iris
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import GridSearchCV

iris=load_iris()
x=iris.data
y=iris.target

from sklearn import model_selection
X_train,X_test,y_train,y_test=model_selection.train_test_split(x,y,test_size=0.3,random_state=20)

gbdt=GradientBoostingClassifier()
gbdt.fit(X_train,y_train)

print(gbdt.score(X_test,y_test))

print(gbdt.feature_importances_)

parameters={'n_estimators':[50,80,100],
            'learning_rate':[0.01,0.1,0.2,0.5,1]}

gbdt=GradientBoostingClassifier()
grid_search=GridSearchCV(gbdt,parameters,scoring='accuracy',cv=5)
grid_search.fit(x,y)

print(grid_search.best_estimator_)
print(grid_search.best_score_)
print(grid_search.best_params_)
總結(jié)
Conclusion
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末点晴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子悯周,更是在濱河造成了極大的恐慌粒督,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件禽翼,死亡現(xiàn)場離奇詭異屠橄,居然都是意外死亡,警方通過查閱死者的電腦和手機闰挡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門锐墙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人长酗,你說我怎么就攤上這事溪北。” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵之拨,是天一觀的道長茉继。 經(jīng)常有香客問我,道長蚀乔,這世上最難降的妖魔是什么烁竭? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮吉挣,結(jié)果婚禮上派撕,老公的妹妹穿的比我還像新娘。我一直安慰自己听想,他們只是感情好腥刹,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著汉买,像睡著了一般。 火紅的嫁衣襯著肌膚如雪佩脊。 梳的紋絲不亂的頭發(fā)上蛙粘,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機與錄音威彰,去河邊找鬼出牧。 笑死,一個胖子當(dāng)著我的面吹牛歇盼,可吹牛的內(nèi)容都是我干的舔痕。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼豹缀,長吁一口氣:“原來是場噩夢啊……” “哼伯复!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起邢笙,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤啸如,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后氮惯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叮雳,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年妇汗,在試婚紗的時候發(fā)現(xiàn)自己被綠了帘不。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡杨箭,死狀恐怖寞焙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤棺弊,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布晶密,位于F島的核電站,受9級特大地震影響模她,放射性物質(zhì)發(fā)生泄漏稻艰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一侈净、第九天 我趴在偏房一處隱蔽的房頂上張望尊勿。 院中可真熱鬧,春花似錦畜侦、人聲如沸元扔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽澎语。三九已至,卻和暖如春验懊,著一層夾襖步出監(jiān)牢的瞬間擅羞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工义图, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留减俏,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓碱工,卻偏偏與公主長得像娃承,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子怕篷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

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