Classificador de Sentimentos - Azure ML

Olá pessoa!

Em abril do ano passado publiquei um post 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 post original feito em Python neste link. Além dele, também disponibilzei uma atualização do post, dessa vez em inglês lá no medium.

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

Vamos usar o mesmo conjunto de dados do post 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 iremos carregar os arquivos CSV que vamos utilizar.

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

Azure ML - Datasets

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

Azure ML - Datasets upload

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:

Azure ML - Datasets no experimento

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

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

Vamos utilizar este mesmo módulo duas vezes, dessa forma conseguiremos unir os três datasets distintos.

Azure ML - Unindo Datasets

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

Azure ML - Datasets unidos

Agora vamos utilizar um pouquinho de SQL, eu sei 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 deste módulo poder receber três parâmetros diferentes, utilizaremos apenas um. E como configuração do módulo, utilizarem um script bastante simples, conforme código:

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 post em Python, utilizávamos o vetorizador para transformar cada palavra do texto em um valor númerico. 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:

Azure ML - Feature Hashing

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

Azure ML - Feature Hashing - 2

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

Azure ML - Split

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 consumí-lo.

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

Azure ML - Train Model

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.

Azure ML - Train Model Settings

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

Azure ML - Score 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:

Azure ML - Evaluate Model

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 post futuro, no momento vamos partir 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 imagem:

Azure ML - Publish-1

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.

Azure ML - Web service input

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.

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

Para isso, basta fazermos um work around, vamos utilizar o módulo Data Input and Output > Enter Data Manually. Ele nos permitirá criarmos 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 uní-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 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 vamos usar 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:

Azure ML - Web service input - 2

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:

Azure ML - Web service

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

Azure ML - Web service output

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 um outro teste se comporta:

Azure ML - Web service output

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

Azure ML - Web service outputs

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

E até mais.

Assine a Newsletter