Ensemble算法之GreedyEnsemble

前言

我们常说三个臭皮匠顶个诸葛亮,在机器学习领域中将这个理念应用到极致的技术是boosting,将N多的弱分类器组合到一起,达到一个强分类器的效果,主流代表的算法就是xgboost,当然对于这种集成的思想,还有另外一个技术叫做ensemble,我们通过训练出不同算法的最优单模型,然后综合这些单模型的投票结果,输出最终结果。

一般来说,ensemble技术主要有两个好处,

  • 可以进一步提升模型的性能
  • 可以有效降低单模型过拟合的风险

本文将介绍一种非常高效的ensemble算法,-GreedyEnsemble算法。

  • 算法参考paper:
    Caruana, Rich, et al. “Ensemble selection from libraries of models.” Proceedings of the twenty-first international conference on Machine learning. 2004.

  • 算法实现参考源码:
    主流的automl开源框架hypergbm,点击这里直接跳转到源码

一、 ensemble介绍

1. hard模式

在这里插入图片描述
如上图所示,我们现在正在进行宣传大使的选举活动,两位候选人分别的得票数为4票,3票,那么根据投票规则,候选人A将会成为下一届的宣传大使。
当然我们可以抽象上面的情景为:因为某个业务,我们已经训练好了7个不同的模型,每个模型都需要预测出A/B两个类别的概率,然后我们通过ensemble发现4个模型都预测的是A,而3个模型预测的是B,那少数服从多数,我们最终ensemble后的预测结果就会是A

2. soft模式

然而真实的情况也许会比上面的情景更复杂一点
在这里插入图片描述

同样是上面的投票选取下一届的宣传大使,虽然候选人A得了4票,但是候选人B中有一票是非常特殊的,如上图红色部分,实际情况下,也许这一票是评委或者是上一届的宣传大使投票所得,那么我们可以修改投票规则为 评委票=3*普通票,那么最终结果来说,将是候选人B获胜。 也就是说在这个场景下,我们为不同的模型分配了不同的权重。

同样,我们将这个问题进行业务抽象,因为某个业务,我们已经训练好了7个模型,但是7个模型的性能互相是有差异的,也就是我们会考虑,性能很好的模型本身的预测结果的可信度就应该高于性能很一般模型的预测结果。这样我们就给模型引入了权重的概念,那最终的预测结果就变成了:

final_result = model1_result*weight1+model2_result*weight2+…

二、引入GreedyEnsemble

1. 难点解析

前面我们介绍了在hard Ensemble的基础上,我们可以引入权重的概念,比如在实际的歌唱比赛,演讲比赛,脱口秀比赛中,专业评委和一般投票人的投票权重是节目组会提前制定好并公开的。
那问题在于在实际业务建模过程中,每个模型的权重是多少是需要我们自己决定的,当然你可以各种尝试,或者用一些经典的数组,如下所示:

  1. 0.5,0.1,0.1,0.1,0.1,0.1
  2. 0.8,0.05,0.05,0.05,0.05
  3. 0.2,0.2,0.2,0.1,0.1,0.1,0.1

我们现在就想找到一种方式,不用我们自己去确定哪种权重组合下ensemble的性能可以达到最优,而是让算法可以自己给我分配出一个权重组合方式,以达到ensemble模型的最优性能。整体问题抽象如下:

在这里插入图片描述

A模块不断的提供候选权重数组,B模块不断的去评估ensemble的性能。甚至我们可以通过最优超参数优化【HPO】的思想去解决,把A想成是一个搜索空间,B是一个反馈,然后中间需要一个搜索算法,以得到最优结果,感兴趣的朋友可以基于hyperents,看一下是否能够搭建出这样一个业务需求demo。

2. 算法逻辑实现

在这里插入图片描述

3. (部分)源码展示

    def fit_predictions(self, predictions, y_true):
        scores = []
        best_stack = []
        sum_predictions = np.zeros((predictions.shape[0]), dtype=np.float64) ##初始化当前ensemble的preds
        size = self.ensemble_size
        for 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) ##计算并保存当前分数
            best = np.argmax(stack_scores)
            scores.append(stack_scores[best]) #获得该轮迭代的分数
            best_stack.append(best)
            sum_predictions += predictions[:, best]  ###更新当前ensemble的preds

4. 后记

关于算法的具体实现部分,你可以参考hypergbm,你也可以直接使用hypergbm进行自动建模。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值