La forma típica de la formación de un (1) Árbol de Decisión es encontrar un atributo que se le da la más pura split. I. e. si dividimos nuestro conjunto de datos en dos subconjuntos, queremos que las etiquetas dentro de estos subconjuntos a ser tan homogénea como sea posible. Por lo que también puede ser visto como la construcción de muchos de los árboles un árbol para cada atributo y, a continuación, seleccionando el árbol que produce las mejores split.
En algunos casos, también tiene sentido para seleccionar un subconjunto de atributos y, a continuación, tren de árboles en el subconjunto. Por ejemplo, este es utilizado en el Bosque Aleatorio para la reducción de la correlación entre los árboles individuales.
Pero cuando se trata de AdaBoost, normalmente es suficiente para asegurarse de que la base del clasificador puede ser capacitados en pesó puntos de datos, y al azar la selección de características es menos importante. Árboles de decisión se pueden manejar pesos (ver, por ejemplo, aquí o aquí). Puede ser realizado por la ponderación de la contribución de cada punto de datos para el total del subconjunto de la impureza.
Para referencia también voy a agregar a mi AdaBoost implementación en python usando numpy y sklearn s DecisionTreeClassifier
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 la predicción de 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)