Codificando variáveis ​​categóricas usando estimativa de probabilidade

22

Estou tentando entender como posso codificar variáveis ​​categóricas usando estimativa de probabilidade, mas até agora tive pouco sucesso.

Todas as sugestões serão muito apreciadas.

anão pequeno
fonte
O que fazer durante o tempo de previsão quando não temos um rótulo de destino?
Ranjeet Singh

Respostas:

24

Eu também estava aprendendo esse tópico, e foi o que encontrei:

  • Esse tipo de codificação é chamado de codificação de probabilidade , codificação de impacto ou codificação de destino

  • A ideia é codificar sua variável categórica com o uso da variável de destino (contínua ou categórica, dependendo da tarefa). Por exemplo, se você tiver uma tarefa de regressão, poderá codificar sua variável categórica com a média do destino. Para cada categoria, você calcula a média correspondente da meta (entre essa categoria) e substitui o valor de uma categoria por essa média.

  • Se você tiver uma tarefa de classificação, calcula a frequência relativa do seu objetivo em relação a cada valor de categoria.

  • Do ponto de vista matemático, essa codificação significa uma probabilidade do seu destino, condicional ao valor de cada categoria.

  • Se você fizer isso de uma maneira simples, como descrevi acima, provavelmente obterá uma estimativa tendenciosa. É por isso que na comunidade Kaggle eles costumam usar 2 níveis de validação cruzada. Leia este comentário por raddar aqui . O caderno correspondente está aqui .

A citação:

Está assumindo o valor médio de y. Mas não é claro, mas na validação cruzada da maneira da validação cruzada;

Digamos que tenhamos uma validação cruzada de 20 vezes. precisamos, de alguma maneira, calcular o valor médio do recurso para a dobra nº 1, usando apenas as informações das dobras 2 a 20.

Então, você faz # 2- # 20 dobras, cria outro conjunto de validação cruzada (fiz 10 vezes). calcule as médias para cada dobra excluída (no final, você obtém 10 médias). Você calcula a média desses 10 meios e aplica esse vetor ao seu conjunto de validação principal nº 1. Repita isso para as 19 dobras restantes.

É difícil de explicar, difícil de entender e dominar :) Mas, se feito corretamente, pode trazer muitos benefícios :)

  • Outra implementação dessa codificação está aqui .

  • Na biblioteca R vtreat, eles implementam a codificação de impacto. Veja este post .

  • Na biblioteca CatBoost , existem várias opções para codificação de variável categórica, incluindo codificação de destino.

  • Ainda não existe essa codificação no sklearn.

Galina Alperovich
fonte
1
Não é alvo de codificação em Sklearn-contrib Categoria Codificadores
josh
Como você implementaria a interação de recursos no caso de usar a codificação de destino? Por exemplo, você F1 e F2 codificadas como alvo. Você apenas multiplicaria os valores codificados F1 * F2?
Michael Larionov
Se você calcula a média de cada dobra do LOO e mede a média delas, é exatamente o mesmo que você está fazendo a média da # 2 a # 20 dobra, não vejo por que isso pode ser considerado como CV. Também não entendo o que ele quer dizer com "vetor" quando ele calcula a média desses 10 meios.
SiXUlm 20/02
Um comentário tardio; a codificação de destino nos codificadores de categoria é uma codificação média simples; ele não executa a regularização de dobras dentro de dobras descrita por raddar.
Dan Scally 24/03
7

A codificação de destino está agora disponível no sklearn através do pacote category_encoders.

Codificador de destino

classe category_encoders.target_encoder.TargetEncoder (detalhado = 0, cols = Nenhum, drop_invariant = Falso, return_df = Verdadeiro, impute_missing = Verdadeiro, identificador_conhecido = 'impute', min_samples_leaf = 1, suavização = 1)

Codificação de destino para recursos categóricos. Baseado em deixar uma abordagem de fora.

Como observado por Josh no comentário acima.

jeffhale
fonte
1

A codificação de probabilidade ainda não está disponível no scikit learn. Você pode fazer isso criando um dicionário e, em seguida, execute uma função de substituição.

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