C# Data Science Machine Learning

AutoML (Automated Machine Learning) com ML.Net

Olá pessoal, estou de volta após uma breve pausa para cuidar de assuntos diversos. E neste artigo vamos retornar o  nosso estudo sobre MLNet, desta vez vamos ver um pouco sobre AutoML.

1. O que é AutoML

O Machine Learning Automatizado (AutoML) é o processo de automatização do fluxo de aplicação de MLMachine Learning a problemas do mundo real. Ele pode cobrir todo o pipeline de construção de Modelos de ML, desde o conjunto de dados bruto até o modelo pronto para ser implantado.

Automatizar o processo de aplicação de Machine Learning de ponta a ponta oferece a vantagem de produzir soluções mais simples através da criação mais rápida de modelos que muitas vezes superam os modelos projetados à mão.

Construir modelos de Machine Learning envolve várias habilidades técnicas, como pré-processamento dos dados, seleção do algoritmo e tunning de hiperparâmetros, todas elas precisam ser dominadas para a elaboração de um modelo que atenda às necessidades do projeto.

2. AutoML em MLNet

O AutoML do MLNet permite que dado um conjunto de dados, se possa executar um experimento para iterar em diferentes personalizações nos dados, nos algoritmos de Machine Learning e nos hiperparâmetros, de modo a selecionar o melhor modelo.

Dessa maneira os Cientistas de Dados, os Analistas e os desenvolvedores têm a liberdade para criar modelos de ML em alta escala com eficiência e produtividade, ao mesmo tempo em que dão suporte à qualidade do modelo.

3. Tipos de Tarefas de Machine Learning suportados

O MLNet dá suporte as seguintes tarefas de AutoML:

  • Classificação Binária
  • Classificação Multiclasse
  • Regressão
  • Recomendação
  • Ranking

 4. Problema a ser resolvido

Neste artigo novamente vamos trabalhar com o dataset California Housing Prices do Kaggle. Os seus dados contém informações do censo de 1990 na Califórnia – USA. Ele irá nos ajudar a prever os preços de habitações. Contudo neste estudo nós iremos deixar que o melhor modelo para a solução deste problema seja obtido através do recurso de AutoML  do ML.Net. Então, let’s code!!!

 5. Resolvendo nosso problema com AutoML

Agora iremos para a prática de nosso artigo percorrendo as etapas para a geração do nosso modelo com AutoML.

5.1 Instalar os pacotes do NuGet em seu notebook

Agora vamos declarar os pacotes do NuGet que iremos utilizar:

//Instalar os Pacotes do Nuget ML.NET
#r "nuget:Microsoft.ML"
//ML.NET FastTree
#r "nuget:Microsoft.ML.AutomML"

Agora estamos prontos para adicionar o nosso código, então vamos adicionar as instruções de uso:

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

using static Microsoft.ML.TrainCatalogBase;
using static Microsoft.ML.DataOperationsCatalog;

5.2 Declarar as classes de dados

Agora vamos declarar as classes de entrada da previsão e a classe para o resultado da previsão, serão as classes ModelInput e ModelOutput.

public class ModelInput
{
    [LoadColumn(0)]
    public float Longitude {get; set;}
    [LoadColumn(1)]
    public float Latitude {get; set;}
    [LoadColumn(2)]
    public float Housing_median_age {get; set;}
    [LoadColumn(3)]
    public float Total_rooms {get; set;}
    [LoadColumn(4)]
    public float Total_bedrooms {get; set;}
    [LoadColumn(5)]
    public float Population {get; set;}
    [LoadColumn(6)]
    public float Households {get; set;}
    [public (7)]
    public float Median_income {get; set;}
    [ColumnName("Label"), LoadColumn(8)]
    public float Median_house_value {get; set;}
    [LoadColumn(9)]
    public string Ocean_proximity {get; set;}
}
public class ModelOutput
{
    [ColumnName("Score")]
    public float Score {get; set;}
}

5.3 Criar o objeto MLContext e Separação dos Dados.

Aqui será criado o objeto MLContext para ser compartilhado entre os objetos de fluxo de trabalho de criação do modelo.

A novidade aqui é que iremos definir uma semente aleatória para tornar os resultados repetíveis/determinísticos diversos treinamentos.

MLContext mlContext = new MLContext(seed: 1);

Como nós já vimos possuímos apenas um único dataset. E por isso vamos chamar o método TrainTestSplit() para configurar um set com 80% dos dados para treinamento e  os 20% restantes para os testes.

private static IDataView trainingDataView;
private static IDataView testingDataView;
IDataView fullData = mlContext.Data.LoadFromTextFile<ModelInput>(path:     
                         housingPath, hasHeader: true,                                                                          
                         separatorChar: ',', allowQuoting: true, allowSparse: false);
DataOperationsCatalog.TrainTestData trainTestData = mlContext.Data.TrainTestSplit(fullData, testFraction: 0.2);
trainingDataView = trainTestData.TrainSet;
testingDataView = trainTestData.TestSet;

5.4 Criar o Experimento e definir as suas configurações.

Neste momento vamos criar as configurações definindo o seu tempo máximo da experiência em segundos, em seguida criamos a sua métrica de otimização:

var settings = new RegressionExperimentSettings
{
    MaxExperimentTimeInSeconds = ExperimentTime,
    OptimizingMetric = RegressionMetric.MeanAbsoluteError
};

Aqui será definida a coluna label do experimento.

var labelColumnInfo = new ColumnInformation()
{
    LabelColumnName = "Label"
};

Agora criamos um gerenciador de progresso que permite acompanhar o que está acontecendo no experimento.

var progress = new Progress<RunDetail<RegressionMetrics>>(p =>
{
    if (p.ValidationMetrics != null)
    {    
        Console.WriteLine($"Current Result – TrainerName: {p.TrainerName},  Runtime In Seconds: {p.RuntimeInSeconds:0.##}, RSquared: {p.ValidationMetrics.RSquared:0.##}, MeanAbsoluteError: {p.ValidationMetrics.MeanAbsoluteError:0.##}");
    }
});

Vamos criar e executar o experimento:

var experiment = mlContext.Auto().CreateRegressionExperiment(settings);

Então, temos o resultado da execução do experimentResult:

var experimentResult = experiment.Execute(trainDataView, labelColumnInfo, progressHandler: progress);

5.5 Salvar o Modelo em Disco

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

using (FileStream fs = File.Create(ModelPath))
            mlContext.Model.Save(bestRun.Model, trainDataView.Schema, fs);

5.6 Carregar o Modelo do Disco

O código abaixo carrega o Modelo do disco para que ele possa ser utilizado para nossas previsões:

ITransformer model = mlContext.Model.Load(modelPath, out var modelInputSchema);
var predEngine = mlContext.Model.CreatePredictionEngine <ModelInput,
                                                         ModelOutput>(model);

Agora vamos preencher um objeto do tipo ModelInput() para realizar uma previsão:

ModelInput sampleData = new ModelInput()
{
    Longitude = -122.23F,
    Latitude = 37.88F,
    Housing_median_age = 41F,
    Total_rooms = 880F,
    Total_bedrooms = 129F,
    Population = 322F,
    Households = 126F,
    Median_income = 8.3252F,
    Ocean_proximity = @"NEAR BAY",
};

E aqui vemos o resultado da previsão:

var resultprediction = predEngine.Predict(sampleData);
Console.WriteLine("Usando o modelo para fazer predição única - Comparando o valor atual de Median_house_value com o valor previsto de para os dados de amostra de Median_house_value ... \n \n");
Console.WriteLine($"Longitude: {sampleData.Longitude}");
Console.WriteLine($"Latitude: {sampleData.Latitude}");
Console.WriteLine($"Housing_median_age: {sampleData.Housing_median_age}");
Console.WriteLine($"Total_rooms: {sampleData.Total_rooms}");
Console.WriteLine($"Total_bedrooms: {sampleData.Total_bedrooms}");
Console.WriteLine($"Population: {sampleData.Population}");
Console.WriteLine($"Households: {sampleData.Households}");
Console.WriteLine($"Median_income: {sampleData.Median_income}");
Console.WriteLine($"Ocean_proximity: {sampleData.Ocean_proximity}");
Console.WriteLine ($"\n \nO Preço previsto para este tamanho é: {resultprediction.Score} \n \n");
Console.WriteLine ("=============== Fim do processo ===============");

5.7 Código Fonte do projeto

* O código do Projeto de exemplo pode ser encontrado no meu github.

6 Conclusões

Então neste artigo nós vimos um pouco sobre os conceitos de AutoML e a sua aplicação prática num exemplo de uso com ML.Net. 

Em nosso exemplo foi visto que podemos escolher a melhor métrica para a otimização do modelo

Neste caso escolhemos o Mean Absolute Error que é o erro médio absoluto, também conhecido como MAE que é uma das muitas métricas para resumir e avaliar a qualidade de um modelo de aprendizado de máquina.

Também foi demonstrado como explorar as métricas dos modelos e vimos que o  modelo escolhido pelo AutoML foi o Fast Tree Regression que é uma implementação de uma árvore de decisão com valores escalares em suas folhas.

O melhor de tudo foi perceber que em nossos artigos anteriores nós utilizamos o algoritmo do SDCA e que para esta métrica de avaliação o AutoML escolheu  Fast Tree Regression.

Espero que vocês tenham gostado do artigo e que possam visualizar o potencial do AutoML 😉

Nos veremos em breve num próximo artigo.

Caso tenham alguma dúvida ou queiram conversar um pouco mais sobre o assunto não deixem de entrar em contato.

 Referências

Gostou? Compartilhe!

Você pode gostar:

Comentários: