AdaBoost - 如何使用分布 D

AdaBoost - How to use the distribution D

我打算在 Python 中实现 AdaBoost 算法。

我在名为 classifiers 的列表中有 m 个弱分类器。
我有向量 _D,其中包含当前迭代的分布值。
我的代码如下所示(向量是 numpy 数组):

for t in range(m):
  chosen_examples_indexes = []
  for i, d in enumerate(_D):
    if np.random.binomial(1, d) == 1:
      chosen_examples_indexes.append(i)
    training_examples = examples[chosen_examples_indexes]

问题是_D iw的使用是否正确。如果不是,正确的用法是什么?

AdaBoost 在其核心版本中使用分布 D 来 加权 你的样本,而不是对它们进行采样(尽管在极限情况下这几乎是一样的,在固定长度的情况下这完全不同)。

因此在您的符号中,您只需做

X, y = # get training data from examples
for t in range(m):
    classifiers[t].fit(X, y, sample_weights=_D)
    # update _D based on results

如果你的分类器不支持 sample_weights 那么问题就更多了,解决方案或多或少与你提供的一样,但是权重应该总是 preferred 如果仅可能,因为它是对我们感兴趣的内容的直接优化,而不是随机近似(来自采样)。

for t in range(m):
    chosen_examples_indexes = np.array([np.random.random() < _d for _d in _D])
    training_examples = examples[chosen_examples_indexes]
    X, y = # get training data from training_examples
    classifiers[t].fit(X, y)
    # update _D based on results