BT

Disseminando conhecimento e inovação em desenvolvimento de software corporativo.

Contribuir

Tópicos

Escolha a região

Início Artigos Mais bytes no seu bolso

Mais bytes no seu bolso

Favoritos

Pontos Principais

  • As SVM's (máquina de vetores de suporte) são uma ferramenta eficaz para classificar documentos.
  • Ao reduzir o tamanho de grandes conjuntos de dados/vetores, o treinamento de seus modelos é facilitado.
  • Ao reutilizar dados rotulados por meio de relacionamentos vinculados, o custo do treinamento de cargas de dados é reduzido e aumenta a precisão das previsões.
  • Escolher as estruturas de dados corretas é muito importante para alcançar os melhores resultados.
  • Diminuir a hierarquia de dados pode ser útil para reduzir o número de SVMs.

Em muitos casos, a aquisição de dados de treinamento bem rotulados é uma grande dificuldade para desenvolver sistemas de predição acurados com aprendizado supervisionado.

Na Love the Sales, agregamos produtos de venda de mais de 700 fornecedores internacionais, resultando em mais de 2 milhões de produtos por dia que precisam de classificação. Com uma equipe tradicional de merchandising, seriam necessários 4 anos para realizar esta tarefa manualmente.

Nosso desafio foi aplicar a classificação ao metadata textual destes 2 milhões de produtos (a maioria roupas e utensílios domésticos) em mais de 1000 categorias diferentes - representados em uma hierarquia, como esta:

Clothing
          Mens Clothing
                           Mens Jeans
                           Mens Jumpers
          Womens Clothing
                           Womens Jeans
                           Womens Jumpers
                           ...

Support Vector Machines (Máquinas de Vetores de Suporte)

Para a classificação, optamos pelas SVMs. As SVMs são uma classe de algoritmo de aprendizado de máquina supervisionado, algo apropriado para a classificação de dados linearmente separáveis.

Essencialmente, dado um conjunto suficientemente grande de dados de treinamento rotulados - uma SVM irá tentar encontrar um plano melhor entre os exemplos - ou seja, desenhar uma primeira linha multidimensional para encontrar chão.

Saiba mais sobre SVM's aqui e aqui.

Aqui, temos algumas possibilidades de separar este conjunto de dados:

A SMV tentará aprender o melhor hiperplano:

Fonte da imagem: opencv.org

Embora existam inúmeros algoritmos de machine learning para classificação (Redes Neurais, Random Forest, Naive Bayesian), as SVMs são ótimas para dados com muitas características - no nosso caso, para classificação de documento, onde cada 'palavra' é tratada como uma variável discreta.

As SVMs podem ser classificadas em múltiplas classes, mas optamos por utilizar uma hierarquia de duas classes simples de SVMs, ligadas de forma hierárquica.

A principal razão para isto é que, quando tentamos, nos pareceu produzir resultados melhores; e, importante ressaltar, utilizou-se muito menos memória em nossa plataforma de aprendizado de máquina, pois cada SVM só necessita saber sobre duas classes de dados. A grande utilização de conjuntos de dados (mais de 300 exemplos) e grandes vetores de entrada (1 milhão de palavras diferentes conhecidas) foi certamente um obstáculo.

Usamos também algumas técnicas bem conhecidas para fazer um pré-processamento em nossos documentos o que nos ajudou a reduzir o tamanho da variável, como: conversão para letras minúsculas, stemização, remoção de números e de caracteres incomuns e palavras "ruidosas".

A Stemização é uma técnica comum e útil quando se lida com grandes quantidades de textos, com objetivo de escolher palavras diferentes porém com significados e radicais parecidos, e então "reduzir" a um símbolo comum. Por exemplo, as palavras "gato", "gata", "gatos", "gatas" têm significados semelhantes. Quando aplicado o algoritmo "Porter stemmer", o resultado é "gat"; fazendo desta forma cortamos pela metade o número de palavras para nos preocupar. Usando sistemização em conjuntos com a remoção de palavras "ruidosas" (palavras repetitivas que não trazem significados como "o", "a", "os, "as", "e", "com"...) pudemos chegar a um número reduzido e possível de trabalhar.

Criando SVMs

Uma vez que tenha pré-processado seu conjunto de texto, o próximo passo é treinar seu modelo. Para isto, primeiro é preciso transformar seus textos em um formato que a SVM possa entender - isto é conhecido como "vetorização". A seguir, temos uma simples descrição do processo para a seguinte sentença:

Men, you'll look fantastic in this great pair of mens skinny jeans

Após o pré-processamento como descrito acima (sistemização e remoção de palavras):

men fantastic great pair men skinny jean

Utilizando apenas as palavras do exemplo anterior, podemos ver que uma palavra se repete, então podemos transpor o dado da seguinte forma:

Occurrences     Term
1 fantastic
1 great
1 jean
2 men
1 pair
1 skinny

Isto pode ser representado em um vetor na forma: [1,1,1,2,1,1]

Isso funciona bem para um conjunto de poucos termos. Porém, conforme adicionamos mais e mais exemplos, nosso vocabulário aumenta. Por exemplo, quando adicionamos outro exemplo que não é jeans skinny masculino:

women bootcut acid wash jean

Precisamos aumentar o tamanho do vocabulário com o qual o algoritmo precisa se preocupar:

[acid,bootcut,fantastic,great,jean,men,pair,skinny,wash,women]

Isto significa que nosso vetor inicial de termos para jeans skinny masculinos foi alterado para:

[0,0,1,1,1,2,1,1,0,0]

Quando lidamos com milhares de fontes, nosso vocabulário começar a ficar grande, tornando-se cada vez mais pesado, e assim os exemplos para treinamento começam a ficar vazios em sua maioria e muito grandes:

[0,0,0,0,0,0,0,0,..... 2,0,0,0,0,0,.....1,0,0,0,0 …]

Felizmente, muitas bibliotecas de aprendizados de máquina permitem que seu vetor seja transformado de termos em um vetor esparso - isto significa que só precisa trabalhar com os itens não-zeros, e a biblioteca (no nosso caso LibSVM) irá magicamente descobrir os locais corretos e preencher os buracos.

Para isto, deve ser passado o vetor de termos e as classes que representam como "Índice do Termo" relativo ao vocabulário inteiro para todos os exemplos de treinamento que desejar utilizar. Por exemplo:

Índice do Termo  

 Termo

 0

 acid

 1

 bootcut

 2

 fantastic 

 3

 great

 4

 jean

 5

 men

 6

 pair

 7

 skinny

 8

 wash

 9

 women

Então, para "men fantastic great pair men skinny jean", poderíamos descrever como:

Índice do termo #2 : 1 ocorrência

Índice do termo #3 : 1 ocorrência

Índice do termo #4 : 1 ocorrência

Índice do termo #5 : 2 ocorrência

Índice do termo #6 : 1 ocorrência

Índice do termo #7 : 1 ocorrência

E que ainda pode ser transformado em algo mais sucinto:

[2:1,3:1,4:1,5:2,6:1,7:1]

Alexandre Kowalczyk tem uma explicação ótima para a preparação de vocabulário aqui, assim como outros tutoriais ótimos sobre SVM.

Hierarquia e estrutura de dados

Um aprendizado-chave para nós: a maneira como estas SVMs foram estruturadas pode ter um impacto significante no quanto de dados de treinamento é necessário aplicar; por exemplo, uma simples abordagem poderia ser como abaixo:

[Clique na imagem para aumentar]

Nesta abordagem, para cada subcategoria nova, duas novas SVM's precisam ser treinadas - por exemplo, a criação de uma nova classe de "Swimwear" iria precisar de uma SVM adicional embaixo de Men's e Women's - sem contar na potencial complexidade de se adicionar a classe "Unissex" no topo. Além disso, grandes hierarquias tornam-se difíceis de se trabalhar.

Conseguimos evitar uma grande quantidade de trabalho de rotulagem e treinamento, ao nivelar nossas estruturas de dados em subárvores da seguinte forma:

[Clique na imagem para aumentar]

Ao desacoplar nossa estrutura de classificação da hierarquia final, é possível gerar a classificação final percorrendo a hierarquia de SVM com cada documento e verificando os resultados com uma lógica simples baseada em conjuntos, como:

Mens Slim-fit jeans = (Mens e Jeans e Slim Fit) e não Womens

Essa abordagem reduz bastante o número de SVMs necessárias para classificar documentos, pois os conjuntos resultantes podem ser interseccionados para representar a classificação final.

Deve-se notar que ao se adicionar novas classes, abre-se um número exponencialmente crescente de categorias finais. Por exemplo, adicionar uma classe "infantil" no nível superior permitiria imediatamente a criação de uma dimensão inteira de novas categorias infantis (jeans, camisetas, roupas íntimas, etc.), com um mínimos de dados de treinamento adicionais (apenas uma SVM adicional):

Reutilização de dados

Por causa da estrutura que escolhemos, uma das principais informações que conseguimos alavancar foi a reutilização de dados de treinamento, por meio de vinculação de dados relacionados. A vinculação de dados nos permitiu reutilizar nossos dados de treinamento por um fator de 9x - reduzindo assim enormemente o custo e aumentando a precisão das previsões.

Para cada classe individual, obviamente queremos o maior número possível de exemplos de dados de treinamento, cobrindo ambos resultados possíveis. Mesmo que tenhamos construído excelentes ferramentas internas, principalmente uma interface de usuário rápida para pesquisar, classificar e rotular exemplos de dados de treinamento em grandes lotes - rotular milhares de exemplos de cada tipo de produto ainda pode ser trabalhoso, caro e propenso a erros. Determinamos que a melhor maneira de contornar esses problemas era tentar reutilizar todos os dados de treinamento que pudéssemos, em todas as classes.

Por exemplo, considerando algum conhecimento básico de domínio das categorias, sabemos com certeza que "máquinas de lavar roupa" nunca podem ser "limpadores de carpetes".


Ao adicionar a capacidade de vincular "Excluir dados", podemos reforçar a quantidade de exemplos de treinamento "Negativos" para a SVM "máquinas de lavar", adicionando os dados de treinamento "Positivos" da SVM "limpadores de carpetes". De maneira mais simples, uma vez que sabemos que "limpadores de carpetes nunca podem ser "máquinas de lavar roupa" - podemos também reutilizar esses dados de treinamento.

Essa abordagem tem um bom aumento, pois sempre que for necessário adicionar alguns dados de treinamento adicionais para melhorar a SVM "limpadores de carpetes" - ela melhora sem saber a classe "máquinas de lavar", por meio de dados negativos vinculados.

Por último, outra chance de reutilização (ao considerar uma hierarquia), são os dados de treinamento positivos para qualquer nó filho, pois também são sempre dados de treinamento positivos para seu pai.

Por exemplo: "Jeans" são sempre "Roupas".

Isso significa que, para cada exemplo positivo de dados de treinamento adicionados à SVM "Jeans", um exemplo positivo adicional também é adicionado à SVM "Vestuário" por meio de uma vinculação.

Adicionar dados vinculados é muito mais eficiente do que rotular manualmente milhares de exemplos.

Conclusão

Cremos que as Máquinas de Vetores de Suporte nos ajudaram a alcançar uma qualidade e velocidade de classificação que nunca poderíamos alcançar sem aprendizado de máquina. Como tal, aprendemos que as SVMs são um excelente complemento para qualquer toolkit de desenvolvedores, e que qualquer investigação também deve servir como uma boa introdução a alguns conceitos-chave de aprendizado de máquina.

Além disso, quando se trata das especificidades dos sistemas de classificação hierárquica, desacoplar o componente de classificação da hierarquia resultante, nivelar a estrutura de dados e possibilitar a reutilização dos dados de treinamento será benéfico para obter o máximo de eficiência possível. As abordagens descritas acima não só ajudaram a reduzir a quantidade de dados de treinamento que precisávamos rotular, mas também nos deu uma maior flexibilidade geral.

Sobre o Autor

Originalmente estudante de Ciência da Computação na Nova Zelândia, e agora morando em Londres, David Bishop lidera o time técnico de um dos 100 maiores websites de emprego, o reed.co.uk por 10 anos, e agora criou seu próprio negócio de tecnologia de varejo, o LoveTheSales.com - que busca agregar todas as vendas de milhares de sites de varejo.

 

Referências

  • SVM's:

 

Avalie esse artigo

Relevância
Estilo/Redação

Conteúdo educacional

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

BT