Tengo un problema de clasificación de aprendizaje automático con 80% de variables categóricas. ¿Debo usar una codificación activa si quiero usar algún clasificador para la clasificación? ¿Puedo pasar los datos a un clasificador sin la codificación?
Estoy tratando de hacer lo siguiente para la selección de funciones:
Leí el archivo del tren:
num_rows_to_read = 10000 train_small = pd.read_csv("../../dataset/train.csv", nrows=num_rows_to_read)
Cambio el tipo de características categóricas a 'categoría':
non_categorial_features = ['orig_destination_distance', 'srch_adults_cnt', 'srch_children_cnt', 'srch_rm_cnt', 'cnt'] for categorical_feature in list(train_small.columns): if categorical_feature not in non_categorial_features: train_small[categorical_feature] = train_small[categorical_feature].astype('category')
Yo uso una codificación en caliente:
train_small_with_dummies = pd.get_dummies(train_small, sparse=True)
El problema es que la tercera parte a menudo se atasca, aunque estoy usando una máquina fuerte.
Por lo tanto, sin la codificación activa no puedo hacer ninguna selección de funciones para determinar la importancia de las funciones.
¿Que recomiendas?
drop_first=True
conget_dummies
elimina la necesidad de soltar la columna original por separadoMucho más fácil de usar Pandas para la codificación básica en caliente. Si está buscando más opciones, puede usar
scikit-learn
.Para la codificación básica de un solo uso con Pandas , simplemente pase su marco de datos a la función get_dummies .
Por ejemplo, si tengo un marco de datos llamado imdb_movies :
... y quiero codificar en caliente la columna Calificado, simplemente hago esto:
Esto devuelve un nuevo
dataframe
con una columna para cada " nivel " de calificación que existe, junto con un 1 o 0 que especifica la presencia de esa calificación para una observación dada.Por lo general, queremos que esto sea parte del original
dataframe
. En este caso, simplemente adjuntamos nuestro nuevo marco codificado ficticio al marco original usando " enlace de columna " .Podemos enlazar columnas usando la función concat de Pandas :
Ahora podemos ejecutar un análisis completo
dataframe
.FUNCIÓN DE UTILIDAD SIMPLE
Recomiendo que se haga una función de utilidad para hacer esto rápidamente:
Uso :
Resultado :
Además, según el comentario de @pmalbu, si desea que la función elimine el feature_to_encode original , use esta versión:
Puede codificar varias funciones al mismo tiempo de la siguiente manera:
fuente
Puede hacerlo con
numpy.eye
y utilizando el mecanismo de selección de elementos de matriz:El valor de retorno de
indices_to_one_hot(nb_classes, data)
es ahoraEl
.reshape(-1)
está ahí para asegurarse de que tiene el formato de las etiquetas de derecha (que también podría tener[[2], [3], [4], [0]]
).fuente
En primer lugar, la forma más fácil de una codificación activa: usar Sklearn.
http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html
En segundo lugar, no creo que usar pandas para una codificación en caliente sea tan simple (aunque sin confirmar)
Crear variables ficticias en pandas para python
Por último, ¿es necesario que codifiques en caliente? Una codificación activa aumenta exponencialmente el número de características, aumentando drásticamente el tiempo de ejecución de cualquier clasificador o cualquier otra cosa que vaya a ejecutar. Especialmente cuando cada característica categórica tiene muchos niveles. En cambio, puedes hacer una codificación ficticia.
El uso de la codificación ficticia generalmente funciona bien, por mucho menos tiempo de ejecución y complejidad. Un sabio profesor una vez me dijo: 'Menos es más'.
Aquí está el código para mi función de codificación personalizada si lo desea.
EDITAR: Comparación para ser más claro:
Codificación única: convierta n niveles en n-1 columnas.
Puede ver cómo esto explotará su memoria si tiene muchos tipos (o niveles) diferentes en su función categórica. Tenga en cuenta que esto es solo UNA columna.
Codificación ficticia:
Convierte a representaciones numéricas en su lugar. Ahorra mucho espacio de funciones, a costa de un poco de precisión.
fuente
mouse > cat > dog
pero este no es el caso.get_dummies
es la forma más directa de transferir variables categóricas a datos amigables del modelo desde mi experiencia (aunque muy limitada)Una codificación activa con pandas es muy fácil:
EDITAR:
Otra forma de one_hot usando sklearn's
LabelBinarizer
:fuente
Puede usar la función numpy.eye.
Resultado
fuente
pandas como tiene la función incorporada "get_dummies" para obtener una codificación activa de esa columna / s en particular.
un código de línea para una codificación en caliente:
fuente
Aquí hay una solución usando
DictVectorizer
elDataFrame.to_dict('records')
método Pandas .fuente
La codificación en caliente requiere un poco más que convertir los valores en variables indicadoras. Normalmente, el proceso de ML requiere que aplique esta codificación varias veces a los conjuntos de datos de validación o prueba y que aplique el modelo que construye a los datos observados en tiempo real. Debe almacenar la asignación (transformación) que se utilizó para construir el modelo. Una buena solución usaría
DictVectorizer
oLabelEncoder
(seguido deget_dummies
. Aquí hay una función que puede usar:Esto funciona en un marco de datos de pandas y para cada columna del marco de datos que crea y devuelve una asignación. Entonces lo llamarías así:
Luego, en los datos de prueba, la llamada se realiza pasando el diccionario devuelto de la capacitación:
Un método equivalente es usar
DictVectorizer
. Una publicación relacionada sobre el mismo está en mi blog. Lo menciono aquí, ya que proporciona algún razonamiento detrás de este enfoque sobre el simple uso de la publicación get_dummies (divulgación: este es mi propio blog).fuente
Puede pasar los datos al clasificador catboost sin codificación. Catboost maneja las variables categóricas por sí mismo al realizar una codificación media expansiva de destino y objetivo.
fuente
Puedes hacer lo siguiente también. Tenga en cuenta lo siguiente que no tiene que usar
pd.concat
.También puede cambiar columnas explícitas a categóricas. Por ejemplo, aquí estoy cambiando el
Color
yGroup
fuente
Sé que llego tarde a esta fiesta, pero la forma más sencilla de codificar en caliente un marco de datos de forma automática es utilizar esta función:
fuente
Usé esto en mi modelo acústico: probablemente esto ayude en su modelo.
fuente
Para agregar a otras preguntas, déjenme proporcionarles cómo lo hice con una función de Python 2.0 usando Numpy:
La línea
n_values = np.max(y_) + 1
podría estar codificada para que use la buena cantidad de neuronas en caso de que use mini lotes por ejemplo.Proyecto de demostración / tutorial donde se ha utilizado esta función: https://github.com/guillaume-chevalier/LSTM-Human-Activity-Recognition
fuente
Esto funciona para mi:
Salida:
fuente
Puede y debe ser fácil como:
Uso:
fuente
Ampliando la respuesta de @Martin Thoma
fuente
Respuesta corta
Aquí hay una función para hacer una codificación en caliente sin usar numpy, pandas u otros paquetes. Toma una lista de enteros, booleanos o cadenas (y quizás otros tipos también).
Ejemplo:
Respuesta larga (er)
Sé que ya hay muchas respuestas a esta pregunta, pero noté dos cosas. Primero, la mayoría de las respuestas usan paquetes como numpy y / o pandas. Y esto es algo bueno. Si está escribiendo código de producción, probablemente debería usar algoritmos rápidos y robustos como los que se proporcionan en los paquetes numpy / pandas. Pero, por el bien de la educación, creo que alguien debería proporcionar una respuesta que tenga un algoritmo transparente y no solo una implementación del algoritmo de otra persona. En segundo lugar, me di cuenta de que muchas de las respuestas no proporcionan una implementación robusta de la codificación de uno en caliente porque no cumplen uno de los requisitos a continuación. A continuación se detallan algunos de los requisitos (tal como los veo) para una función de codificación única, útil, precisa y robusta:
Una función de codificación única debe:
Probé muchas de las respuestas a esta pregunta y la mayoría de ellas fallaron en uno de los requisitos anteriores.
fuente
Prueba esto:
df_encoded.head ()
El marco de datos resultante
df_train_encoded
es el mismo que el original, pero las características categóricas ahora se reemplazan con sus versiones codificadas en caliente.Más información
category_encoders
aquí .fuente
Aquí probé con este enfoque:
fuente