Opciones de manejo de características categóricas de Catboost (configuración de CTR)

11

Estoy trabajando con un conjunto de datos con una gran cantidad de características categóricas (> 80%) que predicen una variable objetivo continua (es decir, Regresión). He estado leyendo bastante sobre formas de manejar características categóricas. Y aprendí que la codificación única que he estado usando en el pasado es una muy mala idea, especialmente cuando se trata de muchas características categóricas con muchos niveles (lea esta publicación y esto ).

Si bien he encontrado métodos como la codificación basada en objetivos (suavizado) de características categóricas a menudo basadas en la media de los valores objetivo para cada característica, tal vez esta publicación / núcleo en Kaggle. Todavía estoy luchando por encontrar una forma más concreta hasta que encontré CatBoost, un gradiente de código abierto que aumenta los árboles de decisión lanzados el año pasado por el grupo Yandex. Parecen ofrecer opciones adicionales de conteo estadístico para características categóricas, probablemente mucho más eficientes que la simple codificación o suavizado de una sola vez.

El problema es que la documentación no es útil para establecer la configuración de CTR . He intentado diferentes formas pero simplemente no funciona. El documento dice que la configuración de CTR es simple_ctr , que se dará como ( sección de configuración de CTR ):

['CtrType[:TargetBorderCount=BorderCount][:TargetBorderType=BorderType][:CtrBorderCount=Count][:CtrBorderType=Type][:Prior=num_1/denum_1]..[:Prior=num_N/denum_N]',
 'CtrType[:TargetBorderCount=BorderCount][:TargetBorderType=BorderType][:CtrBorderCount=Count][:CtrBorderType=Type][:Prior=num_1/denum_1]..[:Prior=num_N/denum_N]',
  ...]

Aquí hay un ejemplo súper simple, los datos se ven así:

import pandas as pd
import catboost
data = [{'profit': '342','country': 'holland','account': 'Jones LLC', 'saving': 150, 'debt': -60, 'age': 28},
         {'profit': '875','country': 'germany','account': 'Alpha Co',  'saving': 200, 'debt': -10, 'age': 42},
         {'profit': '127','country': 'italy','account': 'Blue Inc',  'saving': 50,  'debt': -300,  'age': 38 }]
df = pd.DataFrame(data)

Aquí hay un simple Regresor Catboost:

X_train = df.drop(['profit'],axis=1)
Y_train = df['profit']
categorical_features_indices = [0,2]

train_pool = catboost.Pool(X_train, Y_train, cat_features=categorical_features_indices)

model = catboost.CatBoostRegressor(
    depth=3,
    iterations=5,
    eval_metric='RMSE',
    simple_ctr=None)

model.fit(train_pool);

¡ Simple_ctr , una de las configuraciones de CTR, es el problema! Es una pena porque parece que el paquete ofrece varios métodos, hasta ahora no hay forma de acceder a ellos.

ACTUALIZACIÓN 9 de agosto de 2018: Hace unos días le planteé este problema al desarrollador de Catboost, mira aquí , y le abrieron un ticket para proporcionar un tutorial.

Pingüinos Gemelos
fuente
Aquí está la descripción sobre catboost en categórica vaiable
DiveIntoML
Sí, conozco el enlace; Da una descripción teórica detallada. Sin embargo, no se proporciona una descripción suficiente sobre cómo usarlo; Me refiero a instrucciones prácticas de uso. Lo intenté hace unos meses y no fue sencillo.
TwinPenguins
1
Actualmente solo estoy usando el parámetro one_hot_max_size y entiendo que todo lo que no esté codificado en caliente, se codificará utilizando la codificación de expansión media objetivo. Espero con interés la documentación oficial adicional para comprender mejor la configuración de ctr y cómo puedo jugar con ellos.
Garima Jain

Respuestas:

2

Descubrí que para establecer los ctrparámetros y todos los componentes uno debe pasar una lista de cadenas, cada cadena debe contener el ctrTypey uno de sus componentes:

  • La primera palabra de la cadena debe ser, ctrTypepor ejemplo, Borders:(haga clic aquí para ver los parámetros de catboost)
  • Entonces un componente de la ctrTypedebe seguir. Por ejemplo TargetBorderType=5.
  • Todos juntos 'Borders:TargetBorderType=5'.
  • Repita el procedimiento para configurar otro componente y agregue la nueva cadena a la lista.

Ejemplo con dos componentes establecidos:

simple_ctr = ['Borders:TargetBorderType=Uniform', 'Borders:TargetBorderCount=50']
Giannis Krilis
fuente
Funciona, gracias por la explicación, y perdón por tomarme un tiempo para volver a revisarlo, aunque se me pasó por la cabeza.
TwinPenguins
1

¿Intentó usar el formato proporcionado a continuación?

['CtrType[:TargetBorderCount=BorderCount][:TargetBorderType=BorderType][:CtrBorderCount=Count][:CtrBorderType=Type][:Prior=num_1/denum_1]..[:Prior=num_N/denum_N]'

['BinarizedTargetMeanValue[:TargetBorderCount=1][:TargetBorderType=Uniform][:CtrBorderCount=5][:CtrBorderType=Uniform][:Prior=1]']
Programador Interesado
fuente
¿Es esta una respuesta? Se siente más como una pregunta / comentario.
Stephen Rauch
@Interested_Programmer: No funciona, pruébalo tú mismo en el ejemplo que acabo de proporcionar. ¿Lo ha probado o simplemente lo encontró en la documentación?
TwinPenguins
Me disculpo @StephenRauch. No pude ejecutar mi computadora portátil, pero me pareció utilizable en otras funciones para seguir el formato. En retrospectiva, debería haberlo agregado como comentario. También estoy esperando que los creadores publiquen el nuevo tutorial.
Interested_Programmer
1
También esto funciona. simple_ctr = ['BinarizedTargetMeanValue'])
Interested_Programmer
1
Gracias. Pero, como ha demostrado, solo funciona como simple_ctr = ['BinarizedTargetMeanValue'])! Las otras opciones no se pueden alimentar como [: TargetBorderCount = BorderCount] etc. Si sabe cómo alimentar a otros junto con CtrType, hágamelo saber.
TwinPenguins