Como posso fazer a classificação com dados categóricos que não são fixos?


10

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, malee other, não importa o quê. No entanto, minha variável categórica é cityque 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.


11
você pode converter citypara um número com base em alguma função? Como city' = f(latitude, longitude)assim, você pode criar um novo valor para qualquer cidade
Mohammad Athar

@MohammadAthar aqui deu a solução perfeita, espero que a OP veja!
Francesco Pegoraro

Respostas:


11

É 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.


11
Que tal criar agrupamentos de cidades semelhantes? Como, mesmo que tenhamos uma nova cidade, ela não é diferente do que já temos, podemos verificar com a cidade correspondente mais próxima?
Aditya

Prazer Aditya. Essa também é outra excelente ideia. Eu não sei sobre a nova "codificação de similaridade", pode ser que eles estejam fazendo exatamente a mesma coisa. Veja o tutorial deles. Além disso, observe que é preciso ter cuidado com o agrupamento a ser usado para dados categóricos como modos-k, afinal todas as suas distâncias não têm significado semelhante aos valores numéricos.
TwinPenguins

Obrigado pela sua ótima resposta. Como eu poderia fazer o treinamento? Quero dizer, imagine que eu tenho um novo candidato e quero prever se ele é bom ou ruim, como eu poderia treinar meu modelo se não tenho o rótulo verdadeiro dele indicando se é bom ou não? Não vejo a maneira de incluir esses novos dados para a reciclagem e perderei o ponto de previsão. Estou errado?
Marisa

Você é bem vindo. Sobre a reciclagem: significa literalmente começar de novo, misturar todos os dados, certificando-se de ter novos dados e começar a aprender novamente. O outro ponto que você mencionou é que não possui o rótulo verdadeiro para esse novo ponto de dados em particular: essa é uma história muito diferente para si. O que você poderia fazer para rotular esse ponto de dados é procurar o ponto de dados mais semelhante e tirar o rótulo de lá como o algoritmo KNN muito simples.
TwinPenguins

4

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.


Começando simples e crescendo a partir daí, há um ótimo conselho!
Escachator

0

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

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.