Primeiros passos com Machine Learning ML.NET
Um dos temas mais falados atualmente é Inteligência Artificial e aprendizado de máquina (Machine Learning — ML), o qual se aplica a praticamente todas as áreas, seja acadêmica, governamental, mercado de trabalho, pesquisas em geral, enfim, difícil pensar onde não usar ML.
O conceito de ML é fazer com que você associe um volume de dados para que ele descubra o melhor algoritmo para treinar, segundo algumas diretrizes e modelos definidos, afim de ter o melhor resultado de saída.
O ML.NET surgiu no Microsoft Research e agora está em versão release. O ML.NET lhe oferece um modelo analítico e preditivo baseado em Machine Learning para desenvolvedores .NET. E, como é baseado no .NET Core e .NET Standard, você pode usá-lo em qualquer plataforma Windows, Linux e macOS. Vale dizer que o ML.NET permite exportar modelos treinados no formato Open Neural Network Exchange (Onnx), permitindo usa-los em ambientes que não usem ML.NET.
A ML.NET é uma biblioteca gratuita, open source com uma interface de linha de comando que usa AutoML para treinar um modelo e encontrar o melhor resultado conforme um algoritmo sugerido. Existe uma extensão para o Visual Studio (2017 / 2019), que pode ser baixada em https://marketplace.visualstudio.com/items?itemName=MLNET.07, ou você pode instalar diretamente pelo VS.NET em Extensions, com o nome de ML.NET.
Vamos a um exemplo prático. Abra o VS.NET 2019, clique em New Project, selecione o template Console App (.NET Core).
Clique em Next, selecione a pasta que irá criar o projeto e nomeie o projeto como ExemploML. Em seguida, clique no botão Create e aguarde o VS criar a solução. Tenha certeza que a extensão do ML.NET esteja instalada, a lista pode ser encontrada em Extensions / Manage Extensions. Se ela não estiver listada, clique em Online, pesquise ML.NET e instale.
No Solution Explorer, clique com o botão direito no nome do projeto (ExemploML), selecione Add / Machine Learning.
Será aberta uma janela do assistente com 5 passos. Aqui você deverá escolher qual o modelo de ML a ser gerado, no nosso caso, escolha Sentiment Analysis. Teremos um exemplo de classificação preditiva que avalia o sentimento de acordo com um texto, podendo ser positivo ou negativo.
O próximo passo é selecionar os dados, qual base de dados iremos fornecer ao modelo para que ele seja treinado. Faça download gratuito deste arquivo https://raw.githubusercontent.com/dotnet/machinelearning/master/test/data/wikipedia-detox-250-line-data.tsv e grave-o exatamente na pasta onde criou o projeto. Em Input selecione File e aponte para este arquivo .TSV baixado.
Em Data Preview você já visualiza os dados, os quais representam na primeira coluna o sentimento (0 — não tóxico e 1 — tóxico), e na segunda o comentário deixado pelo internauta/usuário. Agora é preciso informar qual o campo será usado para predição (Column to Predict), neste caso, selecione Sentiment.
Em seguida, clique no botão Train para treinar o modelo. O tempo para treinar (Time to train) é dado em segundos, quanto mais tempo você definir, mais precisão terá, mas claro que depende do volume de dados. Não adianta ter poucos dados que não será suficiente para um modelo mínimo. No nosso exemplo, defina 10 segundos.
Clique no botão Start training para iniciar o treinamento do modelo. Você pode acompanhar o progresso e os resultados, tendo:
- Status: progresso do teste.
- Best accuracy —Mostra a precisão do melhor modelo que o Model Builder encontrou. Quanto maior a precisão do modelo testado, mais corretos os dados.
- Best algorithm —Mostra qual o melhor algoritmo encontrado durante a exploração do Model Builder. O mais legal aqui é que vários algoritmos são testados e o modelo se encarrega de encontrar o melhor.
- Last algorithm —Mostra o último algoritmo explorado pelo Model Builder.
Próximo passo, clique em Evaluate para avaliarmos o resultado.
Basicamente o Model Builder divide o volume de dados em 80% para treinar o modelo e 20% para teste para avaliar o modelo. Como existem vários modelos de avaliações de tarefas do ML, cada um contém suas respectivas métricas, por exemplo:
Regressão (precisão de preço) — a métrica padrão para resolver problemas de regressão é RSquared, com valores entre 0 e 1, sendo 1 a melhor opção ou próximo do ideal.
Existem outras métricas como:
- Absolute-loss, squared-loss e RMS loss que são métricas usadas para entender como qual modelo é melhor comparado a outros modelos de regressão.
- Classificação Binary, usada no exemplo do projeto para análise de sentimento. A métrica padrão é a acuracidade (precisão), que define a proporção de previsões corretas que seu modelo está fazendo sobre o conjunto de dados de teste. Quanto mais próximo de 100% ou 1.0, melhor.
- AUC (Área sob a curva), mede a taxa positiva verdadeira x a taxa de falsos positivos, devem ser maiores que 0,50 para que os modelos sejam aceitáveis.
- Pontuação F1, usada para controlar o equilíbrio entre Precisão e Rechamada.
- Multi-Class (Classificação de várias classes), usada na classificação de problemas, a métrica padrão é Micro-accuracy (Micro Precisão), existe a Macro-accuracy também, mas quanto mais próxima 100% ou 1, melhor. Via de regra:
Micro-accuracy — com que frequência um ticket recebido é classificado para a equipe certa?
Macro-accuracy — para uma equipe média, com que frequência um ticket de entrada é correto para sua equipe?
Códigos
Agora que já temos o modelo treinado, o último passo é inserir os códigos C#, portanto, clique em Codes / Add Projects. O assistente adiciona 2 novos projetos na solução, um de Console para testar a solução e outro de Model para treinar o modelo. Ambos usam o pacote Microsoft.ML (1.0.0) restaurado via Nuget.
O projeto ExemploMLML.Model contém duas classes que representam os modelos de entrada e saída.
Já no projeto que irá consumir o Modelo, temos a classe ModelBuilder.cs. Basicamente referencia o Microsoft.ML, Microsoft.ML.Data e os DataModels do projeto Model. Em seguida, são definidas as variáveis que apontam para o arquivo TSV que contém os dados, o ZIP que contém os modelos treinados. A classe MLContext é a mais importante, pois ela contém tudo o que é preciso para as operações ML.NET, permite preparar, treinar, avaliar, fazer predição de dados.
O código a seguir mostra o ciclo completo, carrega os dados, prepara-os, caso seja preciso, avalia os modelos, treina e salva.
O IDataView são as entradas e saídas das operações de consultas, neste caso, referencia o arquivo de entrada com os devidos parâmetros.
IDataView trainingDataView = mlContext.Data.LoadFromTextFile<ModelInput>
O IEstimator é a interface que irá transformar os dados numa estrutura para que seja entendida pelo modelo, por enquanto ainda não foram treinados. Veja que é chamado método BuildTrainingPipeline que configura as colunas, define o algoritmo a ser usado, neste caso o SgdCalibrated, o qual usa o modelo de classificação linear.
IEstimator<ITransformer> trainingPipeline = BuildTrainingPipeline(mlContext);
Em seguida, é chamado o método Evaluate que irá fazer a validação cruzada, note que os parâmetros são o contexto, os dados iniciais com o modelo de entrada de dados e o estimado, resultando na impressão das métricas da classificação binária.
Evaluate(mlContext, trainingDataView, trainingPipeline);
Em seguida, temos que transformar os dados, e há uma chamada ao método TrainModel, que através do FIT treina e retorna os dados.
ITransformer mlModel = TrainModel(mlContext, trainingDataView, trainingPipeline);
Ao final, o SaveModel grava um arquivo ZIP contendo o modelo salvo para que você possa usar em outras ferramentas.
SaveModel(mlContext, mlModel, MODEL_FILEPATH, trainingDataView.Schema);
Program.cs
Já no projeto que irá consumir o Modelo, veja o código do Program.cs. Basicamente referencia o Microsoft.ML, Microsoft.ML.Data e os DataModels do projeto Model. Em seguida são definidas as variáveis que apontam para o arquivo TSV que contém os dados, o ZIP que contém os modelos treinados.
Se você quiser executar o ModelBuilder.cs, descomente a linha a seguir no método Main(), coloque um breakpoint e execute. O resultado final é um ZIP com o modelo gerado e o resultado dos cálculos.
ModelBuilder.CreateModel();
Em seguida, o código executa o processo para previsão simples, resultando na previsão (Prediction) do modelo de saída (ModelOutput).
Como consumir o modelo em outra Aplicação?
Agora que já temos o modelo treinado, veja como usar em aplicação de console, neste caso é a ExemploML. A primeira coisa a fazer é referenciar o projeto Model e instalar o Microsoft.ML via Nuget.
PM> Install-Package Microsoft.ML -Version 1.0.0
E, no projeto Model configurar a propriedade Copy to Output Directory para Copy Always no arquivo MLModel.ZIP.
Em seguida, no Program.cs deste projeto, troque todo o código conforme a listagem a seguir. Basicamente o processo é igual, só que o texto a ser pesquisado em input.SentimentText =That is rude.
Veja o resultado a seguir com o texto Toxic para verdadeiro ou Non-Toxic para falso.
Console.WriteLine($”Text: {input.SentimentText} | Prediction: {(Convert.ToBoolean(result.Prediction) ? “Toxic” : “Non Toxic”)} sentiment”);
Conclusão
A capacidade de processamento das máquinas tem crescido rapidamente, o que ajuda na análise e treinamento do modelo de dados. E, como temos várias ferramentas de Machine Learning suportadas em outras linguagens, este mercado tende a crescer muito mais que outros, e estar preparado para o mundo novo, é sempre um desafio de aprender.
Boa sorte, sucesso nos projetos e se precisar treinar o seu time, fale comigo rehaddad@msn.com