¿Cómo usar el tocón de decisión como aprendiz débil en Adaboost?

11

Quiero implementar Adaboost usando Decision Stump. ¿Es correcto tomar tantas decisiones como las características de nuestro conjunto de datos en cada iteración de Adaboost?

Por ejemplo, si tengo un conjunto de datos con 24 características, ¿debería tener 24 clasificador de tocones de decisión en cada iteración? ¿O debería elegir al azar algunas características y hacer un clasificador en ellas en lugar de todas las características?

Pegah
fuente

Respuestas:

11

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)
Alexey Grigorev
fuente
Gracias. ¿Se utiliza el tocón de decisión como una parte (como un algoritmo de árbol de decisión) con profundidad máxima 1? Quiero decir, ¿debería seleccionar un atributo al azar o el árbol debería dividirse según un criterio específico como el Índice de Gini? @AlexeyGrigorev
Pegah
Tocón de decisión = regla 1 = un árbol de decisión con un nodo (con profundidad máxima 1). Debe seleccionar la división en función de alguna medida de impureza, por ejemplo, en función del índice de Gini.
Alexey Grigorev
Gracias por esta respuesta detallada!
xsari3x