Як використовувати пень рішення як слабкого учня в Adaboost?


12

Я хочу реалізувати Adaboost за допомогою рішення Stump. Чи правильно робити стільки рішень, скільки можливостей нашого набору даних у кожній ітерації Adaboost?

Наприклад, якщо у мене є набір даних з 24 функціями, чи повинен я мати 24 класифікатори пеньки для кожної ітерації? Або я повинен випадковим чином вибрати деякі функції та зробити класифікатор на них замість усіх функцій?

Відповіді:


12

Типовий спосіб навчання (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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.