快速弄懂機器學習里的集成算法:原理、框架與實戰(zhàn)(一)

1.關(guān)于集成學習算法
集成學習算法,通俗地講就是:三個臭皮匠,頂個諸葛亮,這在很多地方都有人提過。舉個例子,比如你想第一本書,但是你不知道這本書怎么樣,值不值得讀,那么你可以通過打聽,聽取周圍人的意見,得到對該書的一個基本評價,這是一種評價方式。你還可以通過京東、當當?shù)入娚叹W(wǎng)站上買書的人對該書的相關(guān)評論,得到一些意見,還有就是,你也可以通過豆瓣上對該書的評價,來獲取相關(guān)信息。
這都是一些對該書評價的基本方法,最終的結(jié)果可能就是,你綜合這幾種意見,最后得到對該書的一個全面性評價,可能這種評價方式比你單純依賴一種方式的效果好。
集成算法就是這樣一種算法,它本身不是一個單獨的機器學習算法,或者說沒有自身的機器學習思維,而是采用集成的方式來完成對數(shù)據(jù)或事物的學習、訓練過程。

2.關(guān)于集成學習算法的框架體系
集成學習算法作為機器學習里的一個分支,已形成了一套的理論體系,其相關(guān)概念也比較多,如個體學習器、結(jié)合策略、bagging、AdaBoost算法、XGB、LGBT等等,讓初學者眼花繚亂,每個具體算法的原理不同又會讓大家暈頭轉(zhuǎn)向。
實際上,這些繁多的內(nèi)容背后,集成學習算法可以分成兩大框架,這也是集成學習著重解決的兩個算法。崔麗娟等(2007)在論文《基于分類的集成學習算法研究》中認為集成學習主要由兩部分構(gòu)成:個體生成方法與結(jié)論生成方法,這就是集成學習的兩個框架。
本人認為,這兩部分叫個體集成方法與結(jié)論集成方法更貼切,其中前者表示如何得到若干個個體學習器,針對的是每一個具體算法,我如何操作,來集成其優(yōu)點,后者表示如何選擇一種結(jié)合策略將個體學習器集合起來,形成強學習器,針對的是不同個體學習器的訓練結(jié)果,我如何集成起來,獲得最優(yōu)結(jié)果。
比如前邊講的對圖書評價的問題,我采納了三種意見得到了該書的綜合評價結(jié)果,這就是一種結(jié)論集成方法。我還可以進一步,對三種評價方式進行優(yōu)化,比如同過抽樣的方法獲取周圍人的評價,或者一些網(wǎng)站的評論中有水軍,可能我就要采取一些方法去驗證等等,把這兩個步驟結(jié)合起來就是集成學習。
集成學習的主要框架體系也是以此分類的,其中,結(jié)論集成方法較為簡單,包括投票法、平均法、學習法等,其原理也相對簡單,個體集成方法主要分為兩大類:Boosting和Bagging,前者是基于訓練集的學習誤差來優(yōu)化權(quán)重,從而提高學習性能,后者是通過對樣本訓練集反復抽樣來提高學習器的性能,并衍生出很多算法。

3、結(jié)論集成方法
由于結(jié)論集成方法相對簡單,且容易理解,所以在這里先講解這方面內(nèi)容。
(1)投票法
最簡單的投票法是相對多數(shù)投票法,也就是我們常說的少數(shù)服從多數(shù),數(shù)量最多的類別為最終的分類類別。如果不止一個類別獲得最高票,則隨機選擇一個做最終類別。
稍微復雜的投票法是絕對多數(shù)投票法,也就是我們常說的要票過半數(shù)。在相對多數(shù)投票法的基礎(chǔ)上,不光要求獲得最高票,還要求票過半數(shù)。否則會拒絕預測。更加復雜的是加權(quán)投票法,和加權(quán)平均法一樣,每個弱學習器的分類票數(shù)要乘以一個權(quán)重,最終將各個類別的加權(quán)票數(shù)求和,最大的值對應的類別為最終類別。
我們以鳶尾花為例,如下所示,通過決策樹、邏輯回歸來構(gòu)建了個體學習器,然后投票選擇算法。

#導入sklearn及numpy模塊
from sklearn.datasets import load_iris
from sklearn import cross_validation
import numpy as np

# 導入鳶尾花數(shù)據(jù)集
iris = load_iris()
x_train, x_test, y_train, y_test = cross_validation.train_test_split(iris.data, iris.target, test_size=0.4, random_state=1)

from sklearn import tree  #導入決策樹庫
from sklearn.linear_model import LogisticRegression #導入邏輯回歸庫

from sklearn.ensemble import VotingClassifier #導入投票程序包
model1 = LogisticRegression(random_state=1)
model2 = tree.DecisionTreeClassifier(random_state=1)
model = VotingClassifier(estimators=[('lr', model1), ('dt', model2)], voting='hard')
model.fit(x_train,y_train)
model.score(x_test,y_test)

(2)平均法
對于若干個弱學習器的輸出進行平均得到最終的預測輸出。最簡單的平均是算術(shù)平均,復雜的是加權(quán)平均法。還是以鳶尾花數(shù)據(jù)為例,先通過決策樹、K近鄰、邏輯回歸來構(gòu)建了個體學習器,然后進行平均。

from sklearn.neighbors import KNeighborsClassifier #導入K近鄰庫
model1 = tree.DecisionTreeClassifier()
model2 = KNeighborsClassifier()
model3= LogisticRegression()

model1.fit(x_train,y_train)
model2.fit(x_train,y_train)
model3.fit(x_train,y_train)

pred1=model1.predict_proba(x_test)
pred2=model2.predict_proba(x_test)
pred3=model3.predict_proba(x_test)

finalpred=(pred1+pred2+pred3)/3

(3)學習法
上述兩種方法都是對弱學習器的結(jié)果做平均或者投票,相對比較簡單,但是可能學習誤差較大,于是就有了學習法這種方法。對于學習法,代表方法是stacking,當使用stacking的結(jié)合策略時, 我們不是對弱學習器的結(jié)果做簡單的邏輯處理,而是再加上一層學習器,也就是說,我們將訓練集弱學習器的學習結(jié)果作為輸入,將訓練集的輸出作為輸出,重新訓練一個學習器來得到最終結(jié)果。
未完待續(xù),由于該方法較為復雜,將在后邊著重介紹。。。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容