La forma típica de entrenar un árbol de decisión (de 1 nivel) es encontrar un atributo que dé la división más pura. Es decir, si dividimos nuestro conjunto de datos en dos subconjuntos, queremos que las etiquetas dentro de estos subconjuntos sean lo más homogéneas posible. Por lo tanto, también se puede ver como construir muchos árboles, un árbol para cada atributo, y luego seleccionar el árbol que produce la mejor división.
En algunos casos, también tiene sentido seleccionar un subconjunto de atributos y luego entrenar árboles en el subconjunto. Por ejemplo, esto se usa en Random Forest para reducir la correlación entre árboles individuales.
Pero cuando se trata de AdaBoost, normalmente es suficiente para asegurarse de que el clasificador base pueda entrenarse en puntos de datos pesados, y la selección aleatoria de características es menos importante. Los árboles de decisión pueden manejar pesos (ver, por ejemplo, aquí o aquí ). Puede hacerse ponderando la contribución de cada punto de datos a la impureza total del subconjunto.
Como referencia también agregaré mi implementación AdaBoost en python usando numpy y sklearn'sDecisionTreeClassifier
con 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)
Para predecir las etiquetas:
# 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)