Estoy haciendo algunos problemas en una aplicación de árbol de decisión / bosque aleatorio. Estoy tratando de ajustar un problema que tiene números y cadenas (como el nombre del país) como características. Ahora, la biblioteca, scikit-learn toma solo números como parámetros, pero quiero inyectar las cadenas y llevar una gran cantidad de conocimiento.
¿Cómo manejo tal escenario?
Puedo convertir una cadena a números mediante algún mecanismo, como el hash en Python. Pero me gustaría conocer la mejor práctica sobre cómo se manejan las cadenas en los problemas del árbol de decisiones.
machine-learning
python
scikit-learn
random-forest
decision-trees
user3001408
fuente
fuente
Respuestas:
En la mayoría de los sistemas de aprendizaje automático bien establecidos, las variables categóricas se manejan de forma natural. Por ejemplo, en R usaría factores, en WEKA usaría variables nominales. Este no es el caso en scikit-learn. Los árboles de decisión implementados en scikit-learn usan solo características numéricas y estas características se interpretan siempre como variables numéricas continuas .
Por lo tanto, se debe evitar simplemente reemplazar las cadenas por un código hash, ya que al ser considerado como una característica numérica continua, cualquier codificación que utilice inducirá un orden que simplemente no existe en sus datos.
Un ejemplo es codificar ['rojo', 'verde', 'azul'] con [1,2,3], produciría cosas extrañas como 'rojo' es más bajo que 'azul', y si promedia un 'rojo' y un "azul" obtendrá un "verde". Otro ejemplo más sutil puede suceder cuando codifica ['bajo', 'medio', 'alto'] con [1,2,3]. En el último caso, puede ocurrir que tenga un orden que tenga sentido, sin embargo, pueden ocurrir algunas inconsistencias sutiles cuando 'medio' no está en el medio de 'bajo' y 'alto'.
Finalmente, la respuesta a su pregunta radica en codificar la característica categórica en múltiples características binarias . Por ejemplo, puede codificar ['rojo', 'verde', 'azul'] con 3 columnas, una para cada categoría, con 1 cuando la categoría coincide y 0 en caso contrario. Esto se llama codificación en caliente, codificación binaria, codificación uno de k o lo que sea. Puede consultar la documentación aquí para codificar características categóricas y extracción de características: hash y dictos . Obviamente, una codificación en caliente expandirá sus requisitos de espacio y, a veces, también perjudica el rendimiento.
fuente
Debe codificar sus cadenas como características numéricas que sci-kit puede usar para los algoritmos ML. Esta funcionalidad se maneja en el módulo de preprocesamiento (por ejemplo, consulte sklearn.preprocessing.LabelEncoder para ver un ejemplo).
fuente
Por lo general, debe codificar de forma activa variables categóricas para los modelos de aprendizaje de scikit, incluido el bosque aleatorio. El bosque aleatorio a menudo funcionará bien sin una codificación de un solo uso, pero generalmente funciona mejor si realiza una codificación de un solo uso. Las variables de codificación única y "dummying" significan lo mismo en este contexto. Scikit-learn tiene sklearn.preprocessing.OneHotEncoder y Pandas tiene pandas.get_dummies para lograr esto.
Sin embargo, hay alternativas. El artículo "Beyond One-Hot" en KDnuggets hace un gran trabajo al explicar por qué necesita codificar variables categóricas y alternativas a la codificación one-hot.
Hay implementaciones alternativas de bosque aleatorio que no requieren codificación de un solo uso, como R o H2O. La implementación en R es computacionalmente costosa y no funcionará si sus características tienen muchas categorías . H2O funcionará con un gran número de categorías. Continuum ha hecho que H2O esté disponible en Anaconda Python.
Hay un esfuerzo continuo para hacer que scikit-learn maneje las características categóricas directamente .
Este artículo tiene una explicación del algoritmo utilizado en H2O. Hace referencia al documento académico A Streaming Parallel Decision Tree Algorithm y una versión más larga del mismo documento.
fuente
¡Actualización 2018!
Puede crear un espacio de incrustación (vector denso) para sus variables categóricas. Muchos de ustedes están familiarizados con word2vec y fastext, que incorporan palabras en un espacio vectorial denso y significativo. La misma idea aquí: sus variables categóricas se asignarán a un vector con algún significado.
Del documento Guo / Berkhahn :
Los autores descubrieron que representar variables categóricas de esta manera mejoraba la efectividad de todos los algoritmos de aprendizaje automático probados, incluido el bosque aleatorio.
El mejor ejemplo podría ser la aplicación de Pinterest de la técnica para agrupar Pines relacionados:
La gente de fastai ha implementado incrustaciones categóricas y ha creado una publicación de blog muy agradable con el cuaderno de demostración complementario .
Detalles adicionales y explicación
Se utiliza una red neuronal para crear las incrustaciones, es decir, asignar un vector a cada valor categórico. Una vez que tenga los vectores, puede usarlos en cualquier modelo que acepte valores numéricos. Cada componente del vector se convierte en una variable de entrada. Por ejemplo, si usó vectores tridimensionales para incrustar su lista categórica de colores, podría obtener algo como: rojo = (0, 1.5, -2.3), azul = (1, 1, 0) etc. Utilizaría tres ingrese variables en su bosque aleatorio correspondiente a los tres componentes. Para las cosas rojas, c1 = 0, c2 = 1.5 y c3 = -2.3. Para las cosas azules, c1 = 1, c2 = 1 y c3 = 0.
En realidad, no necesita usar una red neuronal para crear incrustaciones (aunque no recomiendo alejarse de la técnica). Usted es libre de crear sus propias incrustaciones a mano u otros medios, cuando sea posible. Algunos ejemplos:
fuente
(0, 1.5, -2.3)
, azul =(1, 1, 0)
etc. Utilizaría tres variables de entrada en su bosque aleatorio correspondientes a los tres componentes. Para las cosas rojas, c1 = 0, c2 = 1.5 y c3 = -2.3. Para cosas azules, c1 = 1, c2 = 1 y c3 = 0.Puede usar variables ficticias en tales escenarios. Con los pandas,
panda.get_dummies
puede crear variables ficticias para las cadenas que desea colocar en el Árbol de decisión o en el Bosque aleatorio.Ejemplo:
fuente
Conviértalos en números, por ejemplo para cada país único asignando un número único (como 1,2,3 y ...)
Además, no es necesario utilizar la codificación en caliente (también conocida como variables ficticias) cuando se trabaja con bosque aleatorio, porque los árboles no funcionan como otro algoritmo (como la regresión lineal / logística) y no funcionan a distancia (ellos trabaje con la búsqueda de una buena división para sus características), por lo que NO NECESITA una codificación de uno en caliente
fuente