Compartilhar via


Criar um aplicativo de lista de campeonato com o Infer.NET e a programação probabilística

Este guia de instruções ensina você sobre a programação probabilística usando o Infer.NET. A programação probabilística é uma abordagem de aprendizado de máquina em que os modelos personalizados são expressados como programas de computador. Ela permite a incorporação de conhecimento de domínio aos modelos, além de tornar o sistema de aprendizado de máquina mais interpretável. Ela também dá suporte à inferência online – o processo de aprender à medida que novos dados são apresentados. O Infer.NET é usado em vários produtos da Microsoft no Azure, Xbox e Bing.

O que é programação probabilística?

A programação probabilística nos permite criar modelos estatísticos de processos do mundo real.

Pré-requisitos

  • Ambiente de desenvolvimento local.

    Este guia de instruções supõe que você tenha um computador que possa ser usado para desenvolvimento. O tutorial Olá, Mundo em 10 minutos tem instruções para configurar o ambiente de desenvolvimento local em macOS, PC ou Linux.

Criar o aplicativo

Abra um prompt de comando e execute os seguintes comandos:

dotnet new console -o myApp
cd myApp

O comando dotnet cria um aplicativo new do tipo console. O parâmetro -o cria um diretório chamado myApp onde o seu aplicativo é armazenado e o popula com os arquivos necessários. O comando cd myApp coloca você no diretório do aplicativo recém-criado.

Instalar o pacote Infer.NET

Para usar o Infer.NET, você precisa instalar o pacote Microsoft.ML.Probabilistic.Compiler. No prompt de comando, execute o seguinte comando:

dotnet add package Microsoft.ML.Probabilistic.Compiler

Projetar o modelo

O exemplo a seguir usa partidas de pingue-pongue ou pebolim dentro da empresa. Temos os participantes e o resultado de cada jogo. Queremos inferir habilidades do jogador usando esses dados. Suponha que cada jogador tenha uma habilidade latente distribuída normalmente e que o desempenho em uma determinada partida seja uma versão com ruídos dessa habilidade. Os dados forçam o desempenho do vencedor a ser superior ao desempenho do perdedor. Essa é uma versão simplificada do modelo popular do TrueSkill, que também dá suporte a equipes, sorteios e outras extensões. Uma versão avançada desse modelo é usada para organizar partidas em dois jogos muito vendidos, Halo e Gears of War.

Precisamos listar as habilidades inferidas do jogador com a respectiva variação – a medição da incerteza em torno das habilidades.

Dados de exemplo do resultado do jogo

Game Vencedor Perdedor
1 Jogador 0 Jogador 1
2 Jogador 0 Jogador 3
3 Jogador 0 Jogador 4
4 Jogador 1 Jogador 2
5 Jogador 3 Jogador 1
6 Jogador 4 Jogador 2

Observando atentamente os dados de exemplo, você perceberá que os jogadores 3 e 4 têm uma vitória e uma derrota. Vamos ver como ficariam as classificações usando a programação probabilística. Observe também que há um jogador zero, pois as listas de competição do escritório são baseadas em zero para nós, desenvolvedores.

Escrever algum código

Tendo projetado o modelo, é hora de expressá-lo como um programa probabilístico usando a API de modelagem do Infer.NET. Abra Program.cs em seu editor de texto de preferência e substitua todo o seu conteúdo pelo seguinte código:

namespace myApp

{
    using System;
    using System.Linq;
    using Microsoft.ML.Probabilistic;
    using Microsoft.ML.Probabilistic.Distributions;
    using Microsoft.ML.Probabilistic.Models;

    class Program
    {

        static void Main(string[] args)
        {
            // The winner and loser in each of 6 samples games
            var winnerData = new[] { 0, 0, 0, 1, 3, 4 };
            var loserData = new[] { 1, 3, 4, 2, 1, 2 };

            // Define the statistical model as a probabilistic program
            var game = new Range(winnerData.Length);
            var player = new Range(winnerData.Concat(loserData).Max() + 1);
            var playerSkills = Variable.Array<double>(player);
            playerSkills[player] = Variable.GaussianFromMeanAndVariance(6, 9).ForEach(player);

            var winners = Variable.Array<int>(game);
            var losers = Variable.Array<int>(game);

            using (Variable.ForEach(game))
            {
                // The player performance is a noisy version of their skill
                var winnerPerformance = Variable.GaussianFromMeanAndVariance(playerSkills[winners[game]], 1.0);
                var loserPerformance = Variable.GaussianFromMeanAndVariance(playerSkills[losers[game]], 1.0);

                // The winner performed better in this game
                Variable.ConstrainTrue(winnerPerformance > loserPerformance);
            }

            // Attach the data to the model
            winners.ObservedValue = winnerData;
            losers.ObservedValue = loserData;

            // Run inference
            var inferenceEngine = new InferenceEngine();
            var inferredSkills = inferenceEngine.Infer<Gaussian[]>(playerSkills);

            // The inferred skills are uncertain, which is captured in their variance
            var orderedPlayerSkills = inferredSkills
               .Select((s, i) => new { Player = i, Skill = s })
               .OrderByDescending(ps => ps.Skill.GetMean());

            foreach (var playerSkill in orderedPlayerSkills)
            {
                Console.WriteLine($"Player {playerSkill.Player} skill: {playerSkill.Skill}");
            }
        }
    }
}

Executar o aplicativo

No prompt de comando, execute o seguinte comando:

dotnet run

Resultados

Os resultados devem ser semelhantes aos seguintes:

Compiling model...done.
Iterating:
.........|.........|.........|.........|.........| 50
Player 0 skill: Gaussian(9.517, 3.926)
Player 3 skill: Gaussian(6.834, 3.892)
Player 4 skill: Gaussian(6.054, 4.731)
Player 1 skill: Gaussian(4.955, 3.503)
Player 2 skill: Gaussian(2.639, 4.288)

Nos resultados, observe que o jogador 3 está classificado ligeiramente acima do jogador 4, de acordo com o nosso modelo. Isso porque a vitória do jogador 3 sobre o jogador 1 é mais significativa do que a vitória do jogador 4 sobre o jogador 2 – observe que o jogador 1 ganha do jogador 2. O jogador 0 é o campeão absoluto!

Continuar aprendendo

Projetar modelos estatísticos é uma habilidade por si só. A equipe da Microsoft Research Cambridge disponibilizou um livro online gratuito, que fornece uma breve introdução ao artigo. O Capítulo 3 deste livro aborda o modelo do TrueSkill em mais detalhes. Assim que tiver um modelo em mente, você pode transformá-lo em código usando a extensa documentação no site do Infer.NET.

Próximas etapas

Confira o repositório GitHub do Infer.NET para continuar aprendendo e encontrar mais exemplos.