Eu tenho um problema de classificação com dados categóricos e numéricos. O problema que estou enfrentando é que meus dados categóricos não são corrigidos, o que significa que o novo candidato cujo rótulo eu quero prever pode ter uma nova categoria que não foi observada anteriormente.
Por exemplo, se os meus dados categóricos foi sex
, as únicas possíveis rótulos seria female
, male
e other
, não importa o quê. No entanto, minha variável categórica é city
que a pessoa que estou tentando prever tem uma nova cidade que meu classificador nunca viu.
Gostaria de saber se existe uma maneira de fazer a classificação nesses termos ou se devo fazer o treinamento novamente considerando esses novos dados categóricos.
city
para um número com base em alguma função? Comocity' = f(latitude, longitude)
assim, você pode criar um novo valor para qualquer cidadeRespostas:
É 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:
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.
fonte
A coisa mais simples a se fazer (que geralmente é um bom lugar para começar) é apenas codificar as suas cidades com uma hot-hot, onde cada cidade se torna um único recurso e tem valores de 1 (a pessoa é dessa cidade) ou 0 (não de aquela cidade). Se uma nova cidade aparecer em um conjunto de testes que não está presente no conjunto de treinamento, essa pessoa terá apenas 0 para todas as cidades no conjunto de treinamento. Isso pode parecer estranho, mas, se essa cidade não estiver no conjunto de treinamento, não deve haver um peso para uma pessoa daquela cidade.
O próximo passo seria algo parecido com o que Mohammad Athar sugeriu e tenha uma idéia da proximidade geográfica de outras cidades em seu conjunto de treinamento. Isso vai ser muito mais complicado, então deixarei alguém comentar sobre isso.
fonte
Você deve verificar o Vowpal Wabbit , que lida com recursos muito agradáveis usando um truque de hash e taxas de aprendizado adaptáveis.
Além de não travar quando novos recursos aparecerem (no trem ou no teste), ele também começará a atualizar seus pesos. Além disso, é rápido demais. No entanto, apenas implementa variantes do modelo linear, portanto você fica restrito a esse lado. Uma ferramenta muito poderosa para conhecer
fonte