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.
Tutorial ini menunjukkan kepada Anda cara membuat aplikasi konsol .NET yang mengklasifikasikan sentimen dari komentar situs web dan mengambil tindakan yang sesuai. Pengklasifikasi sentimen biner menggunakan C# di Visual Studio 2022.
Dalam tutorial ini, Anda akan belajar cara:
- Membuat aplikasi konsol
- Siapkan data
- Muatkan data
- Membangun dan melatih model
- Evaluasilah model
- Menggunakan model untuk membuat prediksi
- Lihat hasilnya
Anda dapat menemukan kode sumber untuk tutorial ini di repositori dotnet/samples .
Prasyarat
Membuat aplikasi konsol
Buat Aplikasi Konsol C# yang disebut "SentimentAnalysis". Klik tombol Berikutnya.
Pilih .NET 8 sebagai kerangka kerja yang akan digunakan. Klik tombol Buat.
Buat direktori bernama Data di proyek Anda untuk menyimpan file himpunan data Anda.
Instal Paket Microsoft.ML NuGet:
Nota
Sampel ini menggunakan versi stabil terbaru dari paket NuGet yang disebutkan kecuali dinyatakan lain.
Di Penjelajah Solusi, klik kanan pada proyek Anda dan pilih Kelola Paket NuGet. Pilih "nuget.org" sebagai sumber paket, lalu pilih tab Telusuri . Cari Microsoft.ML, pilih paket yang Anda inginkan, lalu pilih Instal. Lanjutkan dengan penginstalan dengan menyetujui persyaratan lisensi untuk paket yang Anda pilih.
Menyiapkan data Anda
Nota
Himpunan data untuk tutorial ini berasal dari 'Dari Grup ke Label Individu menggunakan Fitur Mendalam', Kotzias et. Al. KDD 2015, dan dihosting di Repositori Pembelajaran Mesin UCI - Dua, D. dan Karra Taniskidou, E. (2017). Repositori Pembelajaran Mesin UCI [http://archive.ics.uci.edu/ml]. Irvine, CA: Universitas California, Sekolah Tinggi Informasi dan Ilmu Komputer.
Unduh file ZIP himpunan data Kalimat Berlabel Sentimen UCI, dan unzip.
yelp_labelled.txtSalin file ke direktori Data yang Anda buat.Di Penjelajah Solusi, klik
yelp_labelled.txtkanan file dan pilih Properti. Di bawah Tingkat Lanjut, ubah nilai Salin ke Direktori Output menjadi Salin jika lebih baru.
Membuat kelas dan menentukan jalur
Tambahkan arahan tambahan
usingberikut ke bagian atas file Program.cs :using Microsoft.ML; using Microsoft.ML.Data; using SentimentAnalysis; using static Microsoft.ML.DataOperationsCatalog;Tambahkan kode berikut ke baris tepat di bawah
usingarahan, untuk membuat bidang untuk menyimpan jalur file himpunan data yang baru diunduh:string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "yelp_labelled.txt");Selanjutnya, buat kelas untuk data input dan prediksi Anda. Tambahkan kelas baru ke proyek Anda:
Di Penjelajah Solusi, klik kanan proyek, lalu pilih Tambahkan>Item Baru.
Dalam kotak dialog Tambahkan Item Baru , pilih Kelas dan ubah bidang Nama menjadi SentimentData.cs. Kemudian, pilih Tambahkan.
File SentimentData.cs terbuka di editor kode. Tambahkan arahan berikut
usingke bagian atas SentimentData.cs:using Microsoft.ML.Data;Hapus definisi kelas yang ada dan tambahkan kode berikut, yang memiliki dua kelas
SentimentDatadanSentimentPrediction, ke file SentimentData.cs :public class SentimentData { [LoadColumn(0)] public string? SentimentText; [LoadColumn(1), ColumnName("Label")] public bool Sentiment; } public class SentimentPrediction : SentimentData { [ColumnName("PredictedLabel")] public bool Prediction { get; set; } public float Probability { get; set; } public float Score { get; set; } }
Bagaimana data disiapkan
Kelas himpunan data input, SentimentData, memiliki string untuk komentar pengguna (SentimentText) dan bool nilai (Sentiment) 1 (positif) atau 0 (negatif) untuk sentimen. Kedua bidang memiliki atribut LoadColumn yang melekat padanya, yang menjelaskan urutan file data dari setiap bidang. Selain itu, Sentiment properti memiliki atribut ColumnName untuk menunjuknya sebagai Label bidang . Contoh file berikut tidak memiliki baris header, dan terlihat seperti ini:
| SentimentText | Sentimen (Label) |
|---|---|
| Pelayan sedikit lambat dalam pelayanan. | 0 |
| Kerak tidak baik. | 0 |
| Wow... Menyukai tempat ini. | 1 |
| Layanan sangat cepat. | 1 |
SentimentPrediction adalah kelas prediksi yang digunakan setelah pelatihan model. Ini mewarisi dari SentimentData sehingga input SentimentText dapat ditampilkan bersama dengan prediksi output.
Prediction Boolean adalah nilai yang diprediksi model ketika disediakan dengan input SentimentTextbaru .
Kelas SentimentPrediction output berisi dua properti lain yang dihitung oleh model: Score - skor mentah yang dihitung oleh model, dan Probability - skor yang dikalibrasi dengan kemungkinan teks memiliki sentimen positif.
Untuk tutorial ini, properti yang paling penting adalah Prediction.
Muatkan data
Data dalam ML.NET direpresentasikan sebagai antarmuka IDataView.
IDataView adalah cara yang fleksibel dan efisien untuk menjelaskan data tabular (numerik dan teks). Data dapat dimuat dari file teks atau secara real time (misalnya, database SQL atau file log) ke IDataView objek.
Kelas MLContext adalah titik awal untuk semua operasi ML.NET. Menginisialisasi mlContext membuat lingkungan ML.NET baru yang dapat dibagikan di seluruh objek alur kerja pembuatan model. Ini mirip, secara konseptual, hingga DBContext di Entity Framework.
Anda menyiapkan aplikasi, lalu memuat data:
Console.WriteLine("Hello World!")Ganti baris dengan kode berikut untuk mendeklarasikan dan menginisialisasi variabel mlContext:MLContext mlContext = new MLContext();Tambahkan yang berikut ini sebagai baris kode berikutnya:
TrainTestData splitDataView = LoadData(mlContext);Buat
LoadData()metode di bagianProgram.csbawah file menggunakan kode berikut:TrainTestData LoadData(MLContext mlContext) { }Metode ini
LoadData()menjalankan tugas-tugas berikut:- Memuat data.
- Membagi himpunan data yang dimuat menjadi himpunan data pelatihan dan pengujian.
- Mengembalikan himpunan data pelatihan dan pengujian terpisah.
Tambahkan kode berikut sebagai baris pertama metode
LoadData():IDataView dataView = mlContext.Data.LoadFromTextFile<SentimentData>(_dataPath, hasHeader: false);Metode LoadFromTextFile() menentukan skema data dan membaca dalam file. Mengambil variabel jalur data dan mengembalikan
IDataView.
Memisahkan himpunan data untuk pelatihan dan pengujian model
Saat menyiapkan model, Anda menggunakan bagian dari himpunan data untuk melatihnya dan bagian dari himpunan data untuk menguji akurasi model.
Untuk membagi data yang dimuat menjadi himpunan data yang diperlukan, tambahkan kode berikut sebagai baris berikutnya dalam
LoadData()metode :TrainTestData splitDataView = mlContext.Data.TrainTestSplit(dataView, testFraction: 0.2);Kode sebelumnya menggunakan metode TrainTestSplit() untuk membagi himpunan data yang dimuat menjadi himpunan data pelatihan dan pengujian dan mengembalikannya di DataOperationsCatalog.TrainTestData kelas . Tentukan persentase kumpulan pengujian data dengan
testFractionparameter . Defaultnya adalah 10%, dalam hal ini Anda menggunakan 20% untuk mengevaluasi lebih banyak data.Kembalikan
splitDataViewpada akhir metodeLoadData().return splitDataView;
Membangun dan melatih model
Tambahkan panggilan berikut ke metode di
BuildAndTrainModelbawah panggilan keLoadDatametode :ITransformer model = BuildAndTrainModel(mlContext, splitDataView.TrainSet);Metode ini
BuildAndTrainModel()menjalankan tugas-tugas berikut:- Mengekstrak dan mengubah data.
- Melatih model.
- Memprediksi sentimen berdasarkan data pengujian.
- Mengembalikan model.
BuildAndTrainModel()Buat metode , di bawahLoadData()metode , menggunakan kode berikut:ITransformer BuildAndTrainModel(MLContext mlContext, IDataView splitTrainSet) { }
Mengekstrak dan mengubah data
Panggil
FeaturizeTextsebagai baris kode berikutnya:var estimator = mlContext.Transforms.Text.FeaturizeText(outputColumnName: "Features", inputColumnName: nameof(SentimentData.SentimentText))Metode
FeaturizeText()dalam kode sebelumnya mengonversi kolom teks (SentimentText) menjadi kolom jenisFeatureskunci numerik yang digunakan oleh algoritma pembelajaran mesin dan menambahkannya sebagai kolom himpunan data baru:SentimentText Sentimen Features Pelayan sedikit lambat dalam pelayanan. 0 [0.76, 0.65, 0.44, …] Kerak tidak baik. 0 [0.98, 0.43, 0.54, …] Wow... Menyukai tempat ini. 1 [0.35, 0.73, 0.46, …] Layanan sangat cepat. 1 [0.39, 0, 0.75, …]
Menambahkan algoritma pembelajaran
Aplikasi ini menggunakan algoritma klasifikasi yang mengategorikan item atau baris data. Aplikasi ini mengategorikan komentar situs web sebagai positif atau negatif, jadi gunakan tugas klasifikasi biner.
Tambahkan tugas pembelajaran mesin ke definisi transformasi data dengan menambahkan yang berikut ini sebagai baris kode berikutnya di BuildAndTrainModel():
.Append(mlContext.BinaryClassification.Trainers.SdcaLogisticRegression(labelColumnName: "Label", featureColumnName: "Features"));
SdcaLogisticRegressionBinaryTrainer adalah algoritma pelatihan klasifikasi Anda. Ini ditambahkan ke estimator dan menerima parameter input yang difeaturisasi SentimentText (Features) serta Label untuk mempelajari dari data historis.
Melatih model
Paskan model ke splitTrainSet data dan kembalikan model terlatih dengan menambahkan yang berikut ini sebagai baris kode berikutnya dalam BuildAndTrainModel() metode :
Console.WriteLine("=============== Create and Train the Model ===============");
var model = estimator.Fit(splitTrainSet);
Console.WriteLine("=============== End of training ===============");
Console.WriteLine();
Metode Fit() melatih model Anda dengan mengubah himpunan data dan menerapkan pelatihan.
Mengembalikan model yang dilatih untuk digunakan untuk evaluasi
Kembalikan model di akhir BuildAndTrainModel() metode:
return model;
Evaluasilah model
Setelah model Anda dilatih, gunakan data pengujian Anda untuk memvalidasi performa model.
Evaluate()Buat metode , tepat setelahBuildAndTrainModel(), dengan kode berikut:void Evaluate(MLContext mlContext, ITransformer model, IDataView splitTestSet) { }Metode ini
Evaluate()menjalankan tugas-tugas berikut:- Memuat himpunan data pengujian.
- Membuat evaluator BinaryClassification.
- Mengevaluasi model dan membuat metrik.
- Menampilkan metrik.
Tambahkan panggilan ke metode baru di bawah panggilan
BuildAndTrainModelmenggunakan kode berikut:Evaluate(mlContext, model, splitDataView.TestSet);splitTestSetUbah data dengan menambahkan kode berikut keEvaluate():Console.WriteLine("=============== Evaluating Model accuracy with Test data==============="); IDataView predictions = model.Transform(splitTestSet);Kode sebelumnya menggunakan metode Transform() untuk membuat prediksi untuk beberapa baris input yang disediakan dari himpunan data pengujian.
Evaluasi model dengan menambahkan yang berikut ini sebagai baris kode berikutnya dalam
Evaluate()metode :CalibratedBinaryClassificationMetrics metrics = mlContext.BinaryClassification.Evaluate(predictions, "Label");
Setelah Anda memiliki set prediksi (predictions), metode Evaluate() menilai model, yang membandingkan nilai yang diprediksi dengan aktual Labels dalam himpunan data pengujian dan mengembalikan objek CalibratedBinaryClassificationMetrics tentang performa model.
Menampilkan metrik untuk validasi model
Gunakan kode berikut untuk menampilkan metrik:
Console.WriteLine();
Console.WriteLine("Model quality metrics evaluation");
Console.WriteLine("--------------------------------");
Console.WriteLine($"Accuracy: {metrics.Accuracy:P2}");
Console.WriteLine($"Auc: {metrics.AreaUnderRocCurve:P2}");
Console.WriteLine($"F1Score: {metrics.F1Score:P2}");
Console.WriteLine("=============== End of model evaluation ===============");
AccuracyMetrik mendapatkan akurasi model, yang merupakan proporsi prediksi yang benar dalam set pengujian.AreaUnderRocCurveMetrik menunjukkan seberapa yakin model mengklasifikasikan kelas positif dan negatif dengan benar. Anda inginAreaUnderRocCurvesedekat mungkin dengan yang satu.F1ScoreMetrik mendapatkan skor F1 model, yang merupakan ukuran keseimbangan antara presisi dan pengenalan. Anda inginF1Scoresedekat mungkin dengan yang satu.
Memprediksi hasil data pengujian
Buat metode
UseModelWithSingleItem()tepat setelah metodeEvaluate()dengan menggunakan kode berikut:void UseModelWithSingleItem(MLContext mlContext, ITransformer model) { }Metode ini
UseModelWithSingleItem()menjalankan tugas-tugas berikut:- Membuat satu komentar data pengujian.
- Memprediksi sentimen berdasarkan data pengujian.
- Menggabungkan data pengujian dan prediksi untuk pelaporan.
- Menampilkan hasil yang diprediksi.
Tambahkan pemanggilan metode yang baru tepat di bawah pemanggilan metode
Evaluate()menggunakan kode berikut:UseModelWithSingleItem(mlContext, model);Tambahkan kode berikut untuk dibuat sebagai baris pertama dalam
UseModelWithSingleItem()Metode:PredictionEngine<SentimentData, SentimentPrediction> predictionFunction = mlContext.Model.CreatePredictionEngine<SentimentData, SentimentPrediction>(model);PredictionEngine adalah API kenyamanan, yang memungkinkan Anda melakukan prediksi pada satu instans data.
PredictionEnginetidak aman untuk utas. Dapat diterima untuk digunakan di lingkungan utas tunggal atau prototipe. Untuk peningkatan performa dan keamanan utas di lingkungan produksi, gunakanPredictionEnginePoollayanan , yang menciptakanObjectPoolPredictionEngineobjek untuk digunakan di seluruh aplikasi Anda. Lihat panduan ini tentang cara menggunakanPredictionEnginePooldi ASP.NET Core Web API.Nota
PredictionEnginePoolekstensi layanan saat ini dalam pratinjau.Tambahkan komentar untuk menguji prediksi model terlatih dalam
UseModelWithSingleItem()metode dengan membuat instansSentimentData:SentimentData sampleStatement = new SentimentData { SentimentText = "This was a very bad steak" };Teruskan data komentar pengujian ke
PredictionEnginedengan menambahkan yang berikut ini sebagai baris kode berikutnya dalamUseModelWithSingleItem()metode :var resultPrediction = predictionFunction.Predict(sampleStatement);Fungsi Predict() membuat prediksi pada satu baris data.
Tampilkan
SentimentTextdan prediksi sentimen terkait menggunakan kode berikut:Console.WriteLine(); Console.WriteLine("=============== Prediction Test of model with a single sample and test dataset ==============="); Console.WriteLine(); Console.WriteLine($"Sentiment: {resultPrediction.SentimentText} | Prediction: {(Convert.ToBoolean(resultPrediction.Prediction) ? "Positive" : "Negative")} | Probability: {resultPrediction.Probability} "); Console.WriteLine("=============== End of Predictions ==============="); Console.WriteLine();
Menggunakan model untuk prediksi
Menyebarkan dan memprediksi item batch
Buat metode
UseModelWithBatchItems()tepat setelah metodeUseModelWithSingleItem()dengan menggunakan kode berikut:void UseModelWithBatchItems(MLContext mlContext, ITransformer model) { }Metode ini
UseModelWithBatchItems()menjalankan tugas-tugas berikut:- Membuat data pengujian batch.
- Memprediksi sentimen berdasarkan data pengujian.
- Menggabungkan data pengujian dan prediksi untuk pelaporan.
- Menampilkan hasil yang diprediksi.
Tambahkan pemanggilan metode yang baru tepat di bawah pemanggilan metode
UseModelWithSingleItem()menggunakan kode berikut:UseModelWithBatchItems(mlContext, model);Tambahkan beberapa komentar untuk menguji prediksi model terlatih dalam
UseModelWithBatchItems()metode :IEnumerable<SentimentData> sentiments = new[] { new SentimentData { SentimentText = "This was a horrible meal" }, new SentimentData { SentimentText = "I love this spaghetti." } };
Memprediksi sentimen komentar
Gunakan model untuk memprediksi sentimen data komentar menggunakan metode Transform():
IDataView batchComments = mlContext.Data.LoadFromEnumerable(sentiments);
IDataView predictions = model.Transform(batchComments);
// Use model to predict whether comment data is Positive (1) or Negative (0).
IEnumerable<SentimentPrediction> predictedResults = mlContext.Data.CreateEnumerable<SentimentPrediction>(predictions, reuseRowObject: false);
Menggabungkan dan menampilkan prediksi
Buat header untuk prediksi menggunakan kode berikut:
Console.WriteLine();
Console.WriteLine("=============== Prediction Test of loaded model with multiple samples ===============");
Karena SentimentPrediction diwarisi dari SentimentData, metode Transform() mengisi SentimentText dengan bidang yang diprediksi. Saat proses proses ML.NET, setiap komponen menambahkan kolom, dan ini memudahkan untuk menampilkan hasilnya:
foreach (SentimentPrediction prediction in predictedResults)
{
Console.WriteLine($"Sentiment: {prediction.SentimentText} | Prediction: {(Convert.ToBoolean(prediction.Prediction) ? "Positive" : "Negative")} | Probability: {prediction.Probability} ");
}
Console.WriteLine("=============== End of predictions ===============");
Results
Hasil Anda harus mirip dengan yang berikut ini. Selama pemrosesan, pesan ditampilkan. Anda mungkin melihat peringatan, atau memproses pesan. Ini telah dihapus dari hasil berikut untuk kejelasan.
Model quality metrics evaluation
--------------------------------
Accuracy: 83.96%
Auc: 90.51%
F1Score: 84.04%
=============== End of model evaluation ===============
=============== Prediction Test of model with a single sample and test dataset ===============
Sentiment: This was a very bad steak | Prediction: Negative | Probability: 0.1027377
=============== End of Predictions ===============
=============== Prediction Test of loaded model with a multiple samples ===============
Sentiment: This was a horrible meal | Prediction: Negative | Probability: 0.1369192
Sentiment: I love this spaghetti. | Prediction: Positive | Probability: 0.9960636
=============== End of predictions ===============
=============== End of process ===============
Press any key to continue . . .
Selamat! Anda sekarang telah berhasil membangun model pembelajaran mesin untuk mengklasifikasikan dan memprediksi sentimen pesan.
Membangun model yang berhasil adalah proses berulang. Model ini memiliki kualitas awal yang lebih rendah karena tutorial menggunakan himpunan data kecil untuk memberikan pelatihan model cepat. Jika Anda tidak puas dengan kualitas model, Anda dapat mencoba meningkatkannya dengan menyediakan himpunan data pelatihan yang lebih besar atau dengan memilih algoritma pelatihan yang berbeda dengan parameter hiper yang berbeda untuk setiap algoritma.
Anda dapat menemukan kode sumber untuk tutorial ini di repositori dotnet/samples .
Langkah selanjutnya
Dalam tutorial ini, Anda belajar cara:
- Membuat aplikasi konsol
- Siapkan data
- Muatkan data
- Membangun dan melatih model
- Evaluasilah model
- Menggunakan model untuk membuat prediksi
- Lihat hasilnya
Lanjutkan ke tutorial berikutnya untuk mempelajari lebih lanjut