Vytvoření aplikace seznamu zápasů s Infer.NET a pravděpodobnostickým programováním
Tento návod vás seznámí s pravděpodobnostickým programováním pomocí Infer.NET. Pravděpodobnostní programování je přístup strojového učení, při kterém se vlastní modely vyjadřují jako počítačové programy. Umožňuje začlenit do modelů znalosti domény a systém strojového učení je interpretovatelný. Podporuje také online odvozování – proces učení při příchodu nových dat. Infer.NET se používá v různých produktech Microsoftu v Azure, Xboxu a Bingu.
Co je pravděpodobnostní programování?
Pravděpodobnostní programování umožňuje vytvářet statistické modely reálných procesů.
Požadavky
Místní vývojové prostředí.
Tento návod očekává, že budete mít počítač, který můžete použít pro vývoj. Kurz .NET Hello World za 10 minut obsahuje pokyny k nastavení místního vývojového prostředí v systémech macOS, Windows nebo Linux.
Vytvoření aplikace
Otevřete nový příkazový řádek a spusťte následující příkazy:
dotnet new console -o myApp
cd myApp
Příkaz dotnet
vytvoří new
aplikaci typu console
. Parametr -o
vytvoří adresář s názvem myApp
, ve kterém je vaše aplikace uložená, a naplní ji požadovanými soubory. Příkaz cd myApp
vás umístí do nově vytvořeného adresáře aplikace.
Instalace balíčku Infer.NET
Pokud chcete použít Infer.NET, musíte balíček nainstalovat Microsoft.ML.Probabilistic.Compiler
. Na příkazovém řádku spusťte následující příkaz:
dotnet add package Microsoft.ML.Probabilistic.Compiler
Návrh modelu
Příklad příkladu používá stolní tenis nebo foosball zápasy, které se hrají v kanceláři. Máte účastníky a výsledek každé shody. Chcete odvodit dovednosti hráče z těchto dat. Předpokládejme, že každý hráč má obvykle distribuovanou latentní dovednost a jejich výkon zápasu je hlučná verze této dovednosti. Data omezují výkon vítěze tak, aby byl větší než výkon vítěze. Jedná se o zjednodušenou verzi oblíbeného modelu TrueSkill , který podporuje také týmy, losování a další rozšíření. Pokročilá verze tohoto modelu se používá pro tvorbu zápasů v nejprodávanějších herních titulech Halo a Gears of War.
Musíte uvést odvozené dovednosti hráčů spolu s jejich rozptylem – míra nejistoty v oblasti dovedností.
Ukázková data výsledku hry
Herní | Vítěz | Loser |
---|---|---|
0 | Hráč 0 | Hráč 1 |
2 | Hráč 0 | Hráč 3 |
3 | Hráč 0 | Hráč 4 |
4 | Hráč 1 | Hráč 2 |
5 | Hráč 3 | Hráč 1 |
6 | Hráč 4 | Hráč 2 |
Při bližším pohledu na ukázková data si všimnete, že hráči 3 a 4 mají jednu výhru i jednu ztrátu. Pojďme se podívat, jak vypadají hodnocení pomocí pravděpodobnostních programování. Všimnětesich seznamů, ale i počet hráčů je nulový, protože vývojáři jsou rovna nule.
Napsat nějaký kód
Při návrhu modelu je čas ho vyjádřit jako pravděpodobnostní program pomocí rozhraní API pro modelování Infer.NET. Otevřete Program.cs
v oblíbeném textovém editoru a nahraďte veškerý jeho obsah následujícím kódem:
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}");
}
}
}
}
Spusťte aplikaci
Na příkazovém řádku spusťte následující příkaz:
dotnet run
Výsledky
Výsledky by měly být podobné následujícímu:
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)
Ve výsledcích si všimněte, že hráč 3 řadí mírně vyšší než hráč 4 podle našeho modelu. Je to proto, že vítězství hráče 3 nad hráčem 1 je důležitější než vítězství hráče 4 nad hráčem 2 – všimněte si, že hráč 1 porazí hráče 2. Hráč 0 je celkový šampión!
Pokračovat ve studiu
Navrhování statistických modelů je dovednost sama o sobě. Tým Microsoft Research Cambridge napsal bezplatnou online knihu, která poskytuje jemný úvod do článku. Kapitola 3 této knihy podrobněji popisuje model TrueSkill. Jakmile máte model na paměti, můžete ho transformovat na kód pomocí rozsáhlé dokumentace na webu Infer.NET.
Další kroky
Projděte si úložiště Infer.NET GitHubu a pokračujte ve studiu a vyhledejte další ukázky.