Technical
Transformar classes em dados de entrada
Kelwin · 22 de setembro de 2022
Reconheçamos, todos trabalhámos em projectos de ML onde foi necessário prever um número ridiculamente elevado de classes. Suficientemente elevado para tornar o número de observações por classe numa amostra vergonhosamente pequena. A maioria das pessoas modelam estas tarefas como um problema de classificação multiclasse onde, para cada observação de entrada, precisam prever a classe mais provável (ou as probabilidades da classe).
Exemplos de tais tarefas incluem prever o modelo de um carro, a espécie de um animal, a intenção de um utilizador num chat, o código SIC/NAICS de uma empresa e o produto na imagem de um marketplace, entre muitos outros.
Um número dinâmico de classes também caracteriza estes exemplos. Por exemplo, digamos que está a treinar um modelo de Computer Vision para reconhecer o item numa foto para uma loja retail autónoma. Todos os dias, novos produtos são lançados no mercado. Se seguir a abordagem tradicional, precisa treinar um novo modelo diariamente para acompanhar o catálogo.
Isto causaria um caos na manutenção do modelo (e nas operações)! Não quer isso!
A nossa receita para modelos grandes de classificação multiclasse
O nosso método para este tipo de modelo é converter classes em parte da pergunta. Por isso, em vez de treinar um modelo de classificação multiclasse que prevê:
Qual é a classe da observação? uma pergunta categórica
colocamos a pergunta:
Esta observação pertence a uma categoria dada? uma pergunta de sim ou não.
Gosto de chamar a este método virar o modelo de cabeça para baixo, tornando o resultado parte das entradas.
Tecnicamente, transformamos o nosso modelo preditivo

em

Depois, para qualquer observação dada, só precisa fazer a pergunta para todas as classes e escolher a que tem a probabilidade mais elevada.

Aparece uma classe nova? Sem problema; coloque uma pergunta adicional da próxima vez que precisar gerar uma previsão. Não é necessário treinar novamente. Gosto de chamar a este método virar o modelo de cabeça para baixo, tornando o resultado parte das entradas.
Nota: desde que o subconjunto de classes inicial seja suficientemente generalista. Caso contrário, treine novamente de vez em quando.
Como codificar classes como entrada? Classificação multiclasse como classificação binária
Digamos que tem características que descrevem as classes. Então, só precisa codificar a classe como o conjunto de características que a descrevem. Por exemplo, no exemplo de reconhecimento de produto retail, pode caracterizar o item pela sua categoria, marca, peso, tamanho, cor, descrição, ingredientes, etc.

No entanto, não é tão comum ter características que descrevam as classes. Como descreveria a intenção de um utilizador num chat? Como descreveria um modelo de carro ou um animal?
Seria possível fazê-lo. Mas, a minha aposta é que não terá acesso a tais dados.
O que fazer nesta situação?
Um Trunfo na Manga
Há que concordar que tem as características das entidades que pertencem a essa classe, certo? Nesse caso, pode obter características sobre a distribuição das observações nessa classe. Valores estatísticos como a média, mínimo, máximo e variância das características para as observações nessa classe. Agora tem características que descrevem a classe. De nada.
Ei Kelwin, mas sabe, as características não são old-fashioned? Todos trabalhamos com deep learning atualmente e deixamos o modelo aprender as suas próprias características. Fico feliz por ter perguntado, jovem aprendiz!
Quer debater mais esta ideia?
Marque uma reunião com Kelwin Fernandes
Conheça Kelwin Saber Mais
Pode treinar uma rede neural siamesa que responde à pergunta:
Estas duas observações pertencem à mesma classe?
Ou, de forma mais formal:

Agora, pode fazer a pergunta comparando a sua nova observação de teste com todos os pontos de dados de treino, agregar as probabilidades por classe (por exemplo, máximo, média) e devolver a classe com a pontuação mais elevada. Basicamente, pode transformar um problema multiclasse num de aprendizagem de similaridade.
Está maluco? Isto nunca escalará. Bem, escalará. Primeiro, só precisa indexar todas as observações de treino. Por isso, sempre que chega uma entrada nova, apenas executa a sua rede neural na instância de entrada para obter as suas características latentes mais uma simples comparação com vizinhos próximos contra todos os outros pontos de dados.
Mesmo assim, consegue imaginar fazer isto sobre milhões de observações? Claro que não, mas pode sempre escolher pivots que representem adequadamente a sua classe usando qualquer técnica, como k-medoids no espaço latente. Simples assim.
Agora, tem um modelo escalável que se ajusta a classes novas sem necessidade de treinar novamente.
Usámos este método em várias indústrias e casos de uso, o que sempre se justifica.
Curso
The Machine Learning Spectrum
Aprenda mais métodos como este no nosso curso de ML.
Ganha-se muita eficiência operacional, além de mitigar o problema de classes com baixa frequência.
Uma classe deixou de ser relevante? Remova as suas observações do índice.
Há uma classe nova? Adicione novas observações ao índice.
Tão simples assim!
Há alguns truques adicionais que lhe podemos ensinar, mas terá de esperar por outro artigo. Tenho de ir embora. Mas você não. Por isso, subscreva já a nossa newsletter abaixo para se manter informado.
