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