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.