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 Core 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 mempelajari cara:
- Membuat aplikasi konsol
- Siapkan data
- Muat data
- Membangun dan melatih model
- Mengevaluasi 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 6 sebagai kerangka kerja yang akan digunakan. Klik tombol Buat.
Buat direktori bernama Data dalam proyek Anda untuk menyimpan file himpunan data Anda.
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, lalu pilih tab Telusuri . Cari Microsoft.ML, pilih paket yang Anda inginkan, lalu pilih tombol Instal . Lanjutkan dengan penginstalan dengan menyetujui ketentuan lisensi untuk paket yang Anda pilih.
Menyiapkan data Anda
Catatan
Himpunan data untuk tutorial ini berasal dari 'Dari Grup ke Label Individual 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: University of California, School of Information dan Computer Science.
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_labeled.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 pernyataan 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
usingpernyataan, 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 Anda dan pilih Tambahkan>Item baru.
Dalam kotak dialog Tambahkan Item Baru , pilih Kelas dan ubah bidang Nama menjadi SentimentData.cs. Kemudian, pilih tombol Tambahkan .
File SentimentData.cs terbuka di editor kode. Tambahkan pernyataan 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 boolSentiment() nilai 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 agak lambat dalam pelayanan. | 0 |
| Crust tidak baik. | 0 |
| Wow... Mencintai 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.
Muat 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, ke DBContext dalam Kerangka Kerja Entitas.
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 menjalankan
LoadData()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. Dibutuhkan 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 ke dalam 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.Mengembalikan di
splitDataViewakhirLoadData()metode:return splitDataView;
Membangun dan melatih model
Tambahkan panggilan berikut ke metode di
BuildAndTrainModelbawah panggilan keLoadDatametode :ITransformer model = BuildAndTrainModel(mlContext, splitDataView.TrainSet);Metode menjalankan
BuildAndTrainModel()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 Fitur Pelayan agak lambat dalam pelayanan. 0 [0.76, 0.65, 0.44, ...] Crust tidak baik. 0 [0.98, 0.43, 0.54, ...] Wow... Mencintai 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 yang ditampilkan SentimentText (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 :
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;
Mengevaluasi 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 menjalankan
Evaluate()tugas-tugas berikut:- Memuat himpunan data pengujian.
- Membuat evaluator BinaryClassification.
- Mengevaluasi model dan membuat metrik.
- Menampilkan metrik.
Tambahkan panggilan ke metode baru di bawah
BuildAndTrainModelpanggilan metode menggunakan 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 dalam himpunan Labels 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 satu.F1ScoreMetrik mendapatkan skor F1 model, yang merupakan ukuran keseimbangan antara presisi dan pengenalan. Anda inginF1Scoresedekat mungkin dengan satu.
Memprediksi hasil data pengujian
UseModelWithSingleItem()Buat metode , tepat setelahEvaluate()metode , menggunakan kode berikut:void UseModelWithSingleItem(MLContext mlContext, ITransformer model) { }Metode menjalankan
UseModelWithSingleItem()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 panggilan ke metode baru tepat di bawah
Evaluate()panggilan metode 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 digunakan di lingkungan rangkaian tunggal atau prototipe. Untuk meningkatkan performa dan keamanan utas di lingkungan produksi, gunakanPredictionEnginePoollayanan , yang menciptakanObjectPoolPredictionEngineobjek untuk digunakan di seluruh aplikasi Anda. Lihat panduan ini tentang cara menggunakanPredictionEnginePooldalam ASP.NET Core Web API.Catatan
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 yang sesuai 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
UseModelWithBatchItems()Buat metode , tepat setelahUseModelWithSingleItem()metode , menggunakan kode berikut:void UseModelWithBatchItems(MLContext mlContext, ITransformer model) { }Metode menjalankan
UseModelWithBatchItems()tugas-tugas berikut:- Membuat data pengujian batch.
- Memprediksi sentimen berdasarkan data pengujian.
- Menggabungkan data pengujian dan prediksi untuk pelaporan.
- Menampilkan hasil yang diprediksi.
Tambahkan panggilan ke metode baru tepat di bawah
UseModelWithSingleItem()panggilan metode 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 yang Transform() diisi SentimentText dengan bidang yang diprediksi. Saat 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 ===============");
Hasil
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 sukses 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 berikutnya
Di tutorial ini, Anda akan mempelajari cara:
- Membuat aplikasi konsol
- Siapkan data
- Muat data
- Membangun dan melatih model
- Mengevaluasi model
- Menggunakan model untuk membuat prediksi
- Lihat hasilnya
Lanjutkan ke tutorial berikutnya untuk mempelajari lebih lanjut