Типичный способ обучения дерева решений (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)