Tutorial: Mengategorikan masalah dukungan menggunakan klasifikasi multikelas dengan ML.NET

Tutorial sampel ini menggambarkan penggunaan ML.NET untuk membuat pengklasifikasi masalah GitHub untuk melatih model yang mengklasifikasikan dan memprediksi label Area untuk masalah GitHub melalui aplikasi konsol .NET Core menggunakan C# di Visual Studio.

Dalam tutorial ini, Anda akan mempelajari cara:

  • Menyiapkan data Anda
  • Mengubah data
  • Latih model
  • Mengevaluasi model
  • Memprediksi dengan model terlatih
  • Menyebarkan dan Memprediksi dengan model yang dimuat

Anda dapat menemukan kode sumber untuk tutorial ini di repositori dotnet/samples .

Prasyarat

Membuat aplikasi konsol

Membuat proyek

  1. Buat Aplikasi Konsol C# yang disebut "GitHubIssueClassification". Pilih Selanjutnya.

  2. Pilih .NET 7 sebagai kerangka kerja yang akan digunakan. Pilih Buat.

  3. Buat direktori bernama Data dalam proyek Anda untuk menyimpan file himpunan data Anda:

    Di Penjelajah Solusi, klik kanan proyek Anda dan pilih Tambahkan>Folder Baru. Ketik "Data" dan tekan Enter.

  4. Buat direktori bernama Model di proyek Anda untuk menyimpan model Anda:

    Di Penjelajah Solusi, klik kanan proyek Anda dan pilih Tambahkan>Folder Baru. Ketik "Model" dan tekan Enter.

  5. Instal Paket Microsoft.ML NuGet:

    Catatan

    Sampel ini menggunakan versi stabil terbaru dari paket NuGet yang disebutkan kecuali dinyatakan lain.

    Di Penjelajah Solusi, klik kanan proyek Anda dan pilih Kelola Paket NuGet. Pilih "nuget.org" sebagai sumber Paket, pilih tab Telusuri, cari Microsoft.ML dan pilih tombol Instal . Pilih tombol OK pada dialog Pratinjau Perubahan lalu pilih tombol Saya Terima pada dialog Penerimaan Lisensi jika Anda setuju dengan ketentuan lisensi untuk paket yang tercantum.

Menyiapkan data Anda

  1. Unduh issues_train.tsv dan himpunan data issues_test.tsv dan simpan ke folder Data yang Anda buat sebelumnya. Himpunan data pertama melatih model pembelajaran mesin dan yang kedua dapat digunakan untuk mengevaluasi seberapa akurat model Anda.

  2. Di Penjelajah Solusi, klik kanan setiap file *.tsv dan pilih Properti. Di bawah Tingkat Lanjut, ubah nilai Salin ke Direktori Output menjadi Salin jika lebih baru.

Membuat kelas dan menentukan jalur

Tambahkan pernyataan tambahan using berikut ke bagian atas file Program.cs :

using Microsoft.ML;
using GitHubIssueClassification;

Buat tiga bidang global untuk menyimpan jalur ke file yang baru diunduh, dan variabel global untuk MLContext,DataView , dan PredictionEngine:

  • _trainDataPath memiliki jalur ke himpunan data yang digunakan untuk melatih model.
  • _testDataPath memiliki jalur ke himpunan data yang digunakan untuk mengevaluasi model.
  • _modelPath memiliki jalur tempat model terlatih disimpan.
  • _mlContextMLContext adalah yang menyediakan konteks pemrosesan.
  • _trainingDataView adalah digunakan IDataView untuk memproses himpunan data pelatihan.
  • _predEngine adalah yang PredictionEngine<TSrc,TDst> digunakan untuk prediksi tunggal.

Tambahkan kode berikut ke baris tepat di bawah pernyataan penggunaan untuk menentukan jalur tersebut dan variabel lainnya:

string _appPath = Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]) ?? ".";
string _trainDataPath = Path.Combine(_appPath, "..", "..", "..", "Data", "issues_train.tsv");
string _testDataPath = Path.Combine(_appPath, "..", "..", "..", "Data", "issues_test.tsv");
string _modelPath = Path.Combine(_appPath, "..", "..", "..", "Models", "model.zip");

MLContext _mlContext;
PredictionEngine<GitHubIssue, IssuePrediction> _predEngine;
ITransformer _trainedModel;
IDataView _trainingDataView;

Buat beberapa kelas untuk data input dan prediksi Anda. Tambahkan kelas baru ke proyek Anda:

  1. Di Penjelajah Solusi, klik kanan proyek Anda dan pilih Tambahkan>Item baru.

  2. Dalam kotak dialog Tambahkan Item Baru , pilih Kelas dan ubah bidang Nama menjadi GitHubIssueData.cs. Kemudian, pilih tombol Tambahkan .

    File GitHubIssueData.cs terbuka di editor kode. Tambahkan pernyataan berikut using ke bagian atas GitHubIssueData.cs:

using Microsoft.ML.Data;

Hapus definisi kelas yang ada dan tambahkan kode berikut, yang memiliki dua kelas GitHubIssue dan IssuePrediction, ke file GitHubIssueData.cs :

public class GitHubIssue
{
    [LoadColumn(0)]
    public string? ID { get; set; }
    [LoadColumn(1)]
    public string? Area { get; set; }
    [LoadColumn(2)]
    public required string Title { get; set; }
    [LoadColumn(3)]
    public required string Description { get; set; }
}

public class IssuePrediction
{
    [ColumnName("PredictedLabel")]
    public string? Area;
}

adalah label kolom yang ingin Anda prediksi. yang diidentifikasi Features adalah input yang Anda berikan kepada model untuk memprediksi Label.

Gunakan LoadColumnAttribute untuk menentukan indeks kolom sumber dalam himpunan data.

GitHubIssue adalah kelas himpunan data input dan memiliki bidang berikut String :

  • kolom ID pertama (ID Masalah GitHub)
  • kolom Area kedua (prediksi untuk pelatihan)
  • kolom Title ketiga (judul masalah GitHub) adalah yang pertama feature digunakan untuk memprediksi Area
  • kolom Description keempat adalah kolom kedua feature yang digunakan untuk memprediksi Area

IssuePrediction adalah kelas yang digunakan untuk prediksi setelah model dilatih. Ini memiliki satu string (Area) dan PredictedLabelColumnName atribut . PredictedLabel digunakan selama prediksi dan evaluasi. Untuk evaluasi, input dengan data pelatihan, nilai yang diprediksi, dan model digunakan.

Semua operasi ML.NET dimulai di kelas MLContext . Menginisialisasi mlContext membuat lingkungan ML.NET baru yang dapat dibagikan di seluruh objek alur kerja pembuatan model. Ini mirip, secara konseptual, ke DBContext dalam Entity Framework.

Inisialisasi variabel

Inisialisasi _mlContext variabel global dengan instans MLContext baru dengan benih acak (seed: 0) untuk hasil yang dapat diulang/deterministik di beberapa pelatihan. Console.WriteLine("Hello World!") Ganti baris dengan kode berikut:

_mlContext = new MLContext(seed: 0);

Muat data

ML.NET menggunakan antarmuka IDataView sebagai cara yang fleksibel dan efisien untuk menjelaskan data tabular numerik atau teks. IDataView dapat memuat file teks atau secara real time (misalnya, database SQL atau file log).

Untuk menginisialisasi dan memuat _trainingDataView variabel global untuk menggunakannya untuk alur, tambahkan kode berikut setelah inisialisasi mlContext :

_trainingDataView = _mlContext.Data.LoadFromTextFile<GitHubIssue>(_trainDataPath,hasHeader: true);

LoadFromTextFile() mendefinisikan skema data dan membaca dalam file. Dibutuhkan variabel jalur data dan mengembalikan IDataView.

Tambahkan yang berikut ini setelah memanggil LoadFromTextFile() metode :

var pipeline = ProcessData();

Metode menjalankan ProcessData tugas-tugas berikut:

  • Mengekstrak dan mengubah data.
  • Mengembalikan alur pemrosesan.

ProcessData Buat metode di bagian bawah file Program.cs menggunakan kode berikut:

IEstimator<ITransformer> ProcessData()
{

}

Mengekstrak fitur dan mengubah data

Saat Anda ingin memprediksi label Area GitHub untuk GitHubIssue, gunakan metode MapValueToKey() untuk mengubah Area kolom menjadi kolom jenis Label kunci numerik (format yang diterima oleh algoritma klasifikasi) dan menambahkannya sebagai kolom himpunan data baru:

var pipeline = _mlContext.Transforms.Conversion.MapValueToKey(inputColumnName: "Area", outputColumnName: "Label")

Selanjutnya, panggil mlContext.Transforms.Text.FeaturizeText, yang mengubah teks (Title dan Description) kolom menjadi vektor numerik untuk masing-masing disebut TitleFeaturized dan DescriptionFeaturized. Tambahkan fiturisasi untuk kedua kolom ke alur dengan kode berikut:

.Append(_mlContext.Transforms.Text.FeaturizeText(inputColumnName: "Title", outputColumnName: "TitleFeaturized"))
.Append(_mlContext.Transforms.Text.FeaturizeText(inputColumnName: "Description", outputColumnName: "DescriptionFeaturized"))

Langkah terakhir dalam persiapan data menggabungkan semua kolom fitur ke dalam kolom Fitur menggunakan metode Concatenate(). Secara default, algoritma pembelajaran hanya memproses fitur dari kolom Fitur . Tambahkan transformasi ini ke alur dengan kode berikut:

.Append(_mlContext.Transforms.Concatenate("Features", "TitleFeaturized", "DescriptionFeaturized"))

Selanjutnya, tambahkan AppendCacheCheckpoint ke cache DataView sehingga saat Anda melakukan iterasi atas data beberapa kali menggunakan cache mungkin mendapatkan performa yang lebih baik, seperti halnya kode berikut:

.AppendCacheCheckpoint(_mlContext);

Peringatan

Gunakan AppendCacheCheckpoint untuk himpunan data kecil/menengah untuk menurunkan waktu pelatihan. JANGAN gunakan (hapus . AppendCacheCheckpoint()) saat menangani himpunan data yang sangat besar.

Mengembalikan alur di akhir ProcessData metode .

return pipeline;

Langkah ini menangani pra-pemrosesan/fiturisasi. Menggunakan komponen tambahan yang tersedia di ML.NET dapat mengaktifkan hasil yang lebih baik dengan model Anda.

Membangun dan melatih model

Tambahkan panggilan berikut ke BuildAndTrainModelmetode sebagai baris berikutnya setelah panggilan ke ProcessData() metode :

var trainingPipeline = BuildAndTrainModel(_trainingDataView, pipeline);

Metode menjalankan BuildAndTrainModel tugas-tugas berikut:

  • Membuat kelas algoritma pelatihan.
  • Melatih model.
  • Memprediksi area berdasarkan data pelatihan.
  • Mengembalikan model.

BuildAndTrainModel Buat metode , tepat setelah deklarasi ProcessData() metode , menggunakan kode berikut:

IEstimator<ITransformer> BuildAndTrainModel(IDataView trainingDataView, IEstimator<ITransformer> pipeline)
{

}

Tentang tugas klasifikasi

Klasifikasi adalah tugas pembelajaran mesin yang menggunakan data untuk menentukan kategori, jenis, atau kelas item atau baris data dan sering menjadi salah satu jenis berikut:

  • Biner: baik A atau B.
  • Multikelas: beberapa kategori yang dapat diprediksi dengan menggunakan satu model.

Untuk jenis masalah ini, gunakan algoritma pembelajaran klasifikasi Multikelas, karena prediksi kategori masalah Anda dapat menjadi salah satu dari beberapa kategori (multikelas) daripada hanya dua (biner).

Tambahkan algoritma pembelajaran mesin ke definisi transformasi data dengan menambahkan yang berikut ini sebagai baris pertama kode di BuildAndTrainModel():

var trainingPipeline = pipeline.Append(_mlContext.MulticlassClassification.Trainers.SdcaMaximumEntropy("Label", "Features"))
        .Append(_mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel"));

SdcaMaximumEntropy adalah algoritma pelatihan klasifikasi multikelas Anda. Ini ditambahkan ke pipeline dan menerima parameter yang ditampilkan Title dan Description (Features) dan Label input untuk dipelajari dari data historis.

Latih model

Paskan model ke splitTrainSet data dan kembalikan model terlatih dengan menambahkan yang berikut ini sebagai baris kode berikutnya dalam BuildAndTrainModel() metode :

_trainedModel = trainingPipeline.Fit(trainingDataView);

Metode ini Fit()melatih model Anda dengan mengubah himpunan data dan menerapkan pelatihan.

PredictionEngine adalah API kenyamanan, yang memungkinkan Anda untuk meneruskan dan kemudian melakukan prediksi pada satu instans data. Tambahkan ini sebagai baris berikutnya dalam BuildAndTrainModel() metode :

_predEngine = _mlContext.Model.CreatePredictionEngine<GitHubIssue, IssuePrediction>(_trainedModel);

Memprediksi dengan model terlatih

Tambahkan masalah GitHub untuk menguji prediksi model terlatih dalam Predict metode dengan membuat instans GitHubIssue:

GitHubIssue issue = new GitHubIssue() {
    Title = "WebSockets communication is slow in my machine",
    Description = "The WebSockets communication used under the covers by SignalR looks like is going slow in my development machine.."
};

Gunakan fungsi Predict() membuat prediksi pada satu baris data:

var prediction = _predEngine.Predict(issue);

Gunakan model: hasil prediksi

Tampilkan GitHubIssue dan prediksi label yang Area sesuai untuk berbagi hasil dan bertindak sesuai dengan itu. Buat tampilan untuk hasil menggunakan kode berikut Console.WriteLine() :

Console.WriteLine($"=============== Single Prediction just-trained-model - Result: {prediction.Area} ===============");

Mengembalikan model yang dilatih untuk digunakan untuk evaluasi

Mengembalikan model di akhir BuildAndTrainModel metode .

return trainingPipeline;

Mengevaluasi model

Setelah membuat dan melatih model, Anda perlu mengevaluasinya dengan himpunan data yang berbeda untuk jaminan dan validasi kualitas. Evaluate Dalam metode , model yang dibuat di BuildAndTrainModel diteruskan untuk dievaluasi. Evaluate Buat metode , tepat setelah BuildAndTrainModel, seperti dalam kode berikut:

void Evaluate(DataViewSchema trainingDataViewSchema)
{

}

Metode menjalankan Evaluate tugas-tugas berikut:

  • Memuat himpunan data pengujian.
  • Membuat evaluator multikelas.
  • Mengevaluasi model dan membuat metrik.
  • Menampilkan metrik.

Tambahkan panggilan ke metode baru, tepat di bawah BuildAndTrainModel panggilan metode, menggunakan kode berikut:

Evaluate(_trainingDataView.Schema);

Seperti yang Anda lakukan sebelumnya dengan himpunan data pelatihan, muat himpunan data pengujian dengan menambahkan kode berikut ke Evaluate metode :

var testDataView = _mlContext.Data.LoadFromTextFile<GitHubIssue>(_testDataPath,hasHeader: true);

Metode Evaluate() menghitung metrik kualitas untuk model menggunakan himpunan data yang ditentukan. Ini mengembalikan MulticlassClassificationMetrics objek yang berisi metrik keseluruhan yang dihitung oleh evaluator klasifikasi multikelas. Untuk menampilkan metrik guna menentukan kualitas model, Anda harus mendapatkannya terlebih dahulu. Perhatikan penggunaan metode Transform() dari variabel global pembelajaran _trainedModel mesin ( ITransformer) untuk memasukkan fitur dan mengembalikan prediksi. Tambahkan kode berikut ke Evaluate metode sebagai baris berikutnya:

var testMetrics = _mlContext.MulticlassClassification.Evaluate(_trainedModel.Transform(testDataView));

Metrik berikut dievaluasi untuk klasifikasi multikelas:

  • Akurasi Mikro - Setiap pasangan kelas sampel berkontribusi sama pada metrik akurasi. Anda ingin Akurasi Mikro sedekat mungkin.

  • Akurasi Makro - Setiap kelas berkontribusi sama pada metrik akurasi. Kelas minoritas diberikan bobot yang sama dengan kelas yang lebih besar. Anda ingin Akurasi Makro sedekat mungkin.

  • Log-loss - lihat Log Loss. Anda ingin Log-loss sedekat mungkin dengan nol.

  • Pengurangan log-loss - Rentang dari [-inf, 1.00], di mana 1.00 adalah prediksi sempurna dan 0 menunjukkan prediksi rata-rata. Anda ingin pengurangan Log-loss sedekat mungkin.

Menampilkan metrik untuk validasi model

Gunakan kode berikut untuk menampilkan metrik, membagikan hasilnya, lalu menindaklanjutinya:

Console.WriteLine($"*************************************************************************************************************");
Console.WriteLine($"*       Metrics for Multi-class Classification model - Test Data     ");
Console.WriteLine($"*------------------------------------------------------------------------------------------------------------");
Console.WriteLine($"*       MicroAccuracy:    {testMetrics.MicroAccuracy:0.###}");
Console.WriteLine($"*       MacroAccuracy:    {testMetrics.MacroAccuracy:0.###}");
Console.WriteLine($"*       LogLoss:          {testMetrics.LogLoss:#.###}");
Console.WriteLine($"*       LogLossReduction: {testMetrics.LogLossReduction:#.###}");
Console.WriteLine($"*************************************************************************************************************");

Menyimpan model ke file

Setelah puas dengan model Anda, simpan ke file untuk membuat prediksi di lain waktu atau di aplikasi lain. Tambahkan kode berikut ke metode Evaluate.

SaveModelAsFile(_mlContext, trainingDataViewSchema, _trainedModel);

Buat metode di SaveModelAsFile bawah metode Anda Evaluate .

void SaveModelAsFile(MLContext mlContext,DataViewSchema trainingDataViewSchema, ITransformer model)
{

}

Tambahkan kode berikut ke metode SaveModelAsFile Anda. Kode ini menggunakan Save metode untuk membuat serialisasi dan menyimpan model terlatih sebagai file zip.

mlContext.Model.Save(model, trainingDataViewSchema, _modelPath);

Menyebarkan dan Memprediksi dengan model

Tambahkan panggilan ke metode baru, tepat di bawah Evaluate panggilan metode, menggunakan kode berikut:

PredictIssue();

PredictIssue Buat metode , tepat setelah Evaluate metode (dan tepat sebelum SaveModelAsFile metode ), menggunakan kode berikut:

void PredictIssue()
{

}

Metode menjalankan PredictIssue tugas-tugas berikut:

  • Memuat model yang disimpan
  • Membuat satu masalah data pengujian.
  • Memprediksi area berdasarkan data pengujian.
  • Menggabungkan data pengujian dan prediksi untuk pelaporan.
  • Menampilkan hasil yang diprediksi.

Muat model yang disimpan ke dalam aplikasi Anda dengan menambahkan kode berikut ke PredictIssue metode :

ITransformer loadedModel = _mlContext.Model.Load(_modelPath, out var modelInputSchema);

Tambahkan masalah GitHub untuk menguji prediksi model terlatih dalam Predict metode dengan membuat instans GitHubIssue:

GitHubIssue singleIssue = new GitHubIssue() { Title = "Entity Framework crashes", Description = "When connecting to the database, EF is crashing" };

Seperti yang Anda lakukan sebelumnya, buat PredictionEngine instans dengan kode berikut:

_predEngine = _mlContext.Model.CreatePredictionEngine<GitHubIssue, IssuePrediction>(loadedModel);

PredictionEngine adalah API kenyamanan, yang memungkinkan Anda melakukan prediksi pada satu instans data. PredictionEngine tidak aman untuk utas. Dapat digunakan di lingkungan rangkaian tunggal atau prototipe. Untuk meningkatkan performa dan keamanan utas di lingkungan produksi, gunakan PredictionEnginePool layanan , yang menciptakan ObjectPoolPredictionEngine objek untuk digunakan di seluruh aplikasi Anda. Lihat panduan ini tentang cara menggunakan PredictionEnginePool dalam ASP.NET Core Web API.

Catatan

PredictionEnginePool ekstensi layanan saat ini dalam pratinjau.

PredictionEngine Gunakan untuk memprediksi label Area GitHub dengan menambahkan kode berikut ke PredictIssue metode untuk prediksi:

var prediction = _predEngine.Predict(singleIssue);

Menggunakan model yang dimuat untuk prediksi

Tampilkan Area untuk mengategorikan masalah dan menindaklanjutinya dengan sesuai. Buat tampilan untuk hasil menggunakan kode berikut Console.WriteLine() :

Console.WriteLine($"=============== Single Prediction - Result: {prediction.Area} ===============");

Hasil

Hasil Anda harus mirip dengan yang berikut ini. Saat proses alur, alur menampilkan pesan. Anda mungkin melihat peringatan, atau memproses pesan. Pesan-pesan ini telah dihapus dari hasil berikut untuk kejelasan.

=============== Single Prediction just-trained-model - Result: area-System.Net ===============
*************************************************************************************************************
*       Metrics for Multi-class Classification model - Test Data
*------------------------------------------------------------------------------------------------------------
*       MicroAccuracy:    0.738
*       MacroAccuracy:    0.668
*       LogLoss:          .919
*       LogLossReduction: .643
*************************************************************************************************************
=============== Single Prediction - Result: area-System.Data ===============

Selamat! Anda sekarang telah berhasil membangun model pembelajaran mesin untuk mengklasifikasikan dan memprediksi label Area untuk masalah GitHub. Anda dapat menemukan kode sumber untuk tutorial ini di repositori dotnet/samples .

Langkah berikutnya

Di tutorial ini, Anda akan mempelajari cara:

  • Menyiapkan data Anda
  • Mengubah data
  • Latih model
  • Mengevaluasi model
  • Memprediksi dengan model terlatih
  • Menyebarkan dan Memprediksi dengan model yang dimuat

Lanjutkan ke tutorial berikutnya untuk mempelajari lebih lanjut