Julho de 2019
Volume 34, Número 7
[Machine Learning]
Criar um Sistema de Previsão de Aprendizado de Máquina Usando AutoML
Por James McCaffrey
A Microsoft ML.NET é uma grande biblioteca de funções de aprendizado de máquina de software livre que permite criar um modelo de previsão usando um programa de linguagem C#, normalmente no Visual Studio. A codificação de um programa que usa ML.NET diretamente para criar um modelo de previsão não é simples. O sistema AutoML usa a ferramenta CLI (interface de linha de comando) do ML.NET a fim de criar um modelo de previsão automaticamente e também gera um código de exemplo que usa o modelo e pode ser personalizado por você posteriormente.
Uma boa maneira de entender o que a CLI do ML.NET e o AutoML são, e ver para onde este artigo está caminhando, é examinando a captura de tela de um sistema de demonstração na Figura 1. A demonstração usa um arquivo de dados de treinamento chamado people_train.tsv para criar um modelo de previsão e um arquivo de dados de teste chamado people_test.tsv para avaliar a precisão do modelo de previsão. A meta da demonstração é prever a inclinação política de uma pessoa (conservadora, moderada, liberal) com base na idade, no sexo, na área geográfica e na renda anual.
Figura 1 AutoML e CLI do ML.NET na prática
O programa de demonstração executa o AutoML em um shell Windows CMD com o comando:
mlnet auto-train ^
--task multiclass-classification ^
--dataset ".\Data\people_train.tsv" ^
--test-dataset ".\Data\people_test.tsv" ^
--label-column-name politic ^
--max-exploration-time 5
O caractere de acento circunflexo é usado para a continuação de linha em um shell de comando. O mesmo comando do AutoML pode ser executado também no PowerShell, pelo uso do caractere de continuação de linha de acento grave em vez do circunflexo.
O AutoML cria e avalia automaticamente vários modelos de machine learning diferentes usando algoritmos diferentes, como SgdCalibratedOva (“stochastic gradient descent calibrated one versus all”) e AveragedPerceptronOva. Para a execução da demonstração, o AutoML identificou o algoritmo LightGbmMulti (“lightweight gradient boosting machine multiclass”) como a melhor opção, com uma precisão de previsão de 77,01% nos dados de teste.
Depois de examinar os diferentes modelos de previsão, o AutoML salvou o melhor modelo como MLModel.zip e gerou também um código de exemplo em C# e um arquivo de projeto do Visual Studio com o longuíssimo nome SampleMulticlassClassification.Console.App.csproj para usar no modelo.
A Figura 2 mostra um exemplo de como o modelo treinado pode ser usado dentro de um programa em C#. O código gerado foi editado para fazer uma previsão sobre uma pessoa de 33 anos do sexo masculino que vive na região “central” e tem uma renda anual de US$ 62.000. A previsão é que a pessoa é politicamente “moderada”.
Figura 2 Usando o modelo do AutoML para fazer uma previsão
O programa de demonstração também exibe as probabilidades de previsão de conservadores, moderados, liberais: (0,0034, 0,9055, 0,0912). Elas não são probabilidades reais no sentido matemático, mas podem dar uma leve sugestão da confiança da previsão. Neste caso, o modelo parece estar bem certo (p = 0,9055) de que a pessoa é “moderada”.
Tanto a CLI do ML.NET quanto o AutoML estão atualmente no modo Visão prévia e em rápido desenvolvimento, ou seja, algumas informações apresentadas aqui já poderão ter mudado quando você ler este artigo. No entanto, a maioria das mudanças deve ocorrer como adições de recursos em vez alterações da arquitetura subjacente.
Este artigo assume que você tem habilidades intermediárias ou superiores em C# e está familiarizado pelo menos com o básico de se trabalhar em um shell de comando, mas não assume que você sabe tudo sobre a CLI do ML.NET ou o AutoML. O código de demonstração na íntegra é apresentado neste artigo. Os dois arquivos de dados de demonstração estão disponíveis na seção de download que acompanha este artigo.
Compreendendo os dados
A maioria dos problemas de aprendizado de máquina começa na análise e na preparação dos dados disponíveis, e isso também ocorre no uso da CLI do ML.NET e do AutoML. Os dados de treinamento têm 1.000 itens e se parecem com isto:
sex age region income politic
False 26 eastern 53800.00 conservative
False 19 western 39200.00 moderate
True 19 central 80800.00 liberal
False 52 eastern 86700.00 conservative
False 56 eastern 89200.00 liberal
...
Os dados de teste têm o mesmo formato e consistem em 200 itens. Os dados são sintéticos e foram gerados programaticamente. Ambos os arquivos são delimitados por tabulação e têm uma extensão .tsv para identificá-los assim para o AutoML. O AutoML também dá suporte a arquivos delimitados por espaço (.txt) e por vírgulas (.csv). O AutoML dá suporte a arquivos de dados com ou sem linha de cabeçalho, mas, como você verá em breve, ter uma linha de cabeçalho é mais conveniente.
Embora existam vários tipos de problemas de previsão, há três tipos fundamentais: classificação multiclasse, classificação binária e regressão. A meta do problema de classificação multiclasse é prever um valor distinto quando há três ou mais valores possíveis a se considerar. Por exemplo, a previsão da inclinação política (conservador, moderado, liberal) de uma pessoa com base na idade, no sexo, na área geográfica e na renda anual, como no programa de demonstração.
A meta de um problema de classificação binária é prever um valor distinto que possa ser um dentre dois valores possíveis. Por exemplo, você pode querer prever o sexo (masculino ou feminino) de uma pessoa com base na idade, na área geográfica, na renda e na inclinação política. Se você não está familiarizado com aprendizado de máquina, pode achar um pouco estranho que a classificação binária e a classificação multiclasse sejam categorias diferentes. Mas os dois tipos de problema têm algumas diferenças matemáticas fundamentais.
A meta de um problema de regressão é prever um único valor numérico. Por exemplo, você pode querer prever a renda anual de uma pessoa com base na idade, no sexo, na área geográfica e na inclinação política. O AutoML dá suporte atualmente à classificação multiclasse, à classificação binária e à regressão. O suporte a outros tipos de problema serão adicionados eventualmente, como classificação e clustering.
Os arquivos de dados de demonstração ilustram o uso de dados binários, inteiros, categóricos e de ponto flutuante. Ao trabalhar com dados binários, como a variável sex, você deve usar Verdadeiro ou Falso (com maiúsculas ou minúsculas) em vez de 0 e 1. A demonstração usa Falso para masculino e Verdadeiro para feminino, ou seja, pense na variável sex como “is-female”.
É importante manter os arquivos e diretórios do AutoML organizados. Criei um diretório de nível superior chamado MLdotNET. Em MLdotNET, criei um diretório chamado People para atuar como raiz para arquivos do AutoML associados aos dados de pessoas. No diretório People, criei um diretório chamado Data e coloquei os arquivos people_train.tsv e people_test.tsv lá. Executei comandos do AutoML enquanto estava no diretório People porque o AutoML gera subdiretórios dentro do diretório raiz no qual os comandos são executados.
Instalando o AutoML
Como costuma ocorrer com software em pré-lançamento, encontrei várias pequenas falhas durante a instalação do AutoML, e você pode esperar alguns contratempos também. Resumidamente, existem três etapas para fazer o AutoML funcionar. Primeiro, instale o Visual Studio, se necessário. Segundo, instale o SDK do .NET Core, se necessário. Terceiro, instale a ferramenta CLI do ML.NET que contém o AutoML.
É possível usar o AutoML sem o Visual Studio, mas os modelos criados pelo AutoML são projetados especificamente para o Visual Studio. Usei o Visual Studio 2017 e a edição Visual Studio Community 2017 gratuita com êxito. A documentação do AutoML indica que ele funciona com o Visual Studio 2019, mas não consegui carregar meus modelos nele.
O sistema AutoML depende da estrutura .NET Core, especialmente do SDK do .NET Core. Depois de algumas tentativas, tive êxito ao instalar o SDK versão 2.2.101. O processo de instalação usa um executável de extração automática padrão com um bom GUI. A instalação do SDK do .NET Core também dá a você o ambiente de tempo de execução, para você não ter que instalá-lo separadamente.
Depois de instalar o SDK do .NET Core, a última etapa é instalar o AutoML. O AutoML não é um programa independente; ele reside em uma ferramenta chamada mlnet, o que é um pouco confuso. Para instalar a ferramenta mlnet, inicie um shell (CMD ou PowerShell) e execute o comando > dotnet tool install -g mlnet. O comando busca na Internet (ou seja, você precisa estar online) um repositório padrão e instala o mlnet em um local padrão no seu computador. Depois de algumas tentativas, acabei recebendo a mensagem “A ferramenta mlnet (versão 0.3.0) foi instalada com sucesso”. Verifiquei a instalação executando o comando > dotnet tool list -g.
O diagrama na Figura 3 mostra o relacionamento entre os componentes principais usados em um sistema AutoML.
Figura 3 Componentes do AutoML
Classificação multiclasse
Para criar um problema de classificação multiclasse usando AutoML, é necessário usar no mínimo três argumentos. Por exemplo:
mlnet auto-train ^
--task multiclass-classification ^
--dataset ".\Data\people_train.tsv" ^
--label-column-name politic ^
O tipo de tarefa pode ser “classificação multiclasse”, “classificação binária” ou “regressão”. O argumento dataset especifica o caminho até os dados de treinamento. Você pode usar caracteres de barra invertida, estilo Windows, ou barra “/”, estilo Linux. O argumento test-dataset é opcional. Se test-dataset não estiver presente, o AutoML avaliará o modelo treinado usando os dados de treinamento.
Você pode fornecer um argumento validation-dataset opcional para permitir que o AutoML use o paradigma train-validate-test. Durante o treinamento, o AutoML monitora o erro associado ao modelo nos dados de validação e quando o erro começar a aumentar, o treinamento pode parar mais cedo para que o modelo não fique muito adequado aos dados de treinamento.
O argumento label-column-name especifica o nome da coluna que contém a variável a ser prevista. Se seu conjunto de dados de treinamento não tem um cabeçalho, você pode usar o argumento label-column-index com um índice de coluna baseado em 1, por exemplo, label-column-index 5.
A tabela na Figura 4 resume os 14 argumentos do AutoML. Cada argumento tem um nome completo precedido de hífen duplo e um alias de atalho de uma letra (que diferencia maiúsculas de minúsculas) precedido de um único hífen. O significado da maioria dos argumentos é autoexplicativo. O argumento --cache manda o AutoML carregar todos os dados na memória, se possível (on) ou não (off), para determinar automaticamente o que fazer.
Figura 4 Resumo de comandos do AutoML
Argumento | Alias | Valores | Valor padrão |
--task | -T | multiclass classification, binary classification, regression | |
--dataset | -d | caminho para o arquivo | |
--test-dataset | -t | caminho para o arquivo | nenhum |
--validation-dataset | -v | caminho para o arquivo | nenhum |
--label-column-name | -n | nome da coluna no cabeçalho da variável a ser prevista | |
--label-column-index | -i | índice de coluna baseado em 1 no cabeçalho da variável a ser prevista | |
--ignore-columns | -I | nomes de coluna separados por vírgulas no cabeçalho a serem ignorados | nenhum |
--has-header | -h | true, false | true |
--max-exploration-time | -x | tempo em segundos | 10 |
--verbosity | -V | quiet, minimal, diagnostic | minimal |
--cache | -c | on, off, auto | auto |
--name | -N | nome do projeto resultante criado | Sample{task} |
--output-path | -o | diretório onde colocar o projeto resultante | diretório atual |
--help | -h |
O argumento --max-exploration-time tem o maior impacto nos resultados do AutoML. Em geral, quanto mais tempo você dá ao AutoML para trabalhar, melhor é o modelo de previsão gerado. O AutoML faz o que é, na verdade, uma dupla exploração. Primeiro, ele experimenta algoritmos diferentes que se aplicam ao tipo de tarefa de previsão. Por exemplo, para um problema de classificação multiclasse, o AutoML atualmente dá suporte a 10 algoritmos: AveragedPerceptronOva, FastForestOva, FastTreeOva, LbfgsLogisticRegressionOva, LbfgsMaximumEntropyMulti, LightGbmMulti, LinearSvmOva, SdcaMaximumEntropyMulti, SgdCalibratedOva, SymbolicSgdLogisticRegressionOva.
Segundo, para cada algoritmo aplicável, o AutoML experimenta valores diferentes de hiperparâmetros que são específicos ao algoritmo. Por exemplo, o algoritmo FastTreeOva exige que você especifique valores para cinco parâmetros: NumberOfLeaves, MinimumExampleCountPerLeaf, NumberOfTrees, LearningRate e Shrinkage. O algoritmo LightGbmMulti exige valores para 13 parâmetros, incluindo expressões como NumberOfIterations, LearningRate e L2Regularization.
A quantidade de diferentes combinações de algoritmos e hiperparâmetros é absurdamente grande. Os especialistas humanos em aprendizado de máquina usam intuição e experiência para encontrar um bom algoritmo e um bom conjunto de hiperparâmetros, mas o processo é extremamente entediante e demorado. O AutoML faz uma pesquisa sofisticada automaticamente.
Interpretando os resultados
Se você consultar a captura de tela na Figura 1, verá que o AutoML exibe essas informações para os cinco melhores modelos encontrados:
Trainer MicroAccuracy MacroAccuracy
1 LightGbmMulti 0.7701 0.7495
2 FastTreeOva 0.7471 0.7201
3 FastForestOva 0.7471 0.7236
4 AveragedPerceptronOva 0.4598 0.3333
5 LinearSvmOva 0.4598 0.3333
Os valores MicroAccuracy e MacroAccuracy dão duas métricas diferentes para a precisão da previsão do modelo. MicroAccuracy é a mais importante delas. MicroAccruacy é precisão normal; simplesmente o número de previsões corretas no teste dividido pelo número total de itens. O conjunto de dados de teste tem 200 itens e o melhor algoritmo, LightGbmMulti, pontuou 77,01%, o que dá 154 corretos em 200.
MacroAccuracy é a precisão média entre as classes a serem previstas. Por exemplo, digamos que o conjunto de dados de teste de 200 itens tem 60 itens conservadores, 90 itens moderados e 50 itens liberais. E digamos que um modelo tenha previsto corretamente 45 em 60 (0,7500) itens conservadores, 63 em 90 (0,7000) itens moderados e 30 em 50 (0,6000) itens liberais. Assim, a MacroAccuracy do modelo é (0,7500 + 0,7000 + 0,6000)/3 = 0,6833.
MacroAccuracy é útil quando um conjunto de dados está bastante distorcido em relação a uma classe. Por exemplo, se o conjunto de dados de teste tivesse 180 itens conservadores, 10 itens moderados e 10 itens liberais, o modelo poderia simplesmente prever todos os itens como conservadores e pontuar 180/200 = 0,9000 em MicroAccuracy, mas a MacroAccurcy seria apenas de (0,9000 + 0,0000 + 0,0000)/3 = 0,3000. Assim, uma grande discrepância entre os valores de MicroAccuracy e MacroAccuracy deve ser investigada.
Usando o modelo gerado
A criação de um modelo de previsão de aprendizado de máquina é interessante, mas o objetivo mesmo é usar o modelo para fazer previsões. O AutoML cria um subdiretório chamado SampleMulticlassClassification no diretório raiz People. Você pode especificar um nome mais descritivo usando o argumento --name. O subdiretório contém diretórios que armazenam o modelo gerado em formato .zip e um aplicativo de console C# gerado automaticamente que pode ser usado como modelo para fazer previsões.
O código gerado automaticamente é claro e fácil de interpretar. Cliquei duas vezes no arquivo SampleMulticlassClassification.sln, que iniciou o Visual Studio 2017, e usei o arquivo Solution para carregar o projeto em C#. O código de exemplo faz uma previsão usando o primeiro item de dados do arquivo do conjunto de dados de teste. Editei o código do modelo para fazer uma previsão sobre a inclinação política de uma pessoa nova e desconhecida, como mostra a Figura 2.
O código de previsão editado é iniciado carregando o modelo treinado na memória e usando o modelo para criar um objeto PredictionEngine:
static void Main(string[] args)
{
MLContext mlContext = new MLContext();
ITransformer mlModel =
mlContext.Model.Load(GetAbsolutePath(MODEL_FILEPATH),
out DataViewSchema inputSchema);
var predEngine =
mlContext.Model.CreatePredictionEngine<ModelInput,
ModelOutput>(mlModel);...
Em seguida, o código personalizado configura os valores de previsão para uma pessoa:
Console.WriteLine("\nPredicting politic for Age = 33,
Sex = Male, Region = central, Income = $62,000.00");
ModelInput X = new ModelInput();
X.Age = 33; X.Sex = false;
X.Region = "central"; X.Income = 62000.00f; ...
Lembre-se de que as variáveis de previsão binária, como Sexo, são codificadas como booliano. E observe que a variável Income tem um “f” no final para definir o valor como tipo float, que é o tipo de ponto flutuante padrão usado pelos sistemas ML.NET. A variável Age também é do tipo float, mas não exige um “f” no final porque o valor não contém casa decimal e é definido como float automaticamente.
A previsão é feita da seguinte forma:
ModelOutput Y = predEngine.Predict(X);
string predPolitic = Y.Prediction;
float[] predProbs = Y.Score;...
A propriedade Prediction é uma representação de cadeia de caracteres da classe prevista (“moderada” na demonstração) e Score é uma matriz de valores float que correspondem a cada classe possível: (0,0034, 0,9055, 0,0912). O sistema AutoML usa os rótulos de classe na ordem em que aparecem nos dados de treinamento. A recuperação dos dados de treinamento fica assim:
sex age region income politic
False 26 eastern 53800.00 conservative
False 19 western 39200.00 moderate
True 19 central 80800.00 liberal
False 52 eastern 86700.00 conservative
Ou seja, “conservador” é [0], “moderado” é [1] e “liberal” é [2]. Quando uso AutoML, costumo reorganizar as primeiras linhas dos meus dados de treinamento para criar uma ordem melhor dos valores a serem previstos.
Classificação binária e regressão
Depois de entender os princípios de uso do AutoML para criar e usar um modelo de previsão em um problema de classificação multiclasse, é relativamente simples trabalhar com problemas de classificação binária e regressão. Por exemplo, você poderia executar o seguinte comando para criar um modelo a fim de prever o sexo de uma pessoa com base na idade, na área geográfica, na renda e na inclinação política:
mlnet auto-train ^
--task binary-classification ^
--dataset ".\Data\people_train.tsv" ^
--test-dataset ".\Data\people_test.tsv" ^
--label-column-name sex ^
--max-exploration-time 300
E poderia usar este comando para prever a renda anual com base na idade, no sexo e na inclinação política, mas não na área geográfica:
mlnet auto-train ^
--task regression ^
--dataset ".\Data\people_train.tsv" ^
--test-dataset ".\Data\people_test.tsv" ^--ignore-columns region ^
--label-column-name income ^
--max-exploration-time 300
Os comandos de classificação binária e regressão produzem métricas de resultado diferentes das da classificação multiclasse. A classificação binária exibe métricas Accuracy, AUC, AUPRC e F1-score. Resumidamente, AUC é “área abaixo da curva” da função de características operacionais do receptor e é uma medida da qualidade da separação de duas classes em um problema de classificação binária. É melhor ter valores mais altos de AUC. AUPRC é “área abaixo da curva de revogação de precisão”, o que é uma métrica mais ou menos semelhante e também é melhor com valores mais altos. O F1-score é a média de precisão e revogação, e ambas são métricas em que é melhor ter valores mais altos.
O uso do AutoML para regressão exibe R2, Perda absoluta, Perda 2 e Perda de valor eficaz. É melhor ter valores mais altos de R2 e valores mais baixos de Perda absoluta, Perda2 e Perda de valor eficaz. Se você é novo na área de aprendizado de máquina, não fique tão preocupado com essas estatísticas. É prática comum dar muitas métricas em aprendizado de máquina. Precisão é normalmente a métrica principal a se levar em conta.
Mas observe que não existem métrica de precisão em um modelo de regressão. Isso ocorre porque não existe uma definição inerente do que é uma previsão correta em um problema de regressão. Por exemplo, se a renda anual prevista é US$ 58.001 e a renda anual real é US$ 58.000, a previsão estava certa?
Em problemas de regressão, você deve definir um significado de precisão de acordo com o problema. Normalmente você deve especificar uma diferença tolerável em porcentagem. Por exemplo, se você especificar uma porcentagem de 0,10 e a renda correta é US$ 60.000, qualquer renda prevista entre US$ 54.000 e US$ 66.000 será considerada uma previsão correta.
O código de modelo gerado pelo AutoML facilita a computação de precisão em um problema de previsão. Em pseudocódigo:
loop each line in test dataset file
parse out sex, age, region, politic, and correct income
use sex, age, region, politic to compute predicted income
if predicted is within x% of correct
increment number correct
else
increment number wrong
end-loop
return number correct / (number correct + number wrong)
Estes exemplos devem dar uma boa ideia dos tipos de problemas que podem ser enfrentados com o AutoML e o ML.NET. Um tipo de aprendizado de máquina que o AutoML e o ML.NET não resolvem é previsão com base em uma rede neural. As redes neurais são bem mais complexas que os algoritmos tradicionais de aprendizado de máquina a que o AutoML dá suporte. Houve um debate para adicionar funcionalidades de rede neural ao ML.NET e ao AutoML, mas elas não devem ser adicionadas em breve.
Uma vantagem interessante em usar o AutoML é que, além de gerar código de modelo para carregar um modelo treinado e usá-lo para fazer previsões, o AutoML gera um arquivo ModelBuilder.cs contendo o código subjacente que foi usado para criar, treinar e salvar o modelo de previsão. Por exemplo, parte do código gerado no arquivo ModelBuilder.cs para o exemplo de classificação multiclasse é:
// Set the training algorithm
var trainer = mlContext.MulticlassClassification.Trainers.
LightGbm(labelColumnName: "politic",
featureColumnName: "Features").Append(mlContext.Transforms.Conversion.
MapKeyToValue("PredictedLabel", "PredictedLabel"));
var trainingPipeline = dataProcessPipeline.Append(trainer);
Se quiser explorar a criação de modelos de previsão usando ML.NET manualmente no Visual Studio em vez de fazê-lo automaticamente no AutoML, você poderá usar o código do ModelBuilder.cs como ponto de partida. Isso é bem mais fácil do que codificar do zero.
Conclusão
Estou bem impressionado com minha primeira análise do AutoML. Eu poderia descrever os grandes recursos técnicos, mas o mais importante é que o AutoML “parece familiar”. A CLI é simples e fácil de usar, e o código de modelo gerado é limpo e fácil de modificar. Em outras palavras, o AutoML parece me ajudar em vez de atrapalhar.
O AutoML é apenas uma parte de um ecossistema crescente de ferramentas e sistemas de aprendizado de máquina. Esse ecossistema está se expandindo tão rapidamente que até meus colegas e eu, que trabalho constantemente com as fontes desses novos sistemas, estamos tendo dificuldades de nos mantermos a par de tudo. Sistemas que já estão por aí há alguns anos, como os Serviços Cognitivos do Azure, o Azure Machine Learning Studio e as Máquinas Virtuais de Ciência de Dados do Azure, estão recebendo a companhia de novatos como o SDK do Azure Data Prep, o NimbusML e o ONNX Runtime. É uma época incrível para desenvolver sistemas de aprendizado de máquina usando o .NET e tecnologias de software livre.
Dr. James McCaffreytrabalha para a Microsoft Research em Redmond, Washington. Ele trabalhou em vários produtos importantes da Microsoft, incluindo o Azure e o Bing. Dr. McCaffrey pelo email jamccaff@microsoft.com.
Agradecemos aos seguintes especialistas técnicos da Microsoft pela revisão deste artigo: Chris Lee, Ricky Loynd