做网站推广挣多少钱,二级域名查询,3免费做网站,优秀手机网站设计前言
我们常说三个臭皮匠顶个诸葛亮#xff0c;在机器学习领域中将这个理念应用到极致的技术是boosting#xff0c;将N多的弱分类器组合到一起#xff0c;达到一个强分类器的效果#xff0c;主流代表的算法就是xgboost#xff0c;当然对于这种集成的思想#xff0c;还有…前言
我们常说三个臭皮匠顶个诸葛亮在机器学习领域中将这个理念应用到极致的技术是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*weight1model2_result*weight2… 二、引入GreedyEnsemble
1. 难点解析
前面我们介绍了在hard Ensemble的基础上我们可以引入权重的概念比如在实际的歌唱比赛演讲比赛脱口秀比赛中专业评委和一般投票人的投票权重是节目组会提前制定好并公开的。 那问题在于在实际业务建模过程中每个模型的权重是多少是需要我们自己决定的当然你可以各种尝试或者用一些经典的数组如下所示 0.5,0.1,0.1,0.1,0.1,0.10.8,0.05,0.05,0.05,0.050.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]), dtypenp.float64) ##初始化当前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) ##计算并保存当前分数best np.argmax(stack_scores)scores.append(stack_scores[best]) #获得该轮迭代的分数best_stack.append(best)sum_predictions predictions[:, best] ###更新当前ensemble的preds4. 后记
关于算法的具体实现部分你可以参考hypergbm你也可以直接使用hypergbm进行自动建模。