Partilhar via


Criar um aplicativo de lista de correspondência de jogos com programação Infer.NET e probabilística

Este guia de instruções ensina sobre programação probabilística usando Infer.NET. A programação probabilística é uma abordagem de aprendizado de máquina onde modelos personalizados são expressos como programas de computador. Ele permite incorporar conhecimento de domínio nos modelos e torna o sistema de aprendizado de máquina mais interpretável. Também suporta a inferência online – o processo de aprendizagem à medida que novos dados chegam. 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 permite criar modelos estatísticos de processos do mundo real.

Pré-requisitos

  • Ambiente de desenvolvimento local.

    Este guia de instruções espera que você tenha uma máquina que possa usar para desenvolvimento. O tutorial do .NET Hello World em 10 minutos tem instruções para configurar seu ambiente de desenvolvimento local no macOS, Windows ou Linux.

Criar a sua aplicação

Abra um novo prompt de comando e execute os seguintes comandos:

dotnet new console -o myApp
cd myApp

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

Instalar Infer.NET pacote

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

dotnet add package Microsoft.ML.Probabilistic.Compiler

Projete o seu modelo

O exemplo de exemplo usa tênis de mesa ou partidas de pebolim jogadas no escritório. Você tem os participantes e o resultado de cada partida. Você quer inferir as habilidades do jogador a partir desses dados. Suponha que cada jogador tem uma habilidade latente normalmente distribuída e seu desempenho de partida dado é uma versão barulhenta dessa habilidade. Os dados restringem o desempenho do vencedor a ser maior do que o desempenho do perdedor. Esta é uma versão simplificada do popular modelo TrueSkill , que também suporta equipes, sorteios e outras extensões. Uma versão avançada deste modelo é usada para matchmaking nos títulos de jogos mais vendidos Halo e Gears of War.

Você precisa listar as habilidades inferidas do jogador, juntamente com sua variância – a medida da incerteza em torno das habilidades.

Dados de amostra de resultados de jogos

Jogo 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

Com um olhar mais atento aos dados da amostra, você notará que os jogadores 3 e 4 têm uma vitória e uma derrota. Vamos ver como são os rankings usando programação probabilística. Observe também que há um jogador zero porque até mesmo as listas de correspondência de escritório são zero baseadas para nós desenvolvedores.

Escreva algum código

Tendo projetado o modelo, é hora de expressá-lo como um programa probabilístico usando a API de modelagem Infer.NET. Abra Program.cs no seu editor de texto favorito 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 a aplicação

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á 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 – note que o jogador 1 vence o jogador 2. O jogador 0 é o campeão geral!

Continuar a aprender

Projetar modelos estatísticos é uma habilidade por si só. A equipa da Microsoft Research Cambridge escreveu um livro online gratuito, que dá uma introdução suave ao artigo. O capítulo 3 deste livro aborda o modelo TrueSkill com mais detalhes. Depois de ter um modelo em mente, você pode transformá-lo em código usando a extensa documentação no site da Infer.NET.

Próximos passos

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