Як використовувати пень рішення як слабкого учня в 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.