Opções categóricas de manipulação de recursos categóricos do Catboost (configurações de CTR)?


11

Estou trabalhando com um conjunto de dados com grande número de recursos categóricos (> 80%) prevendo uma variável de destino contínua (ou seja, Regressão). Eu tenho lido bastante sobre maneiras de lidar com recursos categóricos. E aprendi que a codificação one-hot que eu tenho usado no passado é uma péssima idéia, especialmente quando se trata de muitos recursos categóricos com muitos níveis (leia estas postagens , e isso ).

Enquanto eu me deparei com métodos como a codificação com base em destino (suavização) de recursos categóricos, geralmente com base na média dos valores de destino para cada recurso, talvez este post / kernel no Kaggle. Ainda estou lutando para encontrar uma maneira mais concreta até encontrar o CatBoost um gradiente de código aberto que aumenta as árvores de decisão lançadas no ano passado pelo grupo Yandex. Eles parecem oferecer opções extras de contagem estatística para recursos categóricos, provavelmente muito mais eficientes do que a codificação ou suavização simples.

O problema é que a documentação não é útil para definir as configurações da CTR . Eu tentei maneiras diferentes, mas simplesmente não funciona. O documento informa a configuração da CTR como simple_ctr , a ser fornecida como ( seção de configuração da 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]',
  ...]

Aqui está um exemplo super simples, os dados são assim:

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)

Aqui está um simples Regressor 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);

O simple_ctr , uma das configurações da CTR, é o problema! É uma pena, porque parece que o pacote oferece vários métodos, até agora não há maneira de acessá-los.

ATUALIZAÇÃO 9 de agosto de 2018: Alguns dias atrás, levantei esse problema para o desenvolvedor do Catboost, veja aqui , e eles abriram um ticket para fornecer um tutorial.


Aqui está a descrição sobre catboost em categórica vaiable: tech.yandex.com/catboost/doc/dg/concepts/...
DiveIntoML

Sim, eu conheço o link; fornece uma descrição teórica detalhada. Ainda não é dada descrição suficiente sobre como usá-lo; Quero dizer instruções práticas de uso. Eu tentei há alguns meses e não era simples.
TwinPenguins

1
Atualmente, estou usando apenas o parâmetro one_hot_max_size e meu entendimento é que tudo o que não é um codificado a quente será codificado usando a codificação de expansão de média de destino. Estou ansioso pela documentação oficial adicional para entender melhor as configurações do ctr e como posso brincar com elas.
Garima Jain 13/03/19

Respostas:


2

Eu descobri que, para definir os ctrparâmetros e todos os componentes, deve-se passar uma lista de strings, cada string deve conter oe ctrTypeum de seus componentes:

  • A primeira palavra da string deve ser ctrTypepor exemplo Borders:(clique aqui para obter os parâmetros de catboost)
  • Em seguida, um componente do ctrTypedeve seguir. Por exemplo TargetBorderType=5.
  • Todos juntos 'Borders:TargetBorderType=5'.
  • Repita o procedimento para definir um outro componente e adicione a nova string à lista.

Exemplo com conjunto de dois componentes:

simple_ctr = ['Borders:TargetBorderType=Uniform', 'Borders:TargetBorderCount=50']

Funciona, obrigado pela explicação, e desculpe-me por demorar muito para voltar a checá-la, escapou da minha mente.
TwinPenguins 04/04

1

Você tentou usar o formato fornecido como abaixo:

['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]']

Isso é uma resposta? Parece mais uma pergunta / comentário.
Stephen Rauch

@ Programador Interesse: Não funciona, tente você mesmo no exemplo que acabei de fornecer. Você já testou ou simplesmente encontrou na documentação?
TwinPenguins

Peço desculpas @StephenRauch. Não consegui executar meu notebook, mas achei útil em outras funções seguir o formato. Em retrospectiva, eu deveria ter adicionado isso como um comentário. Também estou esperando os criadores lançar o novo tutorial.
Interested_Programmer

1
também isso funciona. simple_ctr = ['BinarizedTargetMeanValue']))
Interested_Programmer

1
Obrigado. Mas como você mostrou, ele funciona apenas como simple_ctr = ['BinarizedTargetMeanValue'])! As outras opções não podem ser alimentadas como [: TargetBorderCount = BorderCount] etc. Se você souber como alimentar outras pessoas com o CtrType, informe-me.
TwinPenguins
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.