Pregunta

Estoy haciendo algunos problemas en una aplicación del bosque de árbol de decisión / aleatorio. Estoy tratando de adaptarse a un problema que tiene números, así como cadenas (como el nombre del país) como características. Ahora la biblioteca, scikit-learn toma solamente números como parámetros, pero quiero para inyectar las cuerdas, así como que llevar una cantidad significativa de conocimiento.

¿Cómo manejo este escenario?

Me puede convertir una cadena de números por algún mecanismo, como hash en Python. Pero me gustaría saber la mejor práctica de cómo se manejan las cadenas en los problemas de árboles de decisión.

¿Fue útil?

Solución

En la mayoría de los sistemas de aprendizaje automático bien establecidas, las variables categóricas se manejan de forma natural. Por ejemplo en I se usaría factores, en WEKA que utilizaría las variables nominales. Este no es el caso en scikit-learn. Los árboles de decisión implementados en scikit-learn utilice sólo características numéricas y estas características se interpretan siempre como continuos variables numéricas .

Por lo tanto, la simple sustitución de las cuerdas con un código hash debe ser evitado, ya que se considera como una característica numérica continua ningún tipo de codificación que va a utilizar inducirá un orden que simplemente no existe en los datos.

Un ejemplo es el código [ 'rojo', 'verde', 'azul'] con [1,2,3], produciría cosas extrañas como 'rojo' es menor que 'azul', y si el promedio 'rojo' y una 'azul' obtendrá un 'verde'. Otro ejemplo más sutil puede ocurrir cuando el código [ 'bajo', 'medio', 'alto'] con [1,2,3]. En este último caso podría pasar a tener un orden que tiene sentido, sin embargo, algunas inconsistencias sutiles podrían ocurrir cuando 'medio' en no en el medio de 'bajo' y 'alto'.

Por último, la respuesta a sus mentiras de interrogación en la codificación de la función categórica en características múltiples binarios . Por ejemplo, es posible que el código [ 'rojo', 'verde', 'azul'] con 3 columnas, una para cada categoría, que tienen de 1 cuando la categoría de partido y 0 en caso contrario. Esto se llama uno en caliente que codifica , la codificación binaria, uno-de-k-codificación o lo que sea. Puede comprobar la documentación aquí para codificación categórica características y extracción de características - hash y predice . Obviamente uno-hot-codificación ampliará sus necesidades de espacio y, a veces me duele el rendimiento también.

Otros consejos

Se necesita codificar sus cadenas como características numéricas que ciencia-kit puede utilizar para los algoritmos de LD. Esta funcionalidad se maneja en el módulo de procesamiento previo (por ejemplo, véase sklearn.preprocessing.LabelEncoder para un ejemplo).

Por regla general deberá codificar uno en caliente variables categóricas para scikit-learn modelos, incluyendo bosque aleatorio. bosque al azar a menudo trabajan bien sin que codifica uno-caliente, pero por lo general funciona mejor si lo hace codificar una sola caliente. variables "dummying" One-caliente codificación y 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 "Más allá de una sola caliente" en KDnuggets hace un gran trabajo de explicar por qué es necesario codificar las variables categóricas y alternativas para una sola codificación caliente.

Hay implementaciones alternativas de bosque aleatorio que no requieren codificación de una sola caliente tal como R o H2O. La aplicación en la que R es computacionalmente caro y no funcionará si sus funciones tienen muchas categorías . H2O trabajará con un gran número de categorías. Continuum ha hecho H2O disponibles en Anaconda Python.

Hay un esfuerzo continuo hacer scikit-learn categórica mango funciones directamente .

Este artículo tiene una explicación del algoritmo utilizado en H2O. Se hace referencia al documento académico Un Transmisión de decisión paralela Algoritmo del árbol y una versión ya del mismo papel.

Actualización 2018!

Se puede crear un espacio de incrustación (densa vector) para sus variables categóricas. Muchos de ustedes están familiarizados con word2vec y fastext, que incrustar palabras en un espacio denso de vectores significativa. La misma idea aquí-- las variables categóricas se asignarán a un vector con un poco de sentido.

Desde el Guo / Berkhahn papel :

Entidad incrustación no sólo reduce el uso de memoria y acelera neuronal redes en comparación con la codificación de una sola caliente, pero lo más importante por mapeo de valores similares cerca uno del otro en el espacio incrustarlo revela las propiedades intrínsecas de las variables categóricas. Nosotros aplicado con éxito en un concurso reciente Kaggle y fueron capaces para llegar a la tercera posición con las características relativas simples.

Los autores encontraron que la representación de las variables categóricas de esta manera mejorar la eficacia de toda maquina de algoritmos probados, incluyendo los bosques al azar de aprendizaje.

El mejor ejemplo podría ser la aplicación de la de Pinterest técnica al grupo relacionado Pins:

introducir descripción de la imagen aquí

La gente de fastai han implementado incrustaciones categóricas y ha creado una muy buena el blog publicar con el compañero demostración portátil .

Más detalles y explicación

Una red neural se utiliza para crear el incrustaciones es decir, asignar un vector para cada valor categórico. Una vez que tenga los vectores, es posible utilizarlos en cualquier modelo que acepta valores numéricos. Cada componente del vector se convierte en una variable de entrada. Por ejemplo, si se ha utilizado vectores 3-D para integrar su lista de categoría de los colores, es posible obtener algo como: rojo = (0, 1,5, -2,3), azul = (1, 1, 0), etc. Se podría utilizar tres variables de entrada en el bosque al azar correspondientes a los tres componentes. Para cosas rojas, c1 = 0, c2 = 1,5, y c3 = -2,3. Para las cosas azules, c1 = 1, c2 = 1, y c3 = 0.

No realmente necesidad para utilizar una red neuronal para crear incrustaciones (aunque no recomiendo rehuir de la técnica). Eres libre de crear sus propias incrustaciones a mano o por otros medios, siempre que sea posible. Algunos ejemplos:

  1. Mapa colores RGB a vectores.
  2. Las posiciones del mapa a vectores de latitud / longitud.
  3. En un modelo de política EE.UU., mapa ciudades a algunos componentes del vector que representa la izquierda de alineación / derecha, carga fiscal, etc.

Se puede utilizar ficticia variables en tales escenarios. Con panda.get_dummies de Panda puede crear variables ficticias para las cadenas que desea poner en árbol de decisión o Random Forest.

Ejemplo:

import pandas as pd
d = {'one' : pd.Series([1., 2., 3.,4.], index=['a', 'b', 'c','d']),'two' :pd.Series(['Paul', 'John', 'Micheal','George'], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)

df_with_dummies= pd.get_dummies(df,columns=["two"],drop_first=False)
df_with_dummies

convertirlas en números, por ejemplo para cada país único assingn un número único (como 1,2,3 y ...)

También te No necesidad de uso Uno-caliente Codificación (aka las variables ficticias) cuando se trabaja con los bosques al azar, ya que los árboles no hacen un trabajo como otro algoritmo ( tales como lineales / regresión logística) y no lo hacen por trabajo a distancia (que trabajan con la búsqueda de un buen partido para sus características), de modo nO NECESITA para One-caliente codificación

Licenciado bajo: CC-BY-SA con atribución
scroll top