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
- Visual Studio 2022 dengan beban kerja ".NET Desktop Development" terinstal.
- Tab Masalah GitHub memisahkan file (issues_train.tsv).
- Tab uji masalah GitHub memisahkan file (issues_test.tsv).
Membuat aplikasi konsol
Membuat proyek
Buat Aplikasi Konsol C# yang disebut "GitHubIssueClassification". Pilih Selanjutnya.
Pilih .NET 7 sebagai kerangka kerja yang akan digunakan. Pilih Buat.
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.
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.
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
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.
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._mlContext
MLContext 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:
Di Penjelajah Solusi, klik kanan proyek Anda dan pilih Tambahkan>Item baru.
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 pertamafeature
digunakan untuk memprediksiArea
- kolom
Description
keempat adalah kolom keduafeature
yang digunakan untuk memprediksiArea
IssuePrediction
adalah kelas yang digunakan untuk prediksi setelah model dilatih. Ini memiliki satu string
(Area
) dan PredictedLabel
ColumnName
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 BuildAndTrainModel
metode 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 ObjectPool
PredictionEngine
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