日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 导入模型h20_【机器学习】模型融合方法概述

發布時間:2025/3/20 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 导入模型h20_【机器学习】模型融合方法概述 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我理解的Kaggle比賽中提高成績主要有3個地方

特征工程

調參

模型融合

之前每次打比賽都只做了前兩部分,最后的模型融合就是簡單的加權平均,對于進階的Stacking方法一直沒嘗試,這幾天摸索了一下還是把Stacking方法給弄懂了。(本文重點講解Stacking,Bagging和Boosting有很多權威的好教程,所以不詳細介紹)最早的Stacking思想早些年就有論文發表,但是應用Stacking方法到比賽中的相關文章還是少之甚少,這有兩篇https://mlwave.com/kaggle-ensembling-guide/、HUMAN ENSEMBLE LEARNING講的很棒,但是之前因為理解不到位,有幾處卡住了。在@Wille?的文章如何在 Kaggle 首戰中進入前 10%中Stacking只是作為一部分提到。因此決定自己寫一篇關于模型融合的文章。本文不涉及到各個算法原理層次的深度,目的在于從宏觀上幫助理解這幾個模型融合方法。

一、Voting

模型融合其實也沒有想象的那么高大上,從最簡單的Voting說起,這也可以說是一種模型融合。假設對于一個二分類問題,有3個基礎模型,那么就采取投票制的方法,投票多者確定為最終的分類。

二、Averaging

對于回歸問題,一個簡單直接的思路是取平均。稍稍改進的方法是進行加權平均。權值可以用排序的方法確定,舉個例子,比如A、B、C三種基本模型,模型效果進行排名,假設排名分別是1,2,3,那么給這三個模型賦予的權值分別是3/6、2/6、1/6

這兩種方法看似簡單,其實后面的高級算法也可以說是基于此而產生的,Bagging或者Boosting都是一種把許多弱分類器這樣融合成強分類器的思想。

三、Bagging

Bagging就是采用有放回的方式進行抽樣,用抽樣的樣本建立子模型,對子模型進行訓練,這個過程重復多次,最后進行融合。大概分為這樣兩步:重復K次

有放回地重復抽樣建模

訓練子模型

2.模型融合

分類問題:voting

回歸問題:average

Bagging算法不用我們自己實現,隨機森林就是基于Bagging算法的一個典型例子,采用的基分類器是決策樹。R和python都集成好了,直接調用。

四、Boosting

Bagging算法可以并行處理,而Boosting的思想是一種迭代的方法,每一次訓練的時候都更加關心分類錯誤的樣例,給這些分類錯誤的樣例增加更大的權重,下一次迭代的目標就是能夠更容易辨別出上一輪分類錯誤的樣例。最終將這些弱分類器進行加權相加。引用加州大學歐文分校Alex Ihler教授的兩頁PPT

同樣地,基于Boosting思想的有AdaBoost、GBDT等,在R和python也都是集成好了直接調用。

PS:理解了這兩點,面試的時候關于Bagging、Boosting的區別就可以說上來一些,問Randomfroest和AdaBoost的區別也可以從這方面入手回答。也算是留一個小問題,隨機森林、Adaboost、GBDT、XGBoost的區別是什么?

五、Stacking

Stacking方法其實弄懂之后應該是比Boosting要簡單的,畢竟小幾十行代碼可以寫出一個Stacking算法。我先從一種“錯誤”但是容易懂的Stacking方法講起。

Stacking模型本質上是一種分層的結構,這里簡單起見,只分析二級Stacking.假設我們有3個基模型M1、M2、M3。

1. 基模型M1,對訓練集train訓練,然后用于預測train和test的標簽列,分別是P1,T1

對于M2和M3,重復相同的工作,這樣也得到P2,T2,P3,T3。

2. 分別把P1,P2,P3以及T1,T2,T3合并,得到一個新的訓練集和測試集train2,test2.

3. 再用第二層的模型M4訓練train2,預測test2,得到最終的標簽列。

Stacking本質上就是這么直接的思路,但是這樣肯定是不行的,問題在于P1的得到是有問題的,用整個訓練集訓練的模型反過來去預測訓練集的標簽,毫無疑問過擬合是非常非常嚴重的,因此現在的問題變成了如何在解決過擬合的前提下得到P1、P2、P3,這就變成了熟悉的節奏——K折交叉驗證。我們以2折交叉驗證得到P1為例,假設訓練集為4行3列

將其劃分為2部分

用traina訓練模型M1,然后在trainb上進行預測得到preb3和pred4

在trainb上訓練模型M1,然后在traina上進行預測得到pred1和pred2

然后把兩個預測集進行拼接

對于測試集T1的得到,有兩種方法。注意到剛剛是2折交叉驗證,M1相當于訓練了2次,所以一種方法是每一次訓練M1,可以直接對整個test進行預測,這樣2折交叉驗證后測試集相當于預測了2次,然后對這兩列求平均得到T1。

或者直接對測試集只用M1預測一次直接得到T1。

P1、T1得到之后,P2、T2、P3、T3也就是同樣的方法。理解了2折交叉驗證,對于K折的情況也就理解也就非常順利了。所以最終的代碼是兩層循環,第一層循環控制基模型的數目,每一個基模型要這樣去得到P1,T1,第二層循環控制的是交叉驗證的次數K,對每一個基模型,會訓練K次最后拼接得到P1,取平均得到T1。這下再把@Wille博文中的那張圖片放出來就很容易看懂了。

該圖是一個基模型得到P1和T1的過程,采用的是5折交叉驗證,所以循環了5次,拼接得到P1,測試集預測了5次,取平均得到T1。而這僅僅只是第二層輸入的一列/一個特征,并不是整個訓練集。再分析作者的代碼也就很清楚了。也就是剛剛提到的兩層循環。

python實現

用了一個泰坦尼克號的嘗試了一下代碼,從頭到尾都是可以運行的。代碼放在Github,針對其中一段關鍵的稍作分析

def get_oof(clf, x_train, y_train, x_test):

oof_train = np.zeros((ntrain,))

oof_test = np.zeros((ntest,))

oof_test_skf = np.empty((NFOLDS, ntest)) #NFOLDS行,ntest列的二維array

for i, (train_index, test_index) in enumerate(kf): #循環NFOLDS次

x_tr = x_train[train_index]

y_tr = y_train[train_index]

x_te = x_train[test_index]

clf.fit(x_tr, y_tr)

oof_train[test_index] = clf.predict(x_te)

oof_test_skf[i, :] = clf.predict(x_test) #固定行填充,循環一次,填充一行

oof_test[:] = oof_test_skf.mean(axis=0) #axis=0,按列求平均,最后保留一行

return oof_train.reshape(-1, 1), oof_test.reshape(-1, 1) #轉置,從一行變為一列

這里只實現了針對一個基模型做K折交叉驗證,因為P1和T1都是多行一列的結構,這里是先存儲為一行多列,最后進行轉置。

但是Stacking方法其實在R中也有集成好的可以調用。

caretEnsemble包下的caretStack()方法

關鍵代碼如下:

algorithmList

stackControl

stack.glm

有一篇博文講的比較詳細

h2o包的h2o.stack()方法

關鍵代碼如下:

nfolds

glm1

training_frame = train,

nfolds = nfolds,

fold_assignment = "Modulo",

keep_cross_validation_predictions = TRUE)

gbm1

training_frame = train,

seed = 1,

nfolds = nfolds,

fold_assignment = "Modulo",

keep_cross_validation_predictions = TRUE)

rf1

training_frame = train,

seed = 1,

nfolds = nfolds,

fold_assignment = "Modulo",

keep_cross_validation_predictions = TRUE)

dl1

training_frame = train,

nfolds = nfolds,

fold_assignment = "Modulo",

keep_cross_validation_predictions = TRUE)

models

metalearner

stack

response_frame = train[,y],

metalearner = metalearner,

seed = 1,

keep_levelone_data = TRUE)

# Compute test set performance:

perf

詳情見h2o的Github網站

最后放一張H2O分享的圖片總結一下

總結

以上是生活随笔為你收集整理的python 导入模型h20_【机器学习】模型融合方法概述的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。