C# Data Science

Machine Learning com ML.Net no Jupyter Notebook

Fala galera do mundo dos dados. Neste artigo, vou apresentar o framework ML.Net e demonstrar o seu uso em conjunto com o Jupyter notebooks. Em seguida vamos construir um exemplo que cria um modelo de regressão linear para prever os preços de residências usando os dados de seu tamanho e preço. Primeiramente, veremos alguns conceitos importantes.

Por que .NET

Sempre acreditei que uma linguagem / framework de programação é apenas uma ferramenta para um desenvolvedor e que existem inúmeras ferramentas disponíveis para atingir o seu objetivo. Portanto o mais importante é encontrar a ferramenta certa para você fazer o seu trabalho. 

Então, se você é um desenvolvedor .NET e deseja expandir suas habilidades no mundo dos dados, agora não precisa necessariamente aprender uma nova linguagem de programação como * Python ou R.

Mas, eu recomendo também fortemente o aprendizado de Python por ser a linguagem mais utilizada comercialmente para o mercado de Machine Learning.

O que é ML.NET e como ele funciona?

O ML.NET é um framework que oferece a capacidade de adicionar os recursos de Machine Learning a aplicativos .NET, tanto em cenários online como offline.  Com essa funcionalidade você pode fazer previsões automáticas utilizando os dados disponíveis do seu aplicativo. As aplicações de Machine Learning fazem uso de padrões nos dados para fazer previsões em vez de precisarem ser explicitamente programadas.

O recurso central para ML.NET é o modelo de aprendizagem de máquina. O modelo especifica as etapas necessárias para transformar seus dados de entrada em uma previsão. Com o ML.NET você pode treinar um modelo personalizado especificando um algoritmo, ou importando modelos do TensorFlow do tipo ONNX já pré-treinados. Usando o TensorFlow.NET , um conjunto de associações C# para TensorFlow, os usuários podem treinar e implantar modelos do TensorFlow com ML.NETONNX é um formato aberto criado para representar modelos de aprendizado de máquina. Isso significa que você pode treinar um modelo em outras ferramentas e estruturas populares, como Azure Custom Vision, PyTorch, Scikit Learn. E em seguida você poderá exportar ou converter esse modelo para ONNX e consumir ele utilizando o ML.NET.

E uma vez que você tenha um modelo, poderá adicioná-lo à sua aplicação para fazer as suas previsões.

A princípio o ML.NET é executado em ambientes Windows, Linux e macOS através do .NET Core 64 bits.

Código aberto e comunidade 

O ML.NET e o .NET são Open Source. Dessa forma, permite que a comunidade colabore e contribua com os projetos. Então, os seus usuários têm várias maneiras de contribuir para o ML.NET, seja levantando problemas, atualizando a documentação ou enviando solicitações pull, todas são contribuições valiosas que apenas ajudam a tornar a estrutura muito melhor para todos usarem.

Jupyter Notebooks

Jupyter notebook é um documento totalmente interativo que permite misturar conteúdo, código fonte e a saída do programa, tudo em um único documento. Os notebooks são documentos dinâmicos e seu código-fonte incorporado pode ser executado e modificado interativamente.

Assim, os Jupyter notebooks tornaram-se a ferramenta padrão para Discovery e para hospedagem de códigos on-line para aprendizado de máquina.

Uma ótima notícia para a comunidade de Data Science é agora você pode rodar código .NET (C#,  F# e Powershell) em Jupyter Notebooks através da ferramenta .NET interactive e com isso agora é possível executar código ML.NET também!

O .NET interactive é um conjunto de ferramentas CLI e APIs que permitem aos usuários criar experiências interativas em notebooks na web.

Em termos de ML.NET, isso é incrível para muitos cenários, como exploração e limpeza de dados, plotagem de gráficos, experimentação de modelos, documentação etc.

Agora vamos criar um exemplo de aprendizado de máquina utilizando o kernel .NET (C #) no Jupyter com os pacotes do ML.NET.

Configurando o ML.Net para Jupyter Notebooks em sua máquina local

Para configurá-lo em sua máquina local será necessário instalar:

  • NET Core SDK versão 3.1. Você pode baixá-lo aqui.
  • Jupyter (A maneira mais fácil de usar é instalar o Anaconda).
  • Habilite o kernel .NET para Jupyter Notebooks através da ferramenta .NET interactive.

A maneira mais fácil e recomendada de instalar o Jupyter notebooks é através da instalação do Anaconda, (conda) mas você também pode utilizá-lo através do pip.

Ao instalar o anaconda, ele irá instalar também o Python. No entanto, é importante destacar que o ML.NET não tem nenhuma dependência do Python, mas o Jupyter tem.

Para mais detalhes sobre como instalar o Anaconda e o Jupyter, consulte o guia de instalação do Jupyter.

Instalando a ferramenta .NET interactive

Abra o Prompt do Anaconda (Windows) ou Terminal (macOS) e verifique se o Jupyter está instalado e presente no caminho: 

> jupyter kernelspec list
  python3 ~\jupyter\kernels\python3

Em seguida, em um console comum, instale o .NET interactive ferramenta global:

> dotnet tool install --global Microsoft.dotnet-interactive

Agora instale o kernel .NET executando o seguinte no prompt do Anaconda:

> dotnet interactive jupyter install

Então, você pode verificar a correta instalação da ferramenta executando o seguinte no prompt do Anaconda:

> jupyter kernelspec list
  .net-csharp    ~\jupyter\kernels\.net-csharp
  .net-fsharp    ~\jupyter\kernels\.net-fsharp
  .net-powershell ~\jupyter\kernels\.net-powershell
  python3        ~\jupyter\kernels\python3

Agora vamos testar o funcionamento

  • Inicie o aplicativo Anaconda Navigator (clique duas vezes no ícone ‘Anaconda Navigator’)
  • Inicie o Jupyter a partir do botão ‘Iniciar’ no bloco ‘Jupyter Notebook’.
  • Como alternativa, no prompt do Anaconda, você também pode iniciar o Jupyter digitando o seguinte comando posicionado no caminho inicial do usuário:
    jupyter notebook
  • Você verá o Jupyter e as pastas do usuário por padrão.
  • Abra a opção de menu ‘Novo’ e você verá as opções de menu ‘.NET (C #)’ e ‘.NET (F #)’ e ‘.Net (PowerShell)’:
  • Selecione ‘.NET (C #)’ e comece a digitar código C# em um novo Jupyter notebook!
  • Por exemplo, você pode testar se o C# está funcionando com um código simples como o seguinte:

Recursos

O conjunto inicial de recursos que foi lançado é bem relevante para os desenvolvedores, aumento a experiência de uso dos Notebooks, oferecendo assim um conjunto útil de ferramentas para experimentação. Sendo assim, agora vamos dar uma olhada em alguns dos recursos liberados.

É possível explorar os recursos listados abaixo localmente em sua máquina ou on-line utilizando a imagem do fichário dotnet/interactive liberada pelo time da Microsoft.

Para a documentação online, vá para a subpasta Docs, localizada nas pastas C# ou F#.

Lista de recursos

Exibir saída

Existem várias maneiras de exibir a saída nos notebooks. Você pode usar qualquer um dos métodos demonstrados na imagem abaixo.

Formatadores de objetos

Por padrão, a experiência do notebook .NET permite que os usuários exibam informações úteis sobre um objeto no formato de tabela.

Saída HTML

Por padrão, os notebooks .NET são fornecidos com vários métodos auxiliares para escrever HTML. De ajudantes básicos que permitem que os usuários escrevam uma string como HTML ou produzam Javascript para HTML mais complexo com o PocketView.

Importando pacotes do Nuget

O Nuget é o gerenciador de pacotes da Microsoft para o universo .Net. E você pode importar pacotes NuGet utilizando a seguinte sintaxe:

#r “nuget:<package name>,<package version>”

Por exemplo:

#r "nuget:Microsoft.Data.Analysis,0.2.0"
using Microsoft.Data.Analysis;

Gráficos com XPlot

Os gráficos são renderizados usando Xplot.Plotly . Assim que os usuários importam o XPlot.Plotly em seus blocos de Notebooks (using Xplot.Ploty;), eles podem começar a criar visualizações ricas de dados no .NET.


Ainda assim, verifique o .NET Jupyter Notebook online para obter mais documentação e exemplos.

Projeto de Teste com ML.Net

Agora vamos iniciar criando um aplicativo que irá usar um modelo de regresso linear para prever os preços das residências usando os seus dados de tamanho e preço.

Instalar os pacotes do NuGet em seu notebook

Em primeiro lugar, antes de escrever qualquer código ML.NET, você precisa que o seu notebook tenha acesso aos pacotes NuGet que você irá utilizar. Dessa forma, iremos usar o Microsoft.ML para criar o modelo de Regressão.

#r “nuget:Microsoft.ML”

Agora estamos prontos para adicionar o código. Vamos começar com as instruções de uso:

using System;
using System.IO;
using Microsoft.ML;
using Microsoft.ML.Data;

Declarar as classes de dados

Para carregar o conjunto de dados vamos precisar utilizar duas classes uma classe para a entrada de entrada e outra classe para a previsão, serão as classes HouseData Prediction.

Agora vamos criar o objeto MLContext e carregar os dados

Um aplicativo do ML.NET inicia com um objeto MLContext. Esse objeto singleton contém catálogos. Um catálogo é objeto do tipo fábrica usado para carregar e salvar dados, componentes de operação de modelo, treinadores e transformações. 

Para tanto vamos criar alguns objetos HouseData com valores abaixo e logo após passar estes para o objeto IDataView:

HouseData[] houseData = {
    new HouseData() { Size = 1.1F, Price = 1.2F },
    new HouseData() { Size = 1.9F, Price = 2.3F },
    new HouseData() { Size = 2.8F, Price = 3.0F },
    new HouseData() { Size = 3.4F, Price = 3.7F } };
IDataView trainingData = mlContext.Data.LoadFromEnumerable(houseData);

Pipeline do modelo

Os modelos de aprendizado de máquina em ML.NET são criados como pipelines, que são sequências de componentes de carregamento, transformação e aprendizado de dados.
O nosso pipeline possui os seguintes componentes:

  • Concatenate, Combina todas as colunas de dados de entrada em uma única coluna chamada Features. Esta é uma etapa necessária porque o ML.NET pode treinar em uma única coluna de entrada apenas.
  • Um algorítimo de regressão no caso o Sdca que irá treinar o modelo para fazer as previsões.
var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })  
.Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Price",
              maximumNumberOfIterations: 100));

Treinar o modelo

O método Fit() treina o modelo com o conjunto de dados de treinamento fornecido.  Isso é conhecido como treinamento do modelo. Lembre-se de que o modelo de regressão linear acima tem dois parâmetros de modelo: desvio e peso. Após a chamada a Fit(), os valores dos parâmetros são conhecidos.

var model = pipeline.Fit(trainingData);

Usar o modelo

Agora vamos poder utilizar o modelo treinado para fazer previsões sobre novos dados.

var size = new HouseData() { Size = 2.5F };
var price = mlContext.Model.CreatePredictionEngine<HouseData, Prediction>(model).Predict(size);

Avaliação do modelo

Depois de treinar o nosso modelo precisamos saber o quão bem ele fará as previsões futuras? Com ML.NET você pode avaliar o seu modelo com novos dados de teste.

Cada tipo de tarefa de Machine Learning tem suas métricas utilizadas para avaliar a precisão e a exatidão do modelo em relação ao conjunto de dados de teste.

Para nosso exemplo de preço de residências, iremos usar Algoritmos de Regressão. Dessa formar para avaliar o modelo vamos adicionar o código abaixo:

HouseData[] testHouseData =
        {
            new HouseData() { Size = 1.1F, Price = 0.98F },
            new HouseData() { Size = 1.9F, Price = 2.1F },
            new HouseData() { Size = 2.8F, Price = 2.9F },
            new HouseData() { Size = 3.4F, Price = 3.6F }
        };
        var testHouseDataView = mlContext.Data.LoadFromEnumerable(testHouseData);
        var testPriceDataView = model.Transform(testHouseDataView);
        var metrics = mlContext.Regression.Evaluate(testPriceDataView, labelColumnName: "Price");
        Console.WriteLine($"R^2: {metrics.RSquared:0.##}");
        Console.WriteLine($"RMS error: {metrics.RootMeanSquaredError:0.##}");

Salvar o modelo

O código abaixo salva o Modelo em disco para que ele possa ser utilizado em outros aplicativos para a previsão:

//Salvar o modelo treinado para arquivo
private static string modelPath = @"./HouseModel.zip";
Console.WriteLine("====== Saving the model to a file ======");
mlContext.Model.Save(model, trainingData.Schema, modelPath);

Código fonte do projeto

* O código do Projeto de exemplo pode ser encontrado no meu github. Nele também inclui um exemplo de consumo da biblioteca XPlot para a geração de nossos gráficos.

ML.Net ao Cubo

Os Jupyter notebooks em .NET abrem vários cenários atraentes para o ML.NET, tais como explorar e documentar experimentos de treinamento de modelos, exploração de distribuição de dados, limpeza de dados, plotagem de gráficos de dados e aprendizado.

Com o kernel do .NET interactive para Jupyter, podemos tirar proveito disso em todos esses cenários.

Sendo assim, nos próximos artigos iremos conhecer outros modelos disponíveis no ML.Net e ver um exemplo de seu uso em um aplicativo web.

Referências sobre ML.Net

Conteúdos ao Cubo

Por fim, deixo algumas sugestões de conteúdos que você pode encontrar no Dados ao Cubo, sempre falando sobre o mundo dos dados.

Então, finalizo com um convite para você ser Parceiro de Publicação Dados ao Cubo e escrever o próximo artigo, compartilhando conhecimento para toda a comunidade de dados. Não esqueça de assinar a nossa Newsletter para ficar por dentro de todas as novidades. 

Gostou? Compartilhe!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *