Как использовать пень принятия решения как слабый ученик в Adaboost?

11

Я хочу реализовать Adaboost с помощью Decision Stump. Правильно ли принимать столько решений, сколько функций нашего набора данных в каждой итерации Adaboost?

Например, если у меня есть набор данных с 24 функциями, должен ли я иметь 24 классификатора решения для каждой итерации? Или я должен случайно выбрать некоторые функции и сделать классификатор на них вместо всех функций?

Pegah
источник

Ответы:

11

Типичный способ обучения дерева решений (1-го уровня) - найти такой атрибут, который дает самое чистое разделение. Т.е., если мы разделим наш набор данных на два подмножества, мы хотим, чтобы метки внутри этих подмножеств были как можно более однородными. Таким образом, это также можно рассматривать как построение множества деревьев - дерева для каждого атрибута - и затем выбор дерева, которое дает наилучшее разбиение.

В некоторых случаях также имеет смысл выбрать подмножество атрибутов, а затем обучить деревья на подмножестве. Например, это используется в Random Forest для уменьшения корреляции между отдельными деревьями.

Но когда дело доходит до AdaBoost, обычно достаточно убедиться, что базовый классификатор можно обучить на взвешенных точках данных, и случайный выбор признаков менее важен. Деревья решений могут обрабатывать веса (см., Например, здесь или здесь ). Это может быть сделано путем взвешивания вклада каждой точки данных в общую подмножество примесей.

Для справки я также добавлю свою реализацию AdaBoost в python, используя numpy и sklearnDecisionTreeClassifier с 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)
Алексей Григорьев
источник
Спасибо. Используется ли пень решения как rpart (как алгоритм дерева решений) с максимальной глубиной 1? Я имею в виду, должен ли я выбрать атрибут случайным образом или дерево должно быть разделено на основе определенных критериев, таких как индекс Джини? @AlexeyGrigorev
Pegah
Пень решения = 1-правило = дерево решений с одним узлом (с максимальной глубиной 1). Вы должны выбрать разделение на основе какой-либо примесной меры, например, на основе индекса Джини.
Алексей Григорьев
Спасибо за этот подробный ответ!
xsari3x