ML.NET — начало работы

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 приложение

Создание консольного .NET Core приложения в VS2019

После создания проекта, нажмём по нему правой кнопкой мыши, выберем Add, а затем Machine Learning

Добавление Machine Learning в проект

В ML.NET Model Builder на первом шаге необходимо выбрать сценарий, который наилучшим образом может решить вашу проблему.

Выбор сценария в ML.NET Model Builder

Сейчас доступны 4 сценария:

  1. Sentiment Analysis — классифицирует данные в двух категориях (позитивная/негативная). Примером служит анализ того, является ли комментарий позитивным либо нет. Этот же анализ может помочь, например, с распознаванием спама в письмах. То есть если вам необходимо предсказать бинарный результат, то это то что нужно.
  2. Issue Classification — если результат предсказания не бинарный, а может быть в 3+ категориях, тогда вам подойдёт данный сценарий.
  3. Price Prediction — данный сценарий предсказывает числовое значение основываясь на ваших данных, это может быть например предсказание цены продукта.
  4. 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"

Начало процесса обучения модели

После завершения можно увидеть алгоритм, который показал наибольшую точность предсказания и непосредственно саму точность.

Данные точности обученной модели и используемые при подборе алгоритмы

На пятом шаге мы может добавить полученный код в наш проект.

Добавление кода в .NET Core проект

После добавления структура проекта будет следующая:

Структура созданного проекта

Файл 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:

Добавление Microsoft.ML в проект

Так же в 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("---");
    }            
}

Запустим программу и напишем несколько сообщений.

Результат работы обученной модели для поиска spam сообщений

Как можно видеть, предсказание работает. Конечно, нужно учитывать качество и количество данных, на которых происходило обучение, для реальных проектов столь малой выборки будет явно недостаточно. Если в процессе получения новых актуальных данных проводить дополнительное обучение, то в каком-то виде использовать её можно уже сейчас.

О том, как можно сделать обучение модели в процессе работы программы я покажу в следующей статье. А пока попробуйте ML.NET самостоятельно в своих проектах.

Приятного программирования.

Комментарии (2) -

Андрей, благодарю за пример и за то, что затронули интересное Smile

Андрей 15.07.2019 9:20:21

Здравствуйте. Рад что понравилось.

Добавить комментарий