Data

16 abr, 2019

Classificador de Sentimentos – Azure ML

Publicidade

Olá, pessoal!

Em abril do ano passado publiquei um artigo em Python sobre a criação de um classificador de sentimentos. Que tal fazermos o mesmo exemplo, dessa vez utilizando o Machine Learning Studio do Azure?

Você pode encontrar o artigo original feito em Python neste link. Além dele, também disponibilizei uma atualização do artigo – dessa vez em inglês, lá no Medium.

O objetivo é fazermos a mesma implementação, só que dessa vez, com o Azure Machine Learning Studio.

Usaremos o mesmo conjunto de dados do artigo anterior, mas naquela vez os arquivos estavam salvos em um TXT. Fiz uma pequena atualização deles para convertê-los para CSV, isso facilitará nosso trabalho.

Você pode acessar os dados neste repositório do meu GitHub.

Vamos começar nossa implementação!

A primeira coisa é acessar o https://studio.azureml.net e autenticar-se (ou criar sua conta, é gratuito).

Feito isso, acesse a aba Datasets. É lá que carregaremos os arquivos CSV que vamos utilizar.

Após abrir a aba, pressione o botão + NEW, conforme a imagem abaixo:

Depois disso, carregue o arquivo localmente de sua máquina, selecionando o tipo de dataset, como: Generic CSV File with a header e pressione OK.

Agora já podemos criar nosso experimento selecionando a opção experiments > _ + NEW_ > Blank Experiment.

O primeiro passo em nosso experimento é unir todos os datasets em um único. Você pode fazer isso manualmente criando um novo arquivo CSV com todos os dados, mas podemos mantê-los separados e unir conforme a necessidade do experimento.

Você pode encontrá-los no módulo Saved Datasets > My Datasets, conforme imagem a imagem abaixo:

Quando precisarmos fazer algum tipo de alteração nos dados, provavelmente precisaremos dos módulos agrupados em Data Transformation. Neste caso de agora, vamos unir os dados de diferentes datasets. Para isso, usaremos o módulo Manipulation > Add Rows.

Esse módulo recebe dois parâmetros – ambos datasets, e retorna um novo dataset com a união dos registros dos parâmetros. Simples, né?

Utilizaremos este mesmo módulo duas vezes. Dessa forma conseguiremos unir os três datasets distintos.

Você pode visualizar os dados combinados no resultado do último módulo:

Agora usaremos um pouquinho de SQL. Eu sei que disse que não teria código (e na verdade nem precisaria), mas facilitará a visualização dos dados.

Vamos alterar a coluna Value de ‘0’ e ‘1’ para ‘Negative’ e ‘Positive’, respectivamente. Para isso, utilize o módulo Apply SQL Transformation, ainda no grupo Manipulation de Data Transformation.

Apesar desse módulo poder receber três parâmetros diferentes, utilizaremos apenas um. E como configuração do módulo, usaremos um script bastante simples, conforme o código abaixo:

SELECT 
    Text,
    CASE WHEN Value = 1 THEN 'Positive'
         ELSE 'Negative' 
    END AS Value
         
FROM 
    t1;

E pronto!

Não se esqueça também que, caso esteja tendo problemas para visualizar os dados, é necessário executar o experimento pressionando o botão RUN sempre que adicionar novos módulos.

Agora estamos no momento em que, no artigo em Python, utilizávamos o vetorizador para transformar cada palavra do texto em um valor numérico. Esse valor representa o número de vezes que cada palavra aparece no texto.

Eles são utilizados para o cálculo do quão positivo (ou negativo) é um comentário. Você pode ver a explicação completa na publicação original.

Para fazer isso no Azure ML vamos utilizar o módulo Feature Hashing do grupo Text Analytics – basta conectá-lo à saída do módulo Apply SQL Transformation:

Vamos alterar as propriedades do Feature Hashing para que ele leve em consideração apenas a coluna: Text, conforme a imagem:

Assim como fizemos no experimento anterior, vamos dividir os dados para treinamento e avaliação. Neste caso, vamos utilizar como ponto de corte 75% dos registros.

Para fazer esta separação vamos utilizar o módulo: Data Transformation > Sample and Split > Split Data, configurando-o para 75%.

Agora os dados já estão preparados!

Fazendo a Classificação

Vamos utilizar o algoritmo Two-class Bayes Point Machine, um algoritmo diferente do utilizado em Python. Este módulo encontra-se em: Machine Learning > Initialize Model > Classification. Neste caso vamos manter a configuração padrão do algoritmo, simplesmente vamos consumi-lo.

Para que o modelo de treinamento seja criado, é necessário que ele receba tanto o algoritmo quanto o conjunto de dados que será utilizado como treinamento.

Com as conexões feitas, vamos configurar o modelo para que a classificação tenha como objetivo chegar no valor da coluna Value.

Um ponto interessante de se notar aqui, é que após o Feature Hashing, nosso dataset ficou com muito mais colunas do que continha originalmente. Afinal, para cada palavra possível dos dados, uma coluna foi adicionada.

Agora conectaremos o resultado do Train Model e há dados para validação com o Score Model, que por sua vez, deverá se conectar ao Evaluate Model.

Antes de executar o experimento, lembre-se de desmarcar a opção Append score columns to output. Isso servirá para excluirmos as colunas do dataset do resultado, afinal, só precisamos da análise preditiva.

Já podemos executar e ver os resultados!

Resultados e Publicação

Ao selecionar a opção Visualize no Evaluate Model, podemos checar todo o resultado obtido:

Aqui temos a matriz de confusão e outras métricas importantes para verificarmos a validação do nosso modelo (que por sinal não é grande coisa).

Vamos entender e explorar essas métricas em um artigo futuro. No momento, partiremos diretamente para a publicação do modelo como um serviço web.

Para iniciarmos o processo de publicação, precisamos configurar o ambiente. Podemos fazer isso escolhendo a opção: Predictive Web Service, encontrada na barra inferior dentro do agrupador SET UP WEB SERVICE, conforme na imagem abaixo:

Ao pressionar este botão, um novo experimento baseado no atual é criado. Ele ficará sob uma nova aba chamada Predictive experiment dentro deste mesmo ambiente.

No novo experimento faremos alguns pequenos ajustes, simplesmente para melhorarmos o consumo do web service.

Primeiro vamos ajustar o que precisa ser passado por parâmetro para o serviço – isso é definido automaticamente pelo Azure ML, mas pode ser facilmente alterado.

No Azure ML, os parâmetros do web service são definidos pelo dataset ao qual o módulo Web Service Input está conectado.

Se voltarmos ao início do experimento, notaremos que o Web Service Input está conectado com o módulo Add Rows. Neste dataset temos duas informações. As colunas: Text e Value, que referenciam o texto e o resultado esperado da classificação.

No nosso contexto, não faz sentido esperarmos que o consumidor do serviço informe o resultado esperado. Afinal, o objetivo de criarmos isso é a detecção automática da classificação.

Esse tipo de informação pode ser útil para melhorar a assertividade do modelo enquanto ele ainda é utilizado, mas esse não é o foco aqui, então faremos com que seja necessário informar apenas o texto.

Para isso, basta fazermos um work around. Vamos utilizar o módulo Data Input and Output > Enter Data Manually. Ele nos permitirá criar um CSV manualmente.

Aqui vem o pulo do gato: vamos criar um contendo somente uma coluna: a Text. Depois disso, criaremos outro módulo com, mas desta vez, apenas com a coluna Value. Isso faz com que tenhamos dois datasets, onde cada um possui apenas um dos campos de nossos dados.

Vamos uni-los através do módulo Data Transformation > Add Columns. Isso fará com que os dois datasets se tornem um só, com o mesmo formato dos outros datasets do experimento.

Agora vamos conectar o parâmetro de entrada do web service no mesmo local de entrada do módulo Add Columns em que o dataset com a coluna Text foi conectado. Isso fará com que seja necessário informar apenas o Text como parâmetro do serviço.

Por fim usaremos o módulo Add Rows para unir o dataset contendo o parâmetro do web service com os dados que utilizamos no treinamento, assim como nas outras vezes:

Terminamos os parâmetros. Agora vamos simplificar o valor de retorno. Usaremos o módulo Select Columns in Dataset entre o Score Model e o Web Service Output.

Nas propriedades deste módulo vamos selecionar apenas as colunas esperadas como retorno: Scored Labels e Scored Probabilities.

Agora, sim! Pressione o botão RUN e depois DEPLOY WEB SERVICE para colocar o nosso serviço no ar!

Testando o experimento

Após pressionar o botão você será levado automaticamente para a aba Web services. Nela você poderá realizar seus testes, tanto enviando um único registro, quanto enviando vários (batch execution).

Ao pressionar o botão Test destacado em azul, um diálogo será aberto para que você preencha o texto que será enviado como parâmetro:

Após o processamento, o resultado é mostrado na barra inferior:

Neste caso, o resultado retornado foi “Positivo”, conforme o esperado.

Eu particularmente prefiro o teste que ainda está em preview – ele facilita a visualização dos resultados. Veja como o outro teste se comporta:

Fique à vontade para fazer quantos testes desejar, e aprofundar-se para melhorar ainda mais o modelo que criamos juntos!

Qualquer dúvida ou sugestão, deixem nos comentários!

E até mais!