Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este guia de instruções ensina sobre programação probabilística usando Infer.NET. A programação probabilística é uma abordagem de machine learning em que modelos personalizados são expressos como programas de computador. Ele permite incorporar o conhecimento de domínio nos modelos e torna o sistema de machine learning mais interpretável. Ele também dá suporte à inferência online – o processo de aprendizado à 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 que você crie modelos estatísticos de processos reais.
Pré-requisitos
Ambiente de desenvolvimento local.
Este guia de instruções espera que você tenha um computador que possa ser usado 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 seu aplicativo
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 é armazenado e o preenche com os arquivos necessários. O cd myApp comando coloca você no diretório do aplicativo recém-criado.
Instalar Infer.NET pacote
Para usar 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
Ou, no .NET 10+:
dotnet package add Microsoft.ML.Probabilistic.Compiler
Projetar seu modelo
O exemplo de exemplo usa jogos de tênis de mesa ou pebolim jogados no escritório. Você tem os participantes e o resultado de cada partida. Você deseja inferir as habilidades do jogador com base nesses dados. Suponha que cada jogador tenha uma habilidade latente normalmente distribuída e seu desempenho em partidas é uma versão ruidosa 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 dá suporte a equipes, sorteios e outras extensões. Uma versão avançada desse modelo é usada para fazer matchmaking nos títulos mais vendidos do jogo Halo e Gears of War.
Você precisa listar as habilidades inferidas do jogador, juntamente com sua variação – a medida de incerteza em torno das habilidades.
Dados de exemplo de resultado do jogo
| Jogo | Ganhador | 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 uma visão mais detalhada dos dados de exemplo, você observará que os jogadores 3 e 4 têm uma vitória e uma derrota. Vamos ver como são as classificações usando 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 Infer.NET. Abra Program.cs em seu editor de texto favorito e substitua todo o 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
Seus 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 é classificado ligeiramente acima do jogador 4 de acordo com o 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 vence o jogador 2. O jogador 0 é o campeão geral!
Continuar aprendendo
Projetar modelos estatísticos é uma habilidade por conta própria. A equipe da Microsoft Research Cambridge escreveu um livro online gratuito, que dá uma introdução gentil 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 documentação abrangente no site do Infer.NET.
Próximas etapas
Confira o Infer.NET repositório do GitHub para continuar aprendendo e encontrar mais exemplos.