Codificación de variables categóricas utilizando la estimación de probabilidad

22

Estoy tratando de entender cómo puedo codificar variables categóricas usando la estimación de probabilidad, pero hasta ahora he tenido poco éxito.

Cualquier sugerencia sería muy apreciada.

enano pequeño
fuente
¿Qué hacer durante el tiempo de predicción cuando no tenemos una etiqueta de destino?
Ranjeet Singh

Respuestas:

24

También estaba aprendiendo este tema, y ​​esto es lo que encontré:

  • Este tipo de codificación se denomina codificación de probabilidad , codificación de impacto o codificación de destino

  • La idea es codificar su variable categórica con el uso de la variable objetivo (continua o categórica dependiendo de la tarea). Por ejemplo, si tiene una tarea de regresión, puede codificar su variable categórica con la media del objetivo. Para cada categoría, calcula la media correspondiente del objetivo (entre esta categoría) y reemplaza el valor de una categoría con esta media.

  • Si tiene una tarea de clasificación, calcula la frecuencia relativa de su objetivo con respecto a cada valor de categoría.

  • Desde un punto de vista matemático, esta codificación significa una probabilidad de su objetivo, condicional en cada valor de categoría.

  • Si lo hace de una manera simple, como describí anteriormente, probablemente obtendrá una estimación sesgada. Es por eso que en la comunidad de Kaggle usualmente usan 2 niveles de validación cruzada. Lea este comentario de raddar aquí . El cuaderno correspondiente está aquí .

La frase:

Está tomando el valor medio de y. Pero no es simple, sino en validación cruzada dentro de la forma de validación cruzada;

Digamos que tenemos una validación cruzada de 20 veces. de alguna manera, necesitamos calcular el valor medio de la función para # 1 veces usando información de # 2 # 20 veces solamente.

Entonces, toma los pliegues # 2- # 20, crea otro conjunto de validación cruzada dentro de él (lo hice 10 veces). calcule las medias para cada pliegue de dejar uno afuera (al final obtendrá 10 medias). Usted promedia estos 10 medios y aplica ese vector para su conjunto de validación # 1 primario. Repita eso para los 19 pliegues restantes.

Es difícil de explicar, difícil de entender y dominar :) Pero si se hace correctamente, puede traer muchos beneficios :)

  • Otra implementación de esta codificación está aquí .

  • En R library vtreat tienen implementación de codificación de impacto. Ver este post .

  • En la biblioteca CatBoost tienen muchas opciones para la codificación de variables categóricas, incluida la codificación de destino.

  • No existe tal codificación en sklearn todavía.

Galina Alperovich
fuente
1
Hay codificación de destino en codificadores de categoría Sklearn-contrib
josh
¿Cómo implementaría la interacción de características en caso de que use la codificación de destino? Por ejemplo, usted codifica como objetivo F1 y F2. ¿Simplemente multiplicaría los valores codificados F1 * F2?
Michael Larionov
Si calcula la media para cada LOO veces, entonces toma el promedio de ellas, es exactamente lo mismo que está tomando la media de # 2- # 20 veces, no veo por qué esto puede considerarse como CV. Tampoco entiendo lo que quiere decir con "vector" cuando promedia esos 10 medios.
SiXUlm
Un comentario tardío; la codificación de destino en los codificadores de categoría es una codificación media simple; no realiza la regularización de pliegues dentro de pliegues descrita por raddar.
Dan Scally
7

La codificación de destino ahora está disponible en sklearn a través del paquete category_encoders.

Codificador de destino

clase category_encoders.target_encoder.TargetEncoder (verbose = 0, cols = None, drop_invariant = False, return_df = True, impute_missing = True, handle_unknown = 'impute', min_samples_leaf = 1, suavizado = 1)

Target Encode para características categóricas. Basado en el enfoque de dejar uno fuera.

Como señaló josh en el comentario anterior.

jeffhale
fuente
1

La codificación de probabilidad aún no está disponible en scikit learn. Puede hacerlo creando un diccionario y luego hacer una función de reemplazo.

dict1 = {'cate1':1,'cate2':1,'cate3':2,'cate4':2}
for i in df.shape[0]:
    df.iloc[i] = dict1[df.iloc[i]] 
chrisckwong821
fuente