Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
В этом руководстве показано, как создать консольное приложение .NET, которое классифицирует тональность из комментариев веб-сайта и принимает соответствующее действие. Классификатор двоичного тональности использует C# в Visual Studio 2022.
В этом руководстве вы узнаете, как:
- Создайте консольное приложение
- Подготовка данных
- Загрузка данных
- Создание и обучение модели
- Оценка модели
- Использование модели для прогнозирования
- Просмотр результатов
Исходный код для этого руководства можно найти в репозитории dotnet/samples .
Предпосылки
Создайте консольное приложение
Создайте консольное приложение C# с именем "SentimentAnalysis". Нажмите кнопку Далее.
Выберите .NET 8 в качестве платформы для использования. Нажмите кнопку Создать.
Создайте каталог с именем Data в проекте, чтобы сохранить файлы набора данных.
Установите пакет NuGet Microsoft.ML:
Замечание
В этом примере используется последняя стабильная версия пакетов NuGet, упомянутых в противном случае.
В обозревателе решений щелкните проект правой кнопкой мыши и выберите пункт "Управление пакетами NuGet". Выберите "nuget.org" в качестве источника пакета и перейдите на вкладку "Обзор ". Найдите Microsoft.ML, выберите нужный пакет и нажмите кнопку "Установить". Запустите установку, согласившись с условиями лицензии для выбранного пакета.
Подготовка данных
Замечание
Наборы данных для этого руководства относятся к набору данных из "Из группы в отдельные метки с помощью глубоких функций", Kotzias et. Аль. KDD 2015 и размещен в репозитории машинного обучения UCI - Дуа, Д. и Карра Танискиду, E. (2017). Репозиторий машинного обучения UCI [http://archive.ics.uci.edu/ml]. Ирвин: Калифорнийский университет, школа информационных и компьютерных наук.
Скачайте ZIP-файл ZIP-файла набора данных набора данных с метками UCI и распакуйте его.
yelp_labelled.txtСкопируйте файл в созданный каталог данных.В обозревателе решений щелкните файл правой кнопкой
yelp_labelled.txtмыши и выберите пункт "Свойства". В разделе "Дополнительно" измените значение копирования в выходной каталог , чтобы скопировать, если это еще больше.
Создание классов и определение путей
Добавьте следующие дополнительные
usingдирективы в начало файла Program.cs :using Microsoft.ML; using Microsoft.ML.Data; using SentimentAnalysis; using static Microsoft.ML.DataOperationsCatalog;Добавьте следующий код в строку справа от
usingдиректив, чтобы создать поле для хранения пути к файлу недавно скачаемого набора данных:string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "yelp_labelled.txt");Затем создайте классы для входных данных и прогнозов. Добавьте новый класс в проект:
В обозревателе решений щелкните проект правой кнопкой мыши и выберите пункт "Добавить>новый элемент".
В диалоговом окне "Добавление нового элемента" выберите класс и измените поле "Имя " на SentimentData.cs. Затем нажмите кнопку "Добавить".
Файл SentimentData.cs откроется в редакторе кода. Добавьте следующую
usingдирективу в начало SentimentData.cs:using Microsoft.ML.Data;Удалите существующее определение класса и добавьте следующий код, имеющий два класса
SentimentDataиSentimentPredictionфайл 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; } }
Подготовка данных
Входной класс SentimentDataнабора данных имеет значение string для комментариев пользователей (SentimentText) и bool (Sentiment) 1 (положительных) или 0 (отрицательных) для тональности. Оба поля имеют атрибуты LoadColumn , присоединенные к ним, которые описывают порядок файлов данных каждого поля. Кроме того, Sentiment свойство имеет атрибут ColumnName , чтобы назначить его в качестве Label поля. В следующем примере файла нет строки заголовка и выглядит следующим образом:
| Тональность | Тональность (метка) |
|---|---|
| Официантка была немного медленной в обслуживании. | 0 |
| Кора не хороша. | 0 |
| Ой... Любил это место. | 1 |
| Служба была очень запрашиваемой. | 1 |
SentimentPrediction — это класс прогнозирования, используемый после обучения модели. Он наследует от SentimentData того, чтобы входные данные SentimentText можно было отображать вместе с прогнозом выходных данных.
Prediction Логическое значение — это значение, прогнозируемое моделью при получении новых входных данныхSentimentText.
Класс SentimentPrediction выходных данных содержит два других свойства, вычисляемых моделью: Score — необработанная оценка, вычисляемая моделью, и Probability — оценка, откалибрированная до вероятности положительного настроения текста.
В этом руководстве наиболее важным является свойство Prediction.
Загрузка данных
Данные в ML.NET представлены в виде интерфейса IDataView.
IDataView — это гибкий, эффективный способ описания табличных данных (числовых и текстовых данных). Данные можно загружать из текстового файла или в режиме реального времени (например, базы данных SQL или файлов журналов) в IDataView объект.
Класс MLContext является отправной точкой для всех ML.NET операций. Инициализация mlContext создает новую среду ML.NET, которую можно совместно использовать для объектов рабочего процесса создания модели. Это аналогично, концептуально, и DBContext в Entity Framework.
Вы подготавливаете приложение, а затем загружаете данные:
Замените
Console.WriteLine("Hello World!")строку следующим кодом, чтобы объявить и инициализировать переменную mlContext:MLContext mlContext = new MLContext();Добавьте следующую строку кода:
TrainTestData splitDataView = LoadData(mlContext);LoadData()Создайте метод в нижней части файла с помощью следующегоProgram.csкода:TrainTestData LoadData(MLContext mlContext) { }Метод
LoadData()выполняет следующие задачи:- Загружает данные.
- Разбивает загруженный набор данных на обучаемые и тестовые наборы данных.
- Возвращает разделенные наборы данных и тестовые наборы данных.
Добавьте следующий код в первую строку
LoadData()метода:IDataView dataView = mlContext.Data.LoadFromTextFile<SentimentData>(_dataPath, hasHeader: false);Метод LoadFromTextFile() определяет схему данных и считывает в файле. Он принимает переменные пути к данным и возвращает значение
IDataView.
Разделение набора данных для обучения и тестирования модели
При подготовке модели вы используете часть набора данных для обучения и части набора данных для проверки точности модели.
Чтобы разделить загруженные данные на необходимые наборы данных, добавьте следующий код в качестве следующей строки в методе
LoadData():TrainTestData splitDataView = mlContext.Data.TrainTestSplit(dataView, testFraction: 0.2);Предыдущий код использует метод TrainTestSplit() для разделения загруженного набора данных на наборы данных для обучения и тестирования и возврата их в DataOperationsCatalog.TrainTestData классе. Укажите процент тестового набора данных с параметром
testFraction. Значение по умолчанию — 10%. В этом случае для оценки дополнительных данных используется 20%.Возвращается
splitDataViewв концеLoadData()метода:return splitDataView;
Создание и обучение модели
Добавьте следующий вызов
BuildAndTrainModelк методу под вызовомLoadDataметода:ITransformer model = BuildAndTrainModel(mlContext, splitDataView.TrainSet);Метод
BuildAndTrainModel()выполняет следующие задачи:- Извлекает и преобразует данные.
- Обучает модель.
- Прогнозирование тональности на основе тестовых данных.
- Возвращает модель.
BuildAndTrainModel()Создайте метод подLoadData()методом, используя следующий код:ITransformer BuildAndTrainModel(MLContext mlContext, IDataView splitTrainSet) { }
Извлечение и преобразование данных
Вызов в
FeaturizeTextкачестве следующей строки кода:var estimator = mlContext.Transforms.Text.FeaturizeText(outputColumnName: "Features", inputColumnName: nameof(SentimentData.SentimentText))Метод
FeaturizeText()в предыдущем коде преобразует текстовый столбец (SentimentText) в числовой столбец типаFeaturesключа, используемый алгоритмом машинного обучения, и добавляет его в качестве нового столбца набора данных:Тональность Настроение Функции Официантка была немного медленной в обслуживании. 0 [0.76, 0.65, 0.44, …] Кора не хороша. 0 [0.98, 0.43, 0.54, …] Ой... Любил это место. 1 [0.35, 0.73, 0.46, …] Служба была очень запрашиваемой. 1 [0.39, 0, 0.75, …]
Добавление алгоритма обучения
В этом приложении используется алгоритм классификации, который классифицирует элементы или строки данных. Приложение классифицирует комментарии веб-сайта как положительные или отрицательные, поэтому используйте задачу двоичной классификации.
Добавьте задачу машинного обучения в определения преобразования данных, добавив следующую строку кода в BuildAndTrainModel():
.Append(mlContext.BinaryClassification.Trainers.SdcaLogisticRegression(labelColumnName: "Label", featureColumnName: "Features"));
SdcaLogisticRegressionBinaryTrainer — это алгоритм обучения классификации. Это добавляется к estimator и принимает признаки SentimentText (Features) и Label входные параметры для изучения исторических данных.
Обучение модели
Вместите модель в splitTrainSet данные и верните обученную модель, добавив следующую строку кода в BuildAndTrainModel() методе:
Console.WriteLine("=============== Create and Train the Model ===============");
var model = estimator.Fit(splitTrainSet);
Console.WriteLine("=============== End of training ===============");
Console.WriteLine();
Метод Fit() обучает модель путем преобразования набора данных и применения обучения.
Возврат модели, обученной для оценки
Верните модель в конце BuildAndTrainModel() метода:
return model;
Оценка модели
После обучения модели используйте тестовые данные для проверки производительности модели.
Evaluate()Создайте метод сразу послеBuildAndTrainModel()этого с помощью следующего кода:void Evaluate(MLContext mlContext, ITransformer model, IDataView splitTestSet) { }Метод
Evaluate()выполняет следующие задачи:- Загружает тестовый набор данных.
- Создает средство оценки BinaryClassification.
- Оценивает модель и создает метрики.
- Отображает метрики.
Добавьте вызов нового метода под
BuildAndTrainModelвызовом метода с помощью следующего кода:Evaluate(mlContext, model, splitDataView.TestSet);splitTestSetПреобразование данных путем добавления следующего кодаEvaluate()в:Console.WriteLine("=============== Evaluating Model accuracy with Test data==============="); IDataView predictions = model.Transform(splitTestSet);Предыдущий код использует метод Transform() для прогнозирования нескольких предоставленных входных строк тестового набора данных.
Оцените модель, добавив следующую строку кода в
Evaluate()методе:CalibratedBinaryClassificationMetrics metrics = mlContext.BinaryClassification.Evaluate(predictions, "Label");
После получения прогнозирующего набора (predictions), метод Evaluate() оценивает модель, которая сравнивает прогнозируемые значения с фактическим Labels в тестовом наборе данных и возвращает объект CalibratedBinaryClassificationMetrics о том, как выполняется модель.
Отображение метрик для проверки модели
Используйте следующий код для отображения метрик:
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 ===============");
AccuracyМетрика получает точность модели, которая является пропорцией правильных прогнозов в тестовом наборе.AreaUnderRocCurveМетрика указывает, насколько уверенно модель правильно классифицирует положительные и отрицательные классы. Вы хотитеAreaUnderRocCurveбыть как можно ближе к одному.F1ScoreМетрика получает оценку F1 модели, которая является мерой баланса между точностью и отзывом. Вы хотитеF1Scoreбыть как можно ближе к одному.
Прогнозирование результата тестовых данных
UseModelWithSingleItem()Создайте метод сразу послеEvaluate()метода, используя следующий код:void UseModelWithSingleItem(MLContext mlContext, ITransformer model) { }Метод
UseModelWithSingleItem()выполняет следующие задачи:- Создает один комментарий тестовых данных.
- Прогнозирование тональности на основе тестовых данных.
- Объединяет тестовые данные и прогнозы для создания отчетов.
- Отображает прогнозируемые результаты.
Добавьте вызов нового метода прямо под
Evaluate()вызовом метода, используя следующий код:UseModelWithSingleItem(mlContext, model);Добавьте следующий код, чтобы создать в качестве первой строки в методе
UseModelWithSingleItem():PredictionEngine<SentimentData, SentimentPrediction> predictionFunction = mlContext.Model.CreatePredictionEngine<SentimentData, SentimentPrediction>(model);PredictionEngine — это удобный API, который позволяет выполнять прогноз на одном экземпляре данных.
PredictionEngineне является потокобезопасной. Его можно использовать в однопоточных или прототипных средах. Для повышения производительности и безопасности потоков в рабочих средах используйтеPredictionEnginePoolслужбу, которая создаетObjectPoolPredictionEngineобъекты для использования во всем приложении. См. это руководство по использованиюPredictionEnginePoolв веб-API ASP.NET Core.Замечание
PredictionEnginePoolРасширение службы в настоящее время находится в предварительной версии.Добавьте комментарий для тестирования прогноза обученной модели в методе
UseModelWithSingleItem()путем создания экземпляраSentimentData:SentimentData sampleStatement = new SentimentData { SentimentText = "This was a very bad steak" };Передайте данные
PredictionEngineтестового комментария, добавив следующие строки кода вUseModelWithSingleItem()методе:var resultPrediction = predictionFunction.Predict(sampleStatement);Функция Predict() делает прогноз по одной строке данных.
Отображение
SentimentTextи соответствующее прогнозирование тональности с помощью следующего кода: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();
Использование модели для прогнозирования
Развертывание и прогнозирование элементов пакетной службы
UseModelWithBatchItems()Создайте метод сразу послеUseModelWithSingleItem()метода, используя следующий код:void UseModelWithBatchItems(MLContext mlContext, ITransformer model) { }Метод
UseModelWithBatchItems()выполняет следующие задачи:- Создает данные пакетного теста.
- Прогнозирование тональности на основе тестовых данных.
- Объединяет тестовые данные и прогнозы для создания отчетов.
- Отображает прогнозируемые результаты.
Добавьте вызов нового метода прямо под
UseModelWithSingleItem()вызовом метода, используя следующий код:UseModelWithBatchItems(mlContext, model);Добавьте некоторые комментарии для тестирования прогнозов обученной модели в методе
UseModelWithBatchItems():IEnumerable<SentimentData> sentiments = new[] { new SentimentData { SentimentText = "This was a horrible meal" }, new SentimentData { SentimentText = "I love this spaghetti." } };
Прогнозирование тональности комментариев
Используйте модель для прогнозирования тональности данных комментариев с помощью метода 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);
Объединение и отображение прогнозов
Создайте заголовок для прогнозов с помощью следующего кода:
Console.WriteLine();
Console.WriteLine("=============== Prediction Test of loaded model with multiple samples ===============");
Так как SentimentPrediction наследуется от SentimentDataметода, Transform() заполненного прогнозируемыми SentimentText полями. В процессе ML.NET каждый компонент добавляет столбцы, и это упрощает отображение результатов:
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
Результаты должны совпадать со следующими результатами. Во время обработки отображаются сообщения. Вы можете видеть предупреждения или обрабатывать сообщения. Они были удалены из следующих результатов для ясности.
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 . . .
Поздравляю! Теперь вы успешно создали модель машинного обучения для классификации и прогнозирования тональности сообщений.
Построение успешных моделей — это итеративный процесс. Эта модель имеет начальное низкое качество, так как в этом руководстве используются небольшие наборы данных для быстрого обучения модели. Если вы не удовлетворены качеством модели, вы можете попытаться улучшить его, предоставив более крупные наборы данных обучения или выбрав различные алгоритмы обучения с различными гиперпараметров для каждого алгоритма.
Исходный код для этого руководства можно найти в репозитории dotnet/samples .
Дальнейшие шаги
Из этого руководства вы узнали, как:
- Создайте консольное приложение
- Подготовка данных
- Загрузка данных
- Создание и обучение модели
- Оценка модели
- Использование модели для прогнозирования
- Просмотр результатов
Перейдите к следующему руководству, чтобы узнать больше