Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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.