É uma pergunta muito boa; de fato, esse problema existe há algum tempo e ainda não encontrei a solução perfeita. Ainda mais do que feliz em compartilhar minha experiência:
- Evite a codificação one-hot , tanto quanto possível (ao contrário do que foi sugerido acima). O raciocínio é que não vai funcionar. Um modelo com recursos de codificação de um só funciona somente quando todos esses subníveis existiam nos dados de treinamento. O modelo não poderá fazer previsões, a menos que, de alguma forma, seja ajustado manualmente. Se você pesquisar, encontrará muitas pessoas que enfrentaram esse problema ao dividir seus dados em treinamento / teste e enfrentaram o problema de alguns subníveis de um recurso específico que não estavam presentes no grupo de treinamento e, posteriormente, falharam em fazer a previsão no teste. Dito isso, se você tiver recursos cardinais muito altos (talvez como sua cidade com, digamos, 200 nomes de cidades), isso aumentará a dimensionalidade de seus dados desnecessariamente! Se, por algum motivo, você precisar fazer a codificação one-hot, lembre-se disso.
Use outros métodos de codificação . Talvez tente aprender mais sobre outros métodos que são robustos para esse problema, pelo menos por enquanto, como codificação com base em destino, hash (consulte algumas referências abaixo). Se você estiver com Python, há uma boa oferta de pacote para manter as opções de codificação. Você pode se surpreender ao ver que outros métodos simples geralmente funcionam muito bem.
Treine novamente o seu modelo . Teoricamente, ao aprender o seu trem / conjunto, deveria ter a mesma distribuição (principalmente isso é considerado distribuição de destino, mas também pode ser verdade sobre variáveis). Agora, com novos itens, a distribuição de dados do seu teste (invisível) mudou. Então é melhor treinar novamente o modelo para que essas novas cidades sejam contabilizadas.
Coloque Subcategorias recém-adicionadas (e menos frequentes) a Outros . Embora o ponto anterior seja verdadeiro teoricamente, é muito provável que a distribuição de teste (dessa categoria específica) não mude drasticamente na maioria dos casos, por exemplo, muito poucos itens ficam no topo das categorias no conjunto de treinamento. Talvez, como no seu caso, você possa ter 100 cidades no recurso da cidade, e pouquíssimas novas surgem com o tempo. O que eu consideraria seria examinar o quantil X de X dessa categoria específica e colocar os menos frequentes na subcategoria Outros . Assumindo que seu ponto de dados recém-adicionado seja apenas pouco, ele será usado em Outrosgrupo. Você certamente perderá um nível de granularidade ao fazer isso, mas mais uma vez o objetivo do aprendizado é que não apenas o seu modelo aprenda os dados do treinamento, mas o mais importante, seja capaz de generalizar muito bem os dados não vistos e se essas novas categorias adicionadas são muitos pontos de dados, agrupá-los completamente no grupo Outros não será prejudicial.
Outras soluções recentes ainda não maduras, como Cat2Vec (emprestado do Word2Vec da NLP) ou Codificação de similaridade . Isso é muito recente, verifique o artigo para o primeiro e seu github e um exemplo (baseado no Word2Vec) no Kaggle, e este artigo para o último e sua implementação . A idéia do primeiro é converter categorias em vetores. Por mais que eu tenha que dizer, realmente faz sentido funcionar, mas não tenho experiência em usá-lo. O último, chamado dirty_cat , parece bastante promissor e fácil de usar. Não é claro se é robusto ter uma categoria cardinal invisível nos dados de seu teste!
PS: Gostaria de acrescentar que a idéia de cidade para uma localização geográfica dada no primeiro comentário é muito boa e, na verdade, não é complicada, pois são muitas API Python, por exemplo, pelo Google ou HERE, que permitem fazer isso. Mas note-se que essa é apenas uma maneira de projetar novos recursos e certamente não deve ser substituída pelo próprio recurso da cidade.
Referências interessantes para verificar primeiro , segundo , terceiro e quarto (nenhuma ordem específica!)
Todos os pontos acima mencionados são soluções práticas bastante concretamente teoricamente corretas e certamente sujeitas a discussões adicionais. E estou mais do que feliz em aprender mais.
city
para um número com base em alguma função? Comocity' = f(latitude, longitude)
assim, você pode criar um novo valor para qualquer cidade