halcon机器视觉算法原理与编程实战_快速弄懂机器学习里的集成算法:原理、框架与实战...
作者:??博觀厚積
簡書專欄:https://www.jianshu.com/u/2f376f777ef1
1. 關(guān)于集成學(xué)習(xí)算法
集成學(xué)習(xí)算法,通俗地講就是:三個臭皮匠,頂個諸葛亮,這在很多地方都有人提過。舉個例子,比如你想第一本書,但是你不知道這本書怎么樣,值不值得讀,那么你可以通過打聽,聽取周圍人的意見,得到對該書的一個基本評價(jià),這是一種評價(jià)方式。你還可以通過京東、當(dāng)當(dāng)?shù)入娚叹W(wǎng)站上買書的人對該書的相關(guān)評論,得到一些意見,還有就是,你也可以通過豆瓣上對該書的評價(jià),來獲取相關(guān)信息。
這都是一些對該書評價(jià)的基本方法,最終的結(jié)果可能就是,你綜合這幾種意見,最后得到對該書的一個全面性評價(jià),可能這種評價(jià)方式比你單純依賴一種方式的效果好。
集成算法就是這樣一種算法,它本身不是一個單獨(dú)的機(jī)器學(xué)習(xí)算法,或者說沒有自身的機(jī)器學(xué)習(xí)思維,而是采用集成的方式來完成對數(shù)據(jù)或事物的學(xué)習(xí)、訓(xùn)練過程。
2. 關(guān)于集成學(xué)習(xí)算法的框架體系
集成學(xué)習(xí)算法作為機(jī)器學(xué)習(xí)里的一個分支,已形成了一套的理論體系,其相關(guān)概念也比較多,如個體學(xué)習(xí)器、結(jié)合策略、bagging、AdaBoost算法、XGB、LGBT等等,讓初學(xué)者眼花繚亂,每個具體算法的原理不同又會讓大家暈頭轉(zhuǎn)向。
實(shí)際上,這些繁多的內(nèi)容背后,集成學(xué)習(xí)算法可以分成兩大框架,這也是集成學(xué)習(xí)著重解決的兩個算法。崔麗娟等(2007)在論文《基于分類的集成學(xué)習(xí)算法研究》中認(rèn)為集成學(xué)習(xí)主要由兩部分構(gòu)成:個體生成方法與結(jié)論生成方法,這就是集成學(xué)習(xí)的兩個框架。
本人認(rèn)為,這兩部分叫個體集成方法與結(jié)論集成方法更貼切,其中前者表示如何得到若干個個體學(xué)習(xí)器,針對的是每一個具體算法,我如何操作,來集成其優(yōu)點(diǎn),后者表示如何選擇一種結(jié)合策略將個體學(xué)習(xí)器集合起來,形成強(qiáng)學(xué)習(xí)器,針對的是不同個體學(xué)習(xí)器的訓(xùn)練結(jié)果,我如何集成起來,獲得最優(yōu)結(jié)果。
比如前邊講的對圖書評價(jià)的問題,我采納了三種意見得到了該書的綜合評價(jià)結(jié)果,這就是一種結(jié)論集成方法。我還可以進(jìn)一步,對三種評價(jià)方式進(jìn)行優(yōu)化,比如同過抽樣的方法獲取周圍人的評價(jià),或者一些網(wǎng)站的評論中有水軍,可能我就要采取一些方法去驗(yàn)證等等,把這兩個步驟結(jié)合起來就是集成學(xué)習(xí)。
集成學(xué)習(xí)的主要框架體系也是以此分類的,其中,結(jié)論集成方法較為簡單,包括投票法、平均法、學(xué)習(xí)法等,其原理也相對簡單,個體集成方法主要分為兩大類:Boosting和Bagging,前者是基于訓(xùn)練集的學(xué)習(xí)誤差來優(yōu)化權(quán)重,從而提高學(xué)習(xí)性能,后者是通過對樣本訓(xùn)練集反復(fù)抽樣來提高學(xué)習(xí)器的性能,并衍生出很多算法。
3. 結(jié)論集成方法
由于結(jié)論集成方法相對簡單,且容易理解,所以在這里先講解這方面內(nèi)容。
(1)投票法
最簡單的投票法是相對多數(shù)投票法,也就是我們常說的少數(shù)服從多數(shù),數(shù)量最多的類別為最終的分類類別。如果不止一個類別獲得最高票,則隨機(jī)選擇一個做最終類別。
稍微復(fù)雜的投票法是絕對多數(shù)投票法,也就是我們常說的要票過半數(shù)。在相對多數(shù)投票法的基礎(chǔ)上,不光要求獲得最高票,還要求票過半數(shù)。否則會拒絕預(yù)測。更加復(fù)雜的是加權(quán)投票法,和加權(quán)平均法一樣,每個弱學(xué)習(xí)器的分類票數(shù)要乘以一個權(quán)重,最終將各個類別的加權(quán)票數(shù)求和,最大的值對應(yīng)的類別為最終類別。
我們以鳶尾花為例,如下所示,通過決策樹、邏輯回歸來構(gòu)建了個體學(xué)習(xí)器,然后投票選擇算法。
#導(dǎo)入sklearn及numpy模塊from?sklearn.datasets?import?load_iris
from?sklearn?import?cross_validation
import?numpy?as?np
#?導(dǎo)入鳶尾花數(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??#導(dǎo)入決策樹庫
from?sklearn.linear_model?import?LogisticRegression?#導(dǎo)入邏輯回歸庫
from?sklearn.ensemble?import?VotingClassifier?#導(dǎo)入投票程序包
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)平均法
對于若干個弱學(xué)習(xí)器的輸出進(jìn)行平均得到最終的預(yù)測輸出。最簡單的平均是算術(shù)平均,復(fù)雜的是加權(quán)平均法。還是以鳶尾花數(shù)據(jù)為例,先通過決策樹、K近鄰、邏輯回歸來構(gòu)建了個體學(xué)習(xí)器,然后進(jìn)行平均。
from?sklearn.neighbors?import?KNeighborsClassifier?#導(dǎo)入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)學(xué)習(xí)法
上述兩種方法都是對弱學(xué)習(xí)器的結(jié)果做平均或者投票,相對比較簡單,但是可能學(xué)習(xí)誤差較大,于是就有了學(xué)習(xí)法這種方法。對于學(xué)習(xí)法,代表方法是stacking,當(dāng)使用stacking的結(jié)合策略時(shí), 我們不是對弱學(xué)習(xí)器的結(jié)果做簡單的邏輯處理,而是再加上一層學(xué)習(xí)器,也就是說,我們將訓(xùn)練集弱學(xué)習(xí)器的學(xué)習(xí)結(jié)果作為輸入,將訓(xùn)練集的輸出作為輸出,重新訓(xùn)練一個學(xué)習(xí)器來得到最終結(jié)果。
如下圖,就是一個簡單的Stacking算法結(jié)構(gòu),它是兩層的結(jié)構(gòu),第一層的學(xué)習(xí)器為初學(xué)習(xí)器,也稱為個體學(xué)習(xí)器。用于結(jié)合的第二層的分類器稱為次級學(xué)習(xí)器或者是元學(xué)習(xí)器。其基本原理就是在以往算法中大多數(shù)是訓(xùn)練集與測試集,用訓(xùn)練集來訓(xùn)練模型,然后根據(jù)模型對測試集進(jìn)行預(yù)測;Stacking則是在訓(xùn)練集的訓(xùn)練中加入又一層數(shù)據(jù)集劃分,在訓(xùn)練集的訓(xùn)練與測試后,生成新的訓(xùn)練集,再與原始測試集進(jìn)行模型訓(xùn)練。
這里仍以以鳶尾花為例,展示Stacking算法。
#導(dǎo)入sklearn及numpy模塊from?sklearn.datasets?import?load_iris
from?sklearn?import?cross_validation
import?numpy?as?np
#?導(dǎo)入鳶尾花數(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??#導(dǎo)入決策樹庫
from?sklearn.linear_model?import?LogisticRegression?#導(dǎo)入邏輯回歸庫
#將數(shù)據(jù)轉(zhuǎn)換為DataFrame格式
import?pandas?as?pd
x_train?=?pd.DataFrame(x_train)
y_train?=?pd.DataFrame(y_train)
x_test?=?pd.DataFrame(x_test)
y_test?=?pd.DataFrame(y_test)
接下來構(gòu)造Stacking算法。
#Stacking?techniquesfrom?sklearn.model_selection?import?StratifiedKFold
def?Stacking(model,train,y,test,n_fold):
????folds=StratifiedKFold(n_splits=n_fold,random_state=1)??#分層采樣
????test_pred=np.empty((test.shape[0],1),float)??#構(gòu)建空的測試集
????train_pred=np.empty((0,1),float)???#構(gòu)建空的訓(xùn)練集
????for?train_indices,val_indices?in?folds.split(train,y):
????????x_train,x_val=train.iloc[train_indices],train.iloc[val_indices]
????????y_train,y_val=y.iloc[train_indices],y.iloc[val_indices]
????????model.fit(X=x_train,y=y_train)
????????train_pred=np.append(train_pred,model.predict(x_val))
????????test_pred=np.column_stack((test_pred,model.predict(test)))
????test_pred_a=np.mean(test_pred,axis=1)?#按行計(jì)算均值
return?test_pred_a.reshape(-1,1),train_pred
這里著重說明一下,Stacking的構(gòu)建過程。如前所述,Stacking主要是在原始訓(xùn)練集(train)中又進(jìn)行了一次樣本劃分,比如我們將訓(xùn)練集劃分了10份,9份小訓(xùn)練集(x_train、y_train),1份小測試集(x_val、y_val),然后通過for循環(huán),對每一份小訓(xùn)練集(x_train、y_train)進(jìn)行訓(xùn)練,用訓(xùn)練的模型model.fit(X=x_train,y=y_train)對小測試集(x_val、y_val)進(jìn)行預(yù)測,得到train_pred,同時(shí)也用相同的訓(xùn)練模型對原始測試集(test)進(jìn)行預(yù)測,得到test_pred,對于得到的test_pred,按行進(jìn)行平均得到平均的測試集test_pred_a。
#接下來先用決策樹算法進(jìn)行訓(xùn)練,得到train_pred1,test_pred1:model1?=?tree.DecisionTreeClassifier(random_state=1)
test_pred1?,train_pred1=Stacking(model=model1,n_fold=10,?train=x_train,test=x_test,y=y_train)
train_pred1=pd.DataFrame(train_pred1)
test_pred1=pd.DataFrame(test_pred1)
#再用K近鄰算法進(jìn)行訓(xùn)練,得到train_pred2,test_pred2:
model2?=?KNeighborsClassifier()
test_pred2?,train_pred2=Stacking(model=model2,n_fold=10,train=x_train,test=x_test,y=y_train)
train_pred2=pd.DataFrame(train_pred2)
test_pred2=pd.DataFrame(test_pred2)
#將得到的train_pred1、train_pred12合并成新的訓(xùn)練集df,得到的test_pred1、test?_pred12合并成新的訓(xùn)練集df?_test,再用邏輯回歸算法進(jìn)行第二層訓(xùn)練
df?=?pd.concat([train_pred1,?train_pred2],?axis=1)??#合并數(shù)據(jù)集
df_test?=?pd.concat([test_pred1,?test_pred2],?axis=1)??#合并數(shù)據(jù)集
model?=?LogisticRegression(random_state=1)
model.fit(df,y_train)
model.score(df_test,?y_test)
以上就是Stacking的原理與算法實(shí)現(xiàn)過程。
3、結(jié)論集成方法
表示如何選擇一種結(jié)合策略將個體學(xué)習(xí)器集合起來,形成強(qiáng)學(xué)習(xí)器,針對的是不同個體學(xué)習(xí)器的訓(xùn)練結(jié)果,我如何集成起來,獲得最優(yōu)結(jié)果。主要分為兩大類:Boosting和Bagging,前者是基于訓(xùn)練集的學(xué)習(xí)誤差來優(yōu)化權(quán)重,從而提高學(xué)習(xí)性能,后者是通過對樣本訓(xùn)練集反復(fù)抽樣來提高學(xué)習(xí)器的性能,并衍生出很多算法。
(1) Boosting算法
基于boosting 的集成學(xué)習(xí),不同的個體學(xué)習(xí)器是通過串行一步一步得到的。算法首先將每個訓(xùn)練樣本初始化一個權(quán)重值,然后訓(xùn)練出第一個個體學(xué)習(xí)器,計(jì)算在訓(xùn)練集上的加權(quán)錯誤率,然后更新每個樣本的權(quán)重,最后調(diào)整每個個體學(xué)習(xí)器的權(quán)重。使準(zhǔn)確率比較高的個體學(xué)習(xí)器的權(quán)重較高,準(zhǔn)確率比較低的基本學(xué)習(xí)期的權(quán)重較低。然后根據(jù)新的樣本權(quán)重值,去訓(xùn)練下一個個體學(xué)習(xí)器,不斷循環(huán),直到達(dá)到指定個體學(xué)習(xí)器數(shù)目時(shí),算法停止運(yùn)行。 其流程圖如下:
Boosting系列算法里最著名算法主要有AdaBoost算法和提升樹(boosting tree)系列算法。提升樹系列算法里面應(yīng)用最廣泛的是梯度提升樹(Gradient Boosting Tree)、GBDT、XGBOOST等。
(2) Bagging算法
基于bagging 的集成學(xué)習(xí),是通過不斷的對訓(xùn)練樣本集合做有放回的隨機(jī)取樣得到的。例如對訓(xùn)練集做M 次隨機(jī)有放回抽樣,那么我們可以得到M 個不同的訓(xùn)練集,對這M 個不同的訓(xùn)練集,我們構(gòu)建一個模型去訓(xùn)練,這樣就可以得到M 個不同的模型。最后再將這M 個模型的結(jié)果融合,得到最終的模型。其流程圖如下:
Bagging算法最經(jīng)典的就是隨機(jī)森林算法。其基本思想就是構(gòu)造很多棵決策樹,形成一個森林,然后用這些決策樹共同決策輸出類別是什么。在整個隨機(jī)森林算法的過程中,有兩個隨機(jī)過程,第一個就是輸入數(shù)據(jù)是隨機(jī)的從整體的訓(xùn)練數(shù)據(jù)中選取一部分作為一棵決策樹的構(gòu)建,而且是有放回的選取;第二個就是每棵決策樹的構(gòu)建所需的特征是從整體的特征集隨機(jī)的選取的,這兩個隨機(jī)過程使得隨機(jī)森林很大程度上避免了過擬合現(xiàn)象的出現(xiàn)。
4、集成學(xué)習(xí)算法實(shí)戰(zhàn)應(yīng)用
我們以手寫數(shù)字識別案例為基礎(chǔ),探討集成算法的綜合應(yīng)用。這里我們將分別采用kNN 和邏輯回歸作為個體學(xué)習(xí)器,采用基本相對投票法作為結(jié)合策略,來驗(yàn)證集成學(xué)習(xí)在該問題上的效果。
1、Bagging 集成kNN 模型
基本原理: 我們采用了sklearn 中的BaggingClassifier 來實(shí)現(xiàn)集成學(xué)習(xí)算法,個體學(xué)習(xí)器采用了KneighborsClassifier,為了加速kNN 算法的運(yùn)行,在存儲訓(xùn)練集樣本時(shí),我們采用了kdTree 數(shù)據(jù)結(jié)構(gòu),來加速最近鄰的查找。
結(jié)果分析:我們分別設(shè)置了bagging 參數(shù)T = 5,10,15,20 測試集上的準(zhǔn)確率。最終的實(shí)驗(yàn)結(jié)果表明,當(dāng)T =10 時(shí),模型在測試集上的準(zhǔn)確率達(dá)到95.3%。當(dāng)采用單一的個體學(xué)習(xí)器kNN 時(shí),模型的準(zhǔn)確率為95.25%。雖然正確率只提高了0.05%,但是由于測試集樣本數(shù)目較多,所以相對使用單一;的kNN 模型而言,性能還是提高了不少。
2、Bagging 集成邏輯回歸模型基本原理:
我們采用了sklearn 中的Bagging Classifier 來實(shí)現(xiàn)bagging 算法, 個體學(xué)習(xí)器采用LogisticRegression,為了避免陷入過擬合,邏輯回歸加入了L2 正則化項(xiàng)。并且分別設(shè)置了不同的bagging 參數(shù),即個體學(xué)習(xí)器的數(shù)目T,觀察不同的參數(shù)T,對結(jié)果的影響。結(jié)果分析:我們在測試過程中,分別設(shè)置了bagging參數(shù)T = 5,10,15,20 來觀察不同的參數(shù)T,在測試集上的準(zhǔn)確率。最終實(shí)驗(yàn)結(jié)果表明,當(dāng)T = 20 時(shí),模型在測試集上的準(zhǔn)確率達(dá)到了90.6%。而在前面采用單一的邏輯回歸進(jìn)行學(xué)習(xí)時(shí),在測試集上的準(zhǔn)確率只有86.7%。
由此可見,在采用了基于bagging 的集成學(xué)習(xí)后,模型的泛化能力增強(qiáng),性能提升,在測試集上的準(zhǔn)確率得到了提高。當(dāng)T 較小時(shí),算法的運(yùn)行時(shí)間較快,但是當(dāng)T 較大時(shí),由于需要生成多個個體生成器,所以算法的需要運(yùn)行更長的時(shí)間。
根據(jù)具體的Minist 手寫識別數(shù)據(jù)集實(shí)例,在該數(shù)據(jù)上分別采用了個體學(xué)習(xí)器kNN,個體學(xué)習(xí)器邏輯回歸,bagging 集成kNN,bagging 集成邏輯回歸。在測試集上分別取得了95.25%,86.7%,95.3%,90.6%。驗(yàn)證了在采用了基于bagging 算法的集成學(xué)習(xí)后,相對于使用單一的個體學(xué)習(xí)器而言,在測試集上的準(zhǔn)確率都有了一定的提高,表現(xiàn)出了集成學(xué)習(xí)方法相對于單一模型學(xué)習(xí)方法的優(yōu)異性。
作者其他好文:機(jī)器學(xué)習(xí)中的特征選擇及其Python舉例
Python的愛好者社區(qū)歷史文章大合集:
Python的愛好者社區(qū)歷史文章列表
福利:文末掃碼關(guān)注公眾號,“Python愛好者社區(qū)”,開始學(xué)習(xí)Python課程:
關(guān)注后在公眾號內(nèi)回復(fù)“?課程?”即可獲取:
小編的轉(zhuǎn)行入職數(shù)據(jù)科學(xué)(數(shù)據(jù)分析挖掘/機(jī)器學(xué)習(xí)方向)【最新免費(fèi)】
小編的Python的入門免費(fèi)視頻課程!
小編的Python的快速上手matplotlib可視化庫!
崔老師爬蟲實(shí)戰(zhàn)案例免費(fèi)學(xué)習(xí)視頻。
陳老師數(shù)據(jù)分析報(bào)告擴(kuò)展制作免費(fèi)學(xué)習(xí)視頻。
玩轉(zhuǎn)大數(shù)據(jù)分析!Spark2.X + Python精華實(shí)戰(zhàn)課程免費(fèi)學(xué)習(xí)視頻。
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的halcon机器视觉算法原理与编程实战_快速弄懂机器学习里的集成算法:原理、框架与实战...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: collection集合 地址_java
- 下一篇: mac怎么合并两个容器_看苹果表演黑魔法