Een game match up list-app maken met Infer.NET en probabilistisch programmeren
In deze handleiding leert u over probabilistisch programmeren met behulp van Infer.NET. Probabilistisch programmeren is een machine learning-benadering waarbij aangepaste modellen worden uitgedrukt als computerprogramma's. Het maakt het mogelijk om domeinkennis in de modellen op te nemen en maakt het machine learning-systeem beter te interpreteren. Het biedt ook ondersteuning voor onlinedeductie: het proces van leren wanneer nieuwe gegevens binnenkomen. Infer.NET wordt gebruikt in verschillende producten van Microsoft in Azure, Xbox en Bing.
Wat is probabilistisch programmeren?
Met probabilistische programmering kunt u statistische modellen van echte processen maken.
Vereisten
Lokale ontwikkelomgeving.
In deze handleiding wordt verwacht dat u een machine hebt die u voor ontwikkeling kunt gebruiken. De .NET-zelfstudie Hallo wereld in 10 minuten bevat instructies voor het instellen van uw lokale ontwikkelomgeving op macOS, Windows of Linux.
Uw app maken
Open een nieuwe opdrachtprompt en voer de volgende opdrachten uit:
dotnet new console -o myApp
cd myApp
Met de dotnet
opdracht wordt een new
toepassing van het type console
gemaakt. De -o
parameter maakt een map met de naam myApp
waar uw app is opgeslagen en vult deze met de vereiste bestanden. Met de cd myApp
opdracht wordt u in de zojuist gemaakte app-map gebracht.
Infer.NET-pakket installeren
Als u Infer.NET wilt gebruiken, moet u het Microsoft.ML.Probabilistic.Compiler
pakket installeren. Voer in de opdrachtprompt de volgende opdracht uit:
dotnet add package Microsoft.ML.Probabilistic.Compiler
Uw model ontwerpen
In het voorbeeldvoorbeeld worden tafeltennis- of foosbalwedstrijden gebruikt die op kantoor worden gespeeld. U hebt de deelnemers en het resultaat van elke overeenkomst. U wilt de vaardigheden van de speler afleiden uit deze gegevens. Stel dat elke speler een normaal gedistribueerde latente vaardigheid heeft en dat hun opgegeven wedstrijdprestaties een luidruchtige versie van deze vaardigheid is. De gegevens beperken de prestaties van de winnaar om groter te zijn dan de prestaties van de verliezer. Dit is een vereenvoudigde versie van het populaire TrueSkill-model , dat ook teams, trekkingen en andere extensies ondersteunt. Een geavanceerde versie van dit model wordt gebruikt voor matchmaking in de best verkopende gametitels Halo en Gears of War.
U moet de uitgestelde spelervaardigheden vermelden, samen met hun variantie: de mate van onzekerheid over de vaardigheden.
Voorbeeldgegevens van gameresultaten
Game | Winnaar | Verliezer |
---|---|---|
1 | Speler 0 | Speler 1 |
2 | Speler 0 | Speler 3 |
3 | Speler 0 | Speler 4 |
4 | Speler 1 | Speler 2 |
5 | Speler 3 | Speler 1 |
6 | Speler 4 | Speler 2 |
Met een nader overzicht van de voorbeeldgegevens ziet u dat spelers 3 en 4 beide één winst en één verlies hebben. Laten we eens kijken hoe de classificaties eruitzien met behulp van probabilistisch programmeren. U ziet ook dat er een speler nul is, omdat zelfs office-overeenkomstenlijsten nul zijn op basis van onze ontwikkelaars.
Code schrijven
Nadat u het model hebt ontworpen, is het tijd om het uit te drukken als een probabilistisch programma met behulp van de Infer.NET modellerings-API. Open Program.cs
in uw favoriete teksteditor en vervang alle inhoud door de volgende code:
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}");
}
}
}
}
Voer uw app uit
Voer in de opdrachtprompt de volgende opdracht uit:
dotnet run
Resultaten
Uw resultaten moeten er ongeveer als volgt uitzien:
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)
In de resultaten ziet u dat speler 3 iets hoger is dan speler 4 volgens ons model. Dat komt doordat de overwinning van speler 3 op speler 1 belangrijker is dan de overwinning van speler 4 ten opzichte van speler 2 – houd er rekening mee dat speler 1 speler 2 slaat. Speler 0 is de algehele kampioen!
Blijf leren
Het ontwerpen van statistische modellen is een eigen vaardigheid. Het Microsoft Research Cambridge-team heeft een gratis online boek geschreven, dat een zachte inleiding geeft tot het artikel. Hoofdstuk 3 van dit boek behandelt het TrueSkill-model in meer detail. Zodra u een model in gedachten hebt, kunt u het transformeren in code met behulp van de uitgebreide documentatie op de Infer.NET website.
Volgende stappen
Bekijk de Infer.NET GitHub-opslagplaats om verder te leren en meer voorbeelden te vinden.