Home Cloud Classificação de Texto no BigQuery ML: Previsão de marca com a descrição do produto
Home Cloud Classificação de Texto no BigQuery ML: Previsão de marca com a descrição do produto

Classificação de Texto no BigQuery ML: Previsão de marca com a descrição do produto

Olá, caro(a) leitor(a). Já tivemos um primeiro texto aqui falando sobre o poder do BigQuery ML e hoje venho trazer uma aplicação prática: criando um modelo de classificação de texto.

Nesse modelo vou utilizar dados de produtos das marcas adidas (distribuídas em 3) e nike como preço, porcentagem de desconto, descrição e muito mais. Mas, só vamos usar a variável descrição no modelo.

Em suma, nosso desafio de hoje é prever de qual marca se trata a partir da descriçãocom um modelo de regressão logística.

Inserindo os dados no BigQuery

Existem diversas formas de inserir os dados no BQ. Entre elas tem como inserir de outros serviços da própria Google Cloud como Cloud Storage e Cloud Bigtable, por drive e por upload. No nosso caso, como os dados são externos eu escolhi a opção upload e inserir os dados da minha pasta local.

A primeira coisa que devemos fazer é criar um conjunto de dados para armazenar a tabela com os dados. Veja abaixo:

Agora que temos os dados podemos ter uma visualização dos nossos dados, veja abaixo:

Depois de ter nossos dados no BQ, podemos começar a trabalhar com eles.

Para fazermos nossa análise precisamos transformar nossos dados para rodar o modelo de classificação de texto.

Transformando os dados da descrição

Para o modelo processar a descrição devemos passá-la pelo processo chamado tokenization. Esse processo transforma uma grande sentença em pequenas unidades de palavras para melhorar a análise. 

Para realizar essa tarefa utilizei as funções:

  1. LOWER: deixa palavras em letra minúscula
  2. REGEXP_EXTRACT_ALL: retorna uma matriz de todas as substrings que correspondem à uma expressão regular especificada.
  3. ML.NGRAMS: forma palavras compostas a partir da matriz da função acima.

Observe como fica nossos dados ao rodar a seguinte query:

SELECT Brand, ML.NGRAMS(REGEXP_EXTRACT_ALL(LOWER(Description), '[a-z]+'), [1,2]) as Description
FROM nike_adidas_dataset.adidas_vs_nike

Criando, treinando e avaliando o modelo

Agora que já sabemos transformar nossos dados para análise, no vídeo acima eu mostro como criar e treinar nosso modelo.

A estrutura:

CREATE OR REPLACE MODEL `dataset.model_name`
OPTIONS(
model_type=’model_type’,
labels = [‘dependent_variable’]
)
AS 
query

No nosso caso será:

  • dataset: nike_adidas_dataset;
  • model_name: classification_model;
  • model_type: logistic_reg;
  • dependent_variable: Brand;
  • query: seleção das colunas “Brand” e “Description” transformada.

Num modelo normal teríamos que criar colocar muito mais parâmetros, mas com BigQuery ML conseguimos criar modelos com informações mínimas. Informações como separação de dados de treino e  de teste é automática. E é isso que garante a facilidade do processo.

Se tiver curiosidade com outros tipos de modelos, veja Tutorial BigQuery ML.

Veja a query de criação do modelo:

CREATE OR REPLACE MODEL `nike_adidas_dataset.classification_model`
OPTIONS
(
model_type='logistic_reg',
labels = ['Brand']
)
AS
SELECT Brand, ML.NGRAMS(REGEXP_EXTRACT_ALL(LOWER(Description), '[a-z]+'), [1,2]) as Description
FROM nike_adidas_dataset.adidas_vs_nike

Avaliação

A parte da avaliação no BigQuery ML é bastante fácil e intuitiva. Depois que nosso modelo for armazenado no nosso conjunto de dados, basta clicarmos nele e acessar a aba de avaliação. Os dados entregues já são dos dados de teste. 

De todas as métricas, 4 são importantes para avaliarmos a performance do nosso modelo: 

  • Precisão: 0,7859
  • Acurácia: 0,9821
  • Pontuação F1: 0,7843
  • ROC AUC: 0,8000

Que aparentam ser muito boas, indicando que nosso modelo tem uma boa performance.  Nossa acurácia ficou bastante alta mostrando que o modelo acertou cerca de 98% das vezes.

Predição

Vamos fazer uma predição de uma descrição do produto Jordan Jumpman extraído do site da nike :

“Adjust on the fly. The Jordan Jumpman Air Pullover Hoodie has a toggle on the drawcord that you can quickly slide up or down to adjust the hood opening. The fabric is a midweight French terry that’s smooth on the outside and softly brushed on the inside.”

Primeiro criei uma tabela chamada new_observation e fiz um INSERT nessa tabela dessa descrição. Veja abaixo a query do INSERT:

-- INSERT INTO sauter-apps.nike_adidas_dataset.new_observation(Description) VALUES("Adjust on the fly. The Jordan Jumpman Air Pullover Hoodie has a toggle on the drawcord that you can quickly slide up or down to adjust the hood opening. The fabric is a midweight French terry that's smooth on the outside and softly brushed on the inside.")

Fazendo a predição:

SELECT 
*
FROM ml.PREDICT(MODEL `nike_adidas_dataset.classification_model`,            
    (SELECT ML.NGRAMS(REGEXP_EXTRACT_ALL(LOWER(Description), '[a-z]+'), [1,2]) as Description 
     FROM `nike_adidas_dataset.new_observation`))

Resultados:

Com o resultado de nossa predição, o modelo prevê que com 77% de certeza que é uma descrição da Nike!

Nada mal an?!

E terminamos! Se houver alguma sugestão, me contate pelo LinkedIn.