Ensemble

我们现在支持 voting 和 stacking 方法

Voting

Voter本质上构建了base learner预测的加权和。给定一个评估指标,Voter以某种方式确定base learner的权重,使得验证集指标分数最大化。

我们采用Rich Caruana的权重确定方法。该方法首先通过贪婪搜索找到权重相等的(可能是冗余的)base learner集合,然后通过集合中出现的次数指定Voter中的权重。

您可以通过重写 _specificy_weights 方法来定制自己的权重确定方法。

# 例子: 对所有base learner 使用同样的权重
class EqualWeightVoting(Voting):
    def _specify_weights(self, predictions, label, feval):
        return np.ones(self.n_models)/self.n_models
        # 对所有base learner 赋予相同的权重

Stacking

Stacker将Base Learner的预测作为输入来训练元模型,以找到这些base learner的最佳组合。

目前我们支持广义线性模型(GLM)和梯度推进模型(GBM)作为元模型。

创建一个新的ensemble

您可以通过继承base ensember,重载``fit``和``ensemble``方法来创建自己的ensember。

# 例子 : 使用当前可用的最佳模型
from autogl.module.ensemble.base import BaseEnsembler
import numpy as np
class BestModel(BaseEnsembler):
    def fit(self, predictions, label, identifiers, feval):
        if not isinstance(feval, list):
            feval = [feval]
        scores = np.array([feval[0].evaluate(pred, label) for pred in predictions]) * (1 if feval[0].is_higher_better else -1)
        self.scores = dict(zip(identifiers, scores)) # record validation score of base learners
        ensemble_pred = predictions[np.argmax(scores)]
        return [fx.evaluate(ensemble_pred, label) for fx in feval]

    def ensemble(self, predictions, identifiers):
        best_idx = np.argmax([self.scores[model_name] for model_name in identifiers]) # choose the currently best model in the identifiers
        return predictions[best_idx]