Freigeben über


Erstellen einer App für eine Spielerrangliste anhand der Auswertung von Spielpartien mit Infer.NET und probabilistischer Programmierung

In diesem Anleitungshandbuch erfahren Sie mehr über die probabilistische Programmierung mithilfe von Infer.NET. Probabilistische Programmierung ist ein Machine Learning-Ansatz, bei dem benutzerdefinierte Modelle als Computerprogramme ausgedrückt werden. Es ermöglicht die Einbindung von Domänenwissen in die Modelle und macht das maschinelle Lernsystem interpretierbarer. Sie unterstützt auch Online-Schlussfolgerungen – der Lernprozess, wenn neue Daten eintreffen. Infer.NET wird in verschiedenen Produkten von Microsoft in Azure, Xbox und Bing verwendet.

Was ist probabilistische Programmierung?

Die probabilistische Programmierung ermöglicht es Ihnen, statistische Modelle von realen Prozessen zu erstellen.

Voraussetzungen

  • Lokale Entwicklungsumgebung.

    Diese Anleitung erwartet, dass Sie über einen Computer verfügen, den Sie für die Entwicklung verwenden können. Das .NET-Lernprogramm Hello World in 10 Minuten enthält Anweisungen zum Einrichten Ihrer lokalen Entwicklungsumgebung unter macOS, Windows oder Linux.

Erstellen Ihrer App

Öffnen Sie eine neue Eingabeaufforderung, und führen Sie die folgenden Befehle aus:

dotnet new console -o myApp
cd myApp

Der dotnet Befehl erstellt eine new Anwendung vom Typ console. Der -o Parameter erstellt ein Verzeichnis mit dem Namen myApp , in dem Ihre App gespeichert ist, und füllt es mit den erforderlichen Dateien auf. Der cd myApp Befehl versetzt Sie in das neu erstellte App-Verzeichnis.

Installieren Infer.NET Pakets

Um Infer.NET zu verwenden, müssen Sie das Microsoft.ML.Probabilistic.Compiler Paket installieren. Führen Sie an der Eingabeaufforderung folgenden Befehl aus:

dotnet add package Microsoft.ML.Probabilistic.Compiler

Oder in .NET 10+:

dotnet package add Microsoft.ML.Probabilistic.Compiler

Entwerfen Ihres Modells

Im Beispielbeispiel werden Tisch-Tennis- oder Foosballspiele verwendet, die im Büro gespielt werden. Sie kennen die Teilnehmer und das Ergebnis jedes Spiels. Sie möchten die Fähigkeiten des Spielers aus diesen Daten ableiten. Angenommen, jeder Spieler hat eine normal verteilte latente Fähigkeit und ihre gegebene Spielleistung ist eine laute Version dieser Fähigkeit. Die Daten beschränken die Leistung des Gewinners auf eine höhere Leistung als die Leistung des Verlierers. Dies ist eine vereinfachte Version des beliebten TrueSkill-Modells , das auch Teams unterstützt, zeichnet und andere Erweiterungen unterstützt. Eine erweiterte Version dieses Modells wird für die Matchmaking in den meistverkauften Spieltiteln Halo und Gears of War verwendet.

Sie müssen die abgeleiteten Spielerfähigkeiten zusammen mit ihrer Varianz auflisten – das Maß der Unsicherheit um die Fähigkeiten.

Beispieldaten für Spielergebnisse

Spiel Gewinner Verlierer
1 Spieler 0 Spieler 1
2 Spieler 0 Spieler 3
3 Spieler 0 Spieler 4
4 Spieler 1 Spieler 2
5 Spieler 3 Spieler 1
6 Spieler 4 Spieler 2

Mit einem genaueren Blick auf die Beispieldaten werden Sie feststellen, dass spieler 3 und 4 beide einen Sieg und einen Verlust haben. Sehen wir uns an, wie die Rankings mit probabilistischer Programmierung aussehen. Beachten Sie, dass es auch einen Spieler 0 (null) gibt, weil sogar Ranglisten für Bürospiele für uns Entwickler nullbasiert sind.

Schreiben von Code

Nachdem sie das Modell entworfen haben, ist es an der Zeit, es als probabilistisches Programm mithilfe der Infer.NET Modellierungs-API auszudrücken. Öffnen Sie Program.cs in Ihrem bevorzugten Text-Editor, und ersetzen Sie den gesamten Inhalt durch folgenden 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}");
            }
        }
    }
}

Starten Sie Ihre App

Führen Sie an der Eingabeaufforderung folgenden Befehl aus:

dotnet run

Ergebnisse

Ihre Ergebnisse sollten wie folgt aussehen:

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)

Beachten Sie in den Ergebnissen, dass Spieler 3 etwas höher als Spieler 4 nach dem Modell rangiert. Das liegt daran, dass der Sieg von Spieler 3 über Spieler 1 wichtiger ist als der Sieg von Spieler 4 über Spieler 2 – beachten Sie, dass Spieler 1 spieler 2 schlägt. Spieler 0 ist der Gesamt-Champ!

Lernen Sie weiter

Das Entwerfen statistischer Modelle ist selbst eine Fähigkeit. Das Microsoft Research Cambridge Team hat ein kostenloses Online-Buch geschrieben, das einen sanften Einstieg in den Artikel gibt. Kapitel 3 dieses Buches behandelt das TrueSkill-Modell ausführlicher. Sobald Sie ein Modell im Auge haben, können Sie es mithilfe der umfangreichen Dokumentation auf der Infer.NET-Website in Code umwandeln.

Nächste Schritte

Schauen Sie sich das Infer.NET GitHub-Repository an, um weiter zu lernen und weitere Beispiele zu finden.