Source code for btb.selection.hierarchical

from btb.selection.ucb1 import UCB1


[docs]class HierarchicalByAlgorithm(UCB1): """Hierarchical selector Args: by_algorithm (Dict[str, List]): mapping of ML algorithms to frozen set choices """ def __init__(self, choices, by_algorithm): super(HierarchicalByAlgorithm, self).__init__(choices) self.by_algorithm = by_algorithm
[docs] def select(self, choice_scores): """ Groups the frozen sets by algorithm and first chooses an algorithm based on the traditional UCB1 criteria. Next, from that algorithm's frozen sets, makes the final set choice. """ # choose algorithm using a bandit alg_scores = {} for algorithm, choices in self.by_algorithm.items(): # only make arms for algorithms that have options if not set(choices) & set(choice_scores.keys()): continue # sum up lists to get a list of all the scores from any run of this # algorithm sublists = [choice_scores.get(c, []) for c in choices] alg_scores[algorithm] = sum(sublists, []) best_algorithm = self.bandit(alg_scores) # now use only the frozen sets from the chosen algorithm best_subset = self.by_algorithm[best_algorithm] normal_ucb1 = UCB1(choices=best_subset) return normal_ucb1.select(choice_scores)