lunes, 20 de abril de 2009

Amor por los árboles (de decisión)

zyxo en su interesante blog Mixotricha, escribió un muy buen artículo relativo a las ventajas de los árboles de decisión y el control del overfitting (sobreentrenamiento), del cual me tomé la libertad de traducir y parafrasear las partes que me parecieron más interesantes:

Desventajas de los árboles de decisión:
- Overfitting (¡pero se puede controlar y usar para mejorar la calidad del modelo!)

Ventajas:
- Legibilidad del resultado: Simples sentencias IF THEN
- Algoritmo simple
- Robustez: El preprocesamiento y la limpieza de datos son un trabajo engorroso, ¡¡pero los árboles funcionan bien sin ellos!!
- Flexibilidad: El manejo de los parámetros permite construir árboles desde muy pequeños a muy grandes
- Overfitting: Si se lo controla apropiadamente
- Parametrización sencilla y poderosa
- Posibilidad de modelos grandes que dan resultados muy "detallados"
- Aprendizaje débil (weak learner), por lo que pueden ganar mucho con técnicas de ensamble como bagging.

Luego el artículo de zyxo habla del bagging, lo que me gustaría dejar para otra oportunidad. Salto al manejo de parámetros para controlar el overfitting:

- Olvídese de la profundidad máxima, establézcala lo más alta posible. Nunca debe ser un criterio de parada si se busca calidad (no así si se busca un modelo más simple, pequeño y legible con propósitos de documentación).
- Use los tamaños mínimos de nodos terminales y de apertura (min child/parent node size en SPSS/Clementine). Estableciendo estos valores muy altos se obtienen árboles pequeños con poco overfitting pero baja calidad. Con valores demasiado pequeños se obtienen árboles enormes con muchísimo overfitting. Es necesario experimentar un poco y evaluar la calidad contra datos de prueba.

Para encontrar los parámetros óptimos el artículo habla de los resultados de la evaluación del bagging, pero en caso de tener un sólo árbol el criterio general sería bajar progresivamente los valores de los tamaños mínimos mientras la evaluación en los datos de prueba dé cada vez mejor, hasta que dé peor (o empiece a dar resultados erráticos), y en ese punto volver un paso atrás y quedarse con los parámetros de dicho paso.

Agrego algunas otras consideraciones:

- Para un árbol de decisión la variable objetivo ideal es binaria: POSITIVO / NEGATIVO. Si la variable es categórica convendría hacer tantos modelos como categorías, tomando como positiva una categoría a la vez, y las demás como negativas. Luego se deberían ensamblar los distintos modelos en uno solo (con otro árbol u otro tipo de modelo). No es la herramienta más adecuada para predecir variables numéricas.
- Tiene manejo de los valores nulos (o missing). Al dividir un nodo por una de las variables, simplemente asigna los casos en que el valor de esa variable es nulo a una de las ramas de la división. Pero atención, esto provoca que se consideren todos los nulos de igual forma (como si tuvieran el mismo valor), algo que en algunos casos no es satisfactorio y requiere una preparación previa más elaborada.
- Soporta una buena cantidad de desbalanceo en la variable objetivo.
- Clasifica (da algún resultado para) cualquier caso que se evalúe, aún si no se le proporcionó ninguno similar durante el entrenamiento.
- Cuidado con las interacciones entre variables. El algoritmo considera de a una variable por vez, y va cortando el espacio de soluciones en "rectángulos", por lo que cualquier interacción entre variables que defina una región importante con forma no rectangular será pobremente representada. Hay técnicas para detectar esto y generar variables adicionales que reflejen estas interacciones para que el árbol las aproveche.
- No existe un único árbol que sea la mejor solución. Pequeñas variaciones en el dataset (como un corte al azar diferente para definir entrenamiento y prueba) pueden dar árboles completamente diferentes. 
- Otro parámetro a tener en cuenta es la selección de la variable inicial, la que divide el nodo raíz. A veces cambiándola manualmente se pueden obtener mejores resultados (o más significativos en el dominio del problema) que dejando que la seleccione automáticamente el algoritmo.
- Acepta variables de entrada de tipo categórico y/o numérico.
- No es afectado por los outliers.