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]