河北高端網(wǎng)站設(shè)計(jì)河北seo推廣
前言
我們常說三個(gè)臭皮匠頂個(gè)諸葛亮,在機(jī)器學(xué)習(xí)領(lǐng)域中將這個(gè)理念應(yīng)用到極致的技術(shù)是boosting,將N多的弱分類器組合到一起,達(dá)到一個(gè)強(qiáng)分類器的效果,主流代表的算法就是xgboost,當(dāng)然對(duì)于這種集成的思想,還有另外一個(gè)技術(shù)叫做ensemble,我們通過訓(xùn)練出不同算法的最優(yōu)單模型,然后綜合這些單模型的投票結(jié)果,輸出最終結(jié)果。
一般來說,ensemble技術(shù)主要有兩個(gè)好處,
- 可以進(jìn)一步提升模型的性能
- 可以有效降低單模型過擬合的風(fēng)險(xiǎn)
本文將介紹一種非常高效的ensemble算法,-GreedyEnsemble算法。
-
算法參考paper:
Caruana, Rich, et al. “Ensemble selection from libraries of models.” Proceedings of the twenty-first international conference on Machine learning. 2004. -
算法實(shí)現(xiàn)參考源碼:
主流的automl開源框架hypergbm,點(diǎn)擊這里直接跳轉(zhuǎn)到源碼
一、 ensemble介紹
1. hard模式
如上圖所示,我們現(xiàn)在正在進(jìn)行宣傳大使的選舉活動(dòng),兩位候選人分別的得票數(shù)為4票,3票,那么根據(jù)投票規(guī)則,候選人A將會(huì)成為下一屆的宣傳大使。
當(dāng)然我們可以抽象上面的情景為:因?yàn)槟硞€(gè)業(yè)務(wù),我們已經(jīng)訓(xùn)練好了7個(gè)不同的模型,每個(gè)模型都需要預(yù)測(cè)出A/B兩個(gè)類別的概率,然后我們通過ensemble發(fā)現(xiàn)4個(gè)模型都預(yù)測(cè)的是A,而3個(gè)模型預(yù)測(cè)的是B,那少數(shù)服從多數(shù),我們最終ensemble后的預(yù)測(cè)結(jié)果就會(huì)是A
2. soft模式
然而真實(shí)的情況也許會(huì)比上面的情景更復(fù)雜一點(diǎn)
同樣是上面的投票選取下一屆的宣傳大使,雖然候選人A得了4票,但是候選人B中有一票是非常特殊的,如上圖紅色部分,實(shí)際情況下,也許這一票是評(píng)委或者是上一屆的宣傳大使投票所得,那么我們可以修改投票規(guī)則為 評(píng)委票=3*普通票,那么最終結(jié)果來說,將是候選人B獲勝。 也就是說在這個(gè)場景下,我們?yōu)椴煌哪P头峙淞瞬煌臋?quán)重。
同樣,我們將這個(gè)問題進(jìn)行業(yè)務(wù)抽象,因?yàn)槟硞€(gè)業(yè)務(wù),我們已經(jīng)訓(xùn)練好了7個(gè)模型,但是7個(gè)模型的性能互相是有差異的,也就是我們會(huì)考慮,性能很好的模型本身的預(yù)測(cè)結(jié)果的可信度就應(yīng)該高于性能很一般模型的預(yù)測(cè)結(jié)果。這樣我們就給模型引入了權(quán)重的概念,那最終的預(yù)測(cè)結(jié)果就變成了:
final_result = model1_result*weight1+model2_result*weight2+…
二、引入GreedyEnsemble
1. 難點(diǎn)解析
前面我們介紹了在hard Ensemble的基礎(chǔ)上,我們可以引入權(quán)重的概念,比如在實(shí)際的歌唱比賽,演講比賽,脫口秀比賽中,專業(yè)評(píng)委和一般投票人的投票權(quán)重是節(jié)目組會(huì)提前制定好并公開的。
那問題在于在實(shí)際業(yè)務(wù)建模過程中,每個(gè)模型的權(quán)重是多少是需要我們自己決定的,當(dāng)然你可以各種嘗試,或者用一些經(jīng)典的數(shù)組,如下所示:
- 0.5,0.1,0.1,0.1,0.1,0.1
- 0.8,0.05,0.05,0.05,0.05
- 0.2,0.2,0.2,0.1,0.1,0.1,0.1
…
我們現(xiàn)在就想找到一種方式,不用我們自己去確定哪種權(quán)重組合下ensemble的性能可以達(dá)到最優(yōu),而是讓算法可以自己給我分配出一個(gè)權(quán)重組合方式,以達(dá)到ensemble模型的最優(yōu)性能。整體問題抽象如下:
A模塊不斷的提供候選權(quán)重?cái)?shù)組,B模塊不斷的去評(píng)估ensemble的性能。甚至我們可以通過最優(yōu)超參數(shù)優(yōu)化【HPO】的思想去解決,把A想成是一個(gè)搜索空間,B是一個(gè)反饋,然后中間需要一個(gè)搜索算法,以得到最優(yōu)結(jié)果,感興趣的朋友可以基于hyperents,看一下是否能夠搭建出這樣一個(gè)業(yè)務(wù)需求demo。
2. 算法邏輯實(shí)現(xiàn)
3. (部分)源碼展示
def fit_predictions(self, predictions, y_true):scores = []best_stack = []sum_predictions = np.zeros((predictions.shape[0]), dtype=np.float64) ##初始化當(dāng)前ensemble的predssize = self.ensemble_sizefor i in range(size):stack_scores = []for j in range(predictions.shape[1]):pred = predictions[:, j]mean_predictions = (sum_predictions + pred) / (len(best_stack) + 1) ##獲得均值#....score = self.scorer._score_func(y_true, mean_predictions)stack_scores.append(score) ##計(jì)算并保存當(dāng)前分?jǐn)?shù)best = np.argmax(stack_scores)scores.append(stack_scores[best]) #獲得該輪迭代的分?jǐn)?shù)best_stack.append(best)sum_predictions += predictions[:, best] ###更新當(dāng)前ensemble的preds
4. 后記
關(guān)于算法的具體實(shí)現(xiàn)部分,你可以參考hypergbm,你也可以直接使用hypergbm進(jìn)行自動(dòng)建模。