11 votos

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

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 funciones, ¿debería tener 24 clasificadores de tocón de decisión en cada iteración? ¿O debería elegir aleatoriamente algunas características y hacer clasificador en ellas en lugar de todas las características?

11voto

Alexey Grigorev Puntos 1751

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)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X