Bagikan melalui


Membuat aplikasi daftar pencocokan game dengan pemrograman Infer.NET dan probabilistik

Panduan cara ini mengajarkan Anda tentang pemrograman probabilistik menggunakan Infer.NET. Pemrograman probabilistik adalah pendekatan pembelajaran mesin di mana model kustom dinyatakan sebagai program komputer. Ini memungkinkan untuk menggabungkan pengetahuan domain dalam model dan membuat sistem pembelajaran mesin lebih dapat ditafsirkan. Ini juga mendukung inferensi online - proses pembelajaran saat data baru tiba. Infer.NET digunakan dalam berbagai produk di Microsoft di Azure, Xbox, dan Bing.

Apa itu pemrograman probabilistik?

Pemrograman probabilistik memungkinkan Anda membuat model statistik proses dunia nyata.

Prasyarat

  • Lingkungan pengembangan lokal.

    Panduan cara ini mengharapkan Anda memiliki mesin yang dapat Anda gunakan untuk pengembangan. Tutorial .NET Hello World dalam 10 menit memiliki instruksi untuk menyiapkan lingkungan pengembangan lokal Anda di macOS, Windows, atau Linux.

Membuat aplikasi Anda

Buka perintah baru dan jalankan perintah berikut:

dotnet new console -o myApp
cd myApp

Perintah dotnet membuat aplikasi new jenis console. Parameter -o membuat direktori bernama myApp tempat aplikasi Anda disimpan dan mengisinya dengan file yang diperlukan. Perintah ini cd myApp menempatkan Anda ke dalam direktori aplikasi yang baru dibuat.

Menginstal paket Infer.NET

Untuk menggunakan Infer.NET, Anda perlu menginstal Microsoft.ML.Probabilistic.Compiler paket. Di prompt perintah Anda, jalankan perintah berikut:

dotnet add package Microsoft.ML.Probabilistic.Compiler

Atau, di .NET 10+:

dotnet package add Microsoft.ML.Probabilistic.Compiler

Mendesain model Anda

Contoh sampel menggunakan tenis meja atau pertandingan foosball yang dimainkan di kantor. Anda memiliki peserta dan hasil dari setiap pertandingan. Anda ingin menyimpulkan keterampilan pemain dari data ini. Asumsikan bahwa setiap pemain memiliki keterampilan laten yang biasanya didistribusikan dan performa pertandingan yang diberikan adalah versi yang bising dari keterampilan ini. Data ini membatasi performa pemenang agar lebih besar dari performa pecundang. Ini adalah versi sederhana dari model TrueSkill populer yang juga mendukung tim, seri, serta ekstensi lainnya. Versi lanjutan dari model ini digunakan untuk perjodohan dalam judul game terlaris Halo dan Gears of War.

Anda perlu mencantumkan keterampilan pemain yang disimpulkan, bersama dengan variansi mereka - ukuran ketidakpastian seputar keterampilan.

Data sampel hasil game

Permainan Pemenang Pecundang
1 Pemutar 0 Pemutar 1
2 Pemutar 0 Pemain 3
3 Pemutar 0 Pemain 4
4 Pemutar 1 Pemain 2
5 Pemain 3 Pemutar 1
6 Pemain 4 Pemain 2

Dengan melihat lebih dekat data sampel, Anda akan melihat bahwa pemain 3 dan 4 memiliki satu kemenangan dan satu kekalahan. Mari kita lihat seperti apa peringkat menggunakan pemrograman probabilistik. Perhatikan juga ada pemain nol karena bahkan daftar pengembang berbasis nol digunakan untuk menyusun pertandingan.

Menulis beberapa kode

Setelah merancang model, saatnya untuk mengekspresikannya sebagai program probabilistik menggunakan API pemodelan Infer.NET. Buka Program.cs di editor teks favorit Anda dan ganti semua kontennya dengan kode berikut:

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}");
            }
        }
    }
}

Jalankan aplikasi Anda

Di prompt perintah Anda, jalankan perintah berikut:

dotnet run

Hasil

Hasil Anda harus mirip dengan yang berikut ini:

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)

Dalam hasilnya, perhatikan bahwa pemain 3 peringkat sedikit lebih tinggi dari pemain 4 sesuai dengan model. Itu karena kemenangan pemain 3 atas pemain 1 lebih signifikan daripada kemenangan pemain 4 atas pemain 2 - perhatikan bahwa pemain 1 mengalahkan pemain 2. Pemain 0 adalah juara keseluruhan!

Terus belajar

Merancang model statistik adalah keterampilan sendiri. Tim Microsoft Research Cambridge telah menulis buku online gratis, yang memberikan pengenalan yang lembut untuk artikel ini. Bab 3 dari buku ini mencakup model TrueSkill secara lebih rinci. Setelah Anda memiliki model dalam pikiran, Anda dapat mengubahnya menjadi kode menggunakan dokumentasi ekstensif di situs web Infer.NET.

Langkah selanjutnya

Lihat repositori GitHub Infer.NET untuk terus mempelajari dan menemukan lebih banyak sampel.