ML.NET даёт простой и удобный механизм использования алгоритмов машинного обучения в .NET приложениях не прибегая к сторонним сервисам. В настоящее время доступна версия 1.1.0 и это уже стабильная и мощная библиотека, содержащая набор различных алгоритмов для решения ML задач. Кроме того, сейчас доступно preview расширения для Visual Studio с названием ML.NET Model Builder, делающее процесс добавления модели максимально комфортным. В данной статье я покажу как можно начать использовать ML.NET на простых задачах, в последующих статьях я буду показывать более сложные сценарии использования.
Для работы я буду использовать Visual Studio 2019, community версии будет достаточно. Также необходимо установить расширение ML.NET Model Builder, сделать это можно по ссылке http://aka.ms/mlnettemplates
После установки создадим консольное .NET Core приложение
После создания проекта, нажмём по нему правой кнопкой мыши, выберем Add
, а затем Machine Learning
В ML.NET Model Builder на первом шаге необходимо выбрать сценарий, который наилучшим образом может решить вашу проблему.
Сейчас доступны 4 сценария:
- Sentiment Analysis — классифицирует данные в двух категориях (позитивная/негативная). Примером служит анализ того, является ли комментарий позитивным либо нет. Этот же анализ может помочь, например, с распознаванием спама в письмах. То есть если вам необходимо предсказать бинарный результат, то это то что нужно.
- Issue Classification — если результат предсказания не бинарный, а может быть в 3+ категориях, тогда вам подойдёт данный сценарий.
- Price Prediction — данный сценарий предсказывает числовое значение основываясь на ваших данных, это может быть например предсказание цены продукта.
- Custom scenario — позволяет создавать пользовательские модели. Данный сценарий подойдёт, если первые три сценария не могут решить вашу задачу.
Сегодня я рассмотрю задачу бинарной классификации на примере спам детектора сообщений. Выберем сценарий "Sentiment Analysis
"
На втором шаге необходимо указать источник данных для обучения. Это может быть либо файл, либо SQL сервер. Я буду использовать файл из примеров использования Model Builder, скачать архив с данными можно по ссылке
В архиве содержится файл SMSSpamCollection, который содержит 5574 сообщений, помеченных как ham или spam. В ML.NET Model Builder для обучения можно использовать CSV или TSV файлы размером до 1 GB. Поэтому данный файл нужно привести к TSV виду. Так же предсказываемое значение не должно быть строкой, в данном случае вместо "ham" запишем 0, вместо "spam" будет 1. То есть единица будет указывать что данное сообщение гарантированно является спамом. Готовый TSV файл можно загрузить здесь.
Выбираем файл и устанавливаем столбец для предсказания "Spam":
Теперь можно переходить на 3 шаг "Train" — здесь будет происходить подбор необходимого алгоритма и его обучение. Из настроек необходимо указать время, которое будет затрачено на обучение. Примерное рекомендуемое время выглядит следующим образом:
Но стоит учесть, что итоговое время может отличаться, в зависимости от вашей задачи и доступных вычислительных мощностей.
Так как в моём случае файл небольшой, то 10 секунд должно быть достаточно, можно жать "Start training
"
После завершения можно увидеть алгоритм, который показал наибольшую точность предсказания и непосредственно саму точность.
На пятом шаге мы может добавить полученный код в наш проект.
После добавления структура проекта будет следующая:
Файл MLModel.zip это и есть наша обученная модель, на основе которой в дальнейшем будет обрабатываться данные.
В проекте TestMLML.ConsoleApp в файле Program.cs метод Main имеет следующий вид:
static void Main(string[] args)
{
MLContext mlContext = new MLContext();
// Training code used by ML.NET CLI and AutoML to generate the model
//ModelBuilder.CreateModel();
ITransformer mlModel = mlContext.Model.Load(GetAbsolutePath(MODEL_FILEPATH), out DataViewSchema inputSchema);
var predEngine = mlContext.Model.CreatePredictionEngine<ModelInput, ModelOutput>(mlModel);
// Create sample data to do a single prediction with it
ModelInput sampleData = CreateSingleDataSample(mlContext, DATA_FILEPATH);
// Try a single prediction
ModelOutput predictionResult = predEngine.Predict(sampleData);
Console.WriteLine($"Single Prediction --> Actual value: {sampleData.Spam} | Predicted value: {predictionResult.Prediction}");
Console.WriteLine("=============== End of process, hit any key to finish ===============");
Console.ReadKey();
}
Если раскомментировать строку ModelBuilder.CreateModel();
то при запуске модель будет обучена заново. Это позволяет повышать точность модели при наличии более актуальных данных для обучения.
Осталось проверить работу нашей обученной модели. Перейдём в проект TestML и добавим пакет Microsoft.ML из NuGet:
Так же в Dependencies добавим проект TestMLML.Model.
Далее откроем файл Program.cs
и добавим следующий код
static void Main(string[] args)
{
MLContext mlContext = new MLContext();
ITransformer mlModel = mlContext.Model.Load("MLModel.zip", out var modelInputSchema);
var predEngine = mlContext.Model.CreatePredictionEngine<ModelInput, ModelOutput>(mlModel);
Console.WriteLine("Write 0 to exit");
var inputStr = string.Empty;
while (inputStr != "0")
{
inputStr = Console.ReadLine();
var input = new ModelInput();
input.Message = inputStr;
ModelOutput result = predEngine.Predict(input);
Console.WriteLine(result.Prediction ? "This is spam" : "Normal message");
Console.WriteLine("---");
}
}
Запустим программу и напишем несколько сообщений.
Как можно видеть, предсказание работает. Конечно, нужно учитывать качество и количество данных, на которых происходило обучение, для реальных проектов столь малой выборки будет явно недостаточно. Если в процессе получения новых актуальных данных проводить дополнительное обучение, то в каком-то виде использовать её можно уже сейчас.
О том, как можно сделать обучение модели в процессе работы программы я покажу в следующей статье. А пока попробуйте ML.NET самостоятельно в своих проектах.
Приятного программирования.