如何在 Adaboost 中使用决策树桩作为弱学习器?

机器算法验证 机器学习 分类 大车 助推
2022-03-02 05:28:34

我想使用决策树桩实现 Adaboost。在 Adaboost 的每次迭代中做出与我们数据集的特征一样多的决策树桩是否正确?

例如,如果我有一个包含 24 个特征的数据集,我是否应该在每次迭代中使用 24 个决策树桩分类器?或者我应该随机选择一些特征并对它们进行分类而不是所有特征?

1个回答

训练(1 级)决策树的典型方法是找到这样一个能够提供最纯粹分割的属性。即,如果我们将数据集分成两个子集,我们希望这些子集中的标签尽可能同质。所以它也可以被看作是构建许多树——每个属性的树——然后选择产生最佳分割的树。

在某些情况下,选择属性子集然后在子集上训练树也是有意义的。例如,这在随机森林中用于减少单个树之间的相关性。

但是对于 AdaBoost,通常只要确保基础分类器可以在加权数据点上进行训练就足够了,而随机特征选择就不那么重要了。决策树可以处理权重(参见例如此处此处)。它可以通过加权每个数据点对总子集杂质的贡献来完成。

作为参考,我还将使用 numpy 和sklearnDecisionTreeClassifier在 python 中添加我的AdaBoost 实现max_depth=1

# input: dataset X and labels y (in {+1, -1})
hypotheses = []
hypothesis_weights = []

N, _ = X.shape
d = np.ones(N) / N

for t in range(num_iterations):
    h = DecisionTreeClassifier(max_depth=1)

    h.fit(X, y, sample_weight=d)
    pred = h.predict(X)

    eps = d.dot(pred != y)
    alpha = (np.log(1 - eps) - np.log(eps)) / 2

    d = d * np.exp(- alpha * y * pred)
    d = d / d.sum()

    hypotheses.append(h)
    hypothesis_weights.append(alpha)

对于预测标签:

# X input, y output
y = np.zeros(N)
for (h, alpha) in zip(hypotheses, hypotheses_weight):
    y = y + alpha * h.predict(X)
y = np.sign(y)