机器学习之集成学习(一)
詳細參考:https://www.cnblogs.com/pinard/p/6131423.html
首先明確集成學習它本身不是一個單獨的機器學習算法,而是通過構建并結合多個機器學習器來完成學習任務。
集成學習有兩個主要的問題需要解決,第一是如何得到若干個個體學習器,第二是如何選擇一種結合策略,將這些個體學習器集合成一個強學習器。對于個體學習器第一種就是所有的個體學習器都是一個種類的,或者說是同質的。比如都是決策樹個體學習器,或者都是神經網絡個體學習器。第二種是所有的個體學習器不全是一個種類的,或者說是異質的。比如我們有一個分類問題,對訓練集采用支持向量機個體學習器,邏輯回歸個體學習器和樸素貝葉斯個體學習器來學習,再通過某種結合策略來確定最終的分類強學習器。
目前來說,同質個體學習器的應用是最廣泛的,一般我們常說的集成學習的方法都是指的同質個體學習器。而同質個體學習器使用最多的模型是CART決策樹和神經網絡。同質個體學習器按照個體學習器之間是否存在依賴關系可以分為兩類,第一個是個體學習器之間存在強依賴關系,一系列個體學習器基本都需要串行生成,代表算法是boosting系列算法,第二個是個體學習器之間不存在強依賴關系,一系列個體學習器可以并行生成,代表算法是bagging和隨機森林(Random Forest)系列算法。
集成策略有投票法,平均法,學習法等等。
1.bagging
bagging的個體弱學習器的訓練集是通過隨機采樣得到的。通過T次的隨機采樣,我們就可以得到T個采樣集,對于這T個采樣集,我們可以分別獨立的訓練出T個弱學習器,再對這T個弱學習器通過集合策略(一般對于分類問題集成策略選用投票法,對于回歸問題集成策略選擇平均法)來得到最終的強學習器(具有代表性的bagging思想的集成學習模型是隨機森林(RF))。
隨機采樣一般采用的是自助采樣法(Bootstrap sampling),即對于m個樣本的原始訓練集,我們每次先隨機采集一個樣本放入采樣集,接著把該樣本放回,也就是說下次采樣時該樣本仍有可能被采集到,這樣采集m次,最終可以得到m個樣本的采樣集,由于是隨機采樣,這樣每次的采樣集是和原始訓練集不同的,和其他采樣集也是不同的,這樣得到多個不同的弱學習器。
2.boosting
?Boosting算法的工作機制是首先從訓練集用初始權重訓練出一個弱學習器1,根據弱學習的學習誤差率表現來更新訓練樣本的權重,使得之前弱學習器1學習誤差率高的訓練樣本點的權重變高,使得這些誤差率高的點在后面的弱學習器2中得到更多的重視。然后基于調整權重后的訓練集來訓練弱學習器2.,如此重復進行,直到弱學習器數達到事先指定的數目T,最終將這T個弱學習器通過集合策略進行整合,得到最終的強學習器(具有代表性的采用boosting思想的模型有Adaboost以及GBDT和XGBoost)。
3.stacking(模型融合)
詳細解析可以參考:
https://zhuanlan.zhihu.com/p/26890738
https://www.zhihu.com/question/24598447/answer/232954415
https://zhuanlan.zhihu.com/p/33589222
如何做
?
?
假設弱學習器為(A1,A2,A3)強學習器為B,對訓練數據進行五折交叉,以弱學習器A1為例(對應上圖上面部分的Model1),五折交叉對應五次的Model1,每次通過上圖藍色的4份learn訓練模型,通過訓練出的模型預測橙色的Predict驗證集部分,得到結果Predictions(維度記為[v1,1]),對五次交叉獲得的Predictions進行連接組成新的數據(維度記為[v1*5,1]),同時數據集整體記為P1.同時沒個fold訓練出模型之后還需要對上圖綠色的測試集進行預測得到的結果(維度記為[t1,1])五折則結果的維度為[t1*5,1],然后對數據取平均得到的數據維度記為[at1,1],數據整體記住T1.
對于弱學習器A2,A3同樣如此,A2能夠獲得的數據維度記為[v2*5,1]),同時數據集整體記為P2,以及[at2,1],數據整體記住T2,A3能夠獲得的數據維度記為[v3*5,1]),同時數據集整體記為P3,以及[at3,1],數據整體記住T3.對P1,P2,P3組合獲得數據維度[V,3]作為強學習器B的訓練數據,T1,T2,T3組合獲得數據維度[AT,3]作為強學習器的驗證數據。
一般來說,一個好的融合的子模型應該符合以下兩個假設:
1)準確性(accuracy):大部分子模型要能對最終輸出有所幫助,而不是幫倒忙,應該至少比隨機猜測更準確。
2)多樣性(diversity):子模型間需要有所不同,長處和短處各異,(高度相關的)同質化的子模型無法互補。
于是我們想要同時提高“準確性”和“多樣性”,但很快就發現它們是此消彼長、互相制約的關系。
先不考慮準確性問題,僅對多樣性這方面進行考慮,可以通過如下這些方法提高多樣性:
1)選用不同類型的分類器,在整個X上進行訓練。此時的模型的多樣性取決于子模型對于數據不同的表達能力
2)?選用同類型的分類器,但使用不同的參數,此時模型的多樣性取決于“不同超參數在同一模型上的差異”所決定。
3)?選用相同的分類器,但在不同的訓練集上進行訓練。此時的差異性來源于數據的差異性。
4)?使用相同的分類器,但在不同特征上進行訓練。同理,此時的多樣性來源于數據的差異性。
我們因此發現,構造子模型就已經非常復雜了,融合模型有無數種組合方式,沒有唯一正確的方法。融合的底線就是盡量保持“準確性”和“多樣性”間的平衡。因此我們特別注意,手動融合模型時一般很少構造大量的弱分類器,而是精挑細選少量的強模型進行融合。手動構造融合模型時,建議優先考慮準確性,再考慮多樣性。
對于模型融合而言,子模型的選擇尤為重要,選擇子模型時應以準確度為首要,以多樣性為次要。同時需要注意的是,子模型的輸出不一定在同一個取值范圍內,為了更好的進行融合,應該把各個模型的取值控制在相同的范圍之內。
4.Stacking的輸出層為什么一般用Logistic回歸的效果比較好?
stacking的有效性主要來自于特征抽取,第一層已經通過不同的模型進行了特征的抽取,把這些抽取的特征作為新的輸入,即為已經使用了復雜的非線性變換,因此在輸出層不需要復雜的分類器。同時這也是在stacking中第二層數據中的特征中不該包括原始特征的原因,都是為了避免過擬合現象的發生。因此,stacking的輸出層不需要過分復雜的函數,用邏輯回歸還有額外的好處:
1)配合正則化還可以進一步防止過擬合
2)邏輯回歸的輸出結果還可被理解為概率
5.Stacking和神經網絡
具體參考:https://zhuanlan.zhihu.com/p/32896968(非常贊的分析,多思考)
Stacking一般來說,就是訓練一個多層(一般是兩層)的學習器結構,第一層(也叫學習層)用n個異質分類器或者n個同質分類器(這時要保證特征不同或者訓練數據不同)將得到預測結果合并為新的特征集,并作為下一層分類器的輸入。
Stacking不需要多層一般兩層就好,因為層數過多會帶來更嚴重的過擬合問題,那為什么 在stacking中堆多幾層,效果提升不明顯,或由于過擬合而效果下降呢?專欄的博主認為原因是,stacking中的表示,不是分布表示。而深度起作用的前提是分布表示,所以堆多層不好。第一層分類器的數量對于特征學習應該有所幫助,經驗角度看越多的基分類器越好。即使有所重復和高依賴性,我們依然可以通過特征選擇來處理,問題不大。
在stacking中,通過第一層的多個學習器后,有效的特征被學習出來了。從這個角度來看,stacking的第一層就是特征抽取的過程。
Stacking的缺點也非常明顯,stacking往往面臨很大的運算開銷,在預測時需要運行多個模型。
別的非常贊的想法:
Stacking和神經網絡都屬于表示學習(表示學習指的是模型從原始數據中自動抽取有效特征的過程)
Stacking中的第一層可以等價于神經網絡中的前 n-1層,而stacking中的最終分類層可以類比于神經網絡中最后的輸出層。不同點在于,stacking中不同的分類器通過異質來體現對于不同特征的表示,神經網絡是從同質到異質的過程且有分布式表示的特點(distributed representation)。Stacking中應該也有分布式的特點,主要表現在多個分類器的結果并非完全不同,而有很大程度的相同之處。
stacking的第一層與神經網絡的所有隱藏層都是一個高度復雜的非線性特征轉換器,樣本的表示經過這個變換后,得到了新的表示更好的表示,即線性可分。這樣stacking的第二層與神經網絡的輸出層使用簡單模型就足夠了。
不同之處:
stacking需要寬度,深度學習不需要
深度學習需要深度,而stacking不需要
我覺得stacking和深度學習有個區別,深度學習層與層之間梯度是能傳回去的,所以所有層之間會“彼此協調”,stacking每層之間并沒有之間的關聯,訓練后面的一層不會改變前面一層的權重值。
神經網絡相比于Stacking的優勢,神經網絡能夠通過遷移學習應用到先驗知識。
?
轉載于:https://www.cnblogs.com/dyl222/p/11086565.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的机器学习之集成学习(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前台Vue、后台Django、设置axi
- 下一篇: Springboot .properti