如何在Adaboost中将决策树桩用作弱学习者?


12

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

例如,如果我有一个包含24个要素的数据集,那么每次迭代中是否应该有24个决策树桩分类器?还是应该随机选择一些功能并对其进行分类,而不是对所有功能进行分类?

Answers:


11

训练(1级)决策树的典型方法是找到一个给出最纯净拆分的属性。即,如果我们将数据集分为两个子集,我们希望这些子集内的标签尽可能一致。因此,它也可以看作是构建许多树-为每个属性创建一棵树-然后选择产生最佳拆分的树。

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

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

仅供参考我也将使用numpy的,并添加我的AdaBoost实现在Python sklearn的DecisionTreeClassifiermax_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)

谢谢。决策树桩是否用作最大深度为1的部分(作为决策树算法)?我的意思是我应该随机选择一个属性,还是应该根据诸如Gini Index之类的特定条件拆分树?@AlexeyGrigorev
Pegah

决策树桩= 1规则=具有一个节点(最大深度为1)的决策树。您应基于一些杂质度量(例如基于基尼系数)选择拆分。
阿列克谢·格里戈列夫

感谢您提供详细的答案!
xsari3x
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.