Что такое ML.NET и принципы работы этой системы

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

В основе ML.NET лежит модель машинного обучения. Эта модель определяет шаги, которые необходимо выполнить для получения прогнозов на основе входных данных. С помощью ML.NET вы можете обучить пользовательскую модель, указав соответствующий алгоритм, а также импортировать предварительно обученные модели TensorFlow и ONNX.

Созданную модель можно добавить в приложение и использовать ее для получения прогнозов.

ML.NET работает в Windows, Linux и macOS с помощью .NET или в Windows с помощью платформа .NET Framework. 64-разрядная версия поддерживается на всех платформах. 32-разрядная версия поддерживается в Windows, за исключением функций, связанных с TensorFlow, LightGBM и ONNX.

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

Тип прогноза Пример
Классификация и категоризация Автоматическое разделение отзывов клиентов на положительные и отрицательные категории.
Регрессия/прогнозирование непрерывных значений Прогнозирование цены домов на основе размера и расположения.
Обнаружение аномалий Обнаружение мошеннических банковских транзакций.
Рекомендации Предложить продукты, которые интернет-покупатели могут захотеть купить, основываясь на их предыдущих покупках.
Временные ряды/последовательности Прогнозирование погоды или продаж продуктов.
Классификация изображений Классификация патологий в медицинских изображениях.
Классификация текстов Классифицируйте документы на основе их содержимого.
Сходство предложений Измеряйте, насколько похожи два предложения.

Hello ML.NET World

В следующем фрагменте кода показано простейшее приложение ML.NET. Код в этом примере создает модель линейной регрессии для прогнозирования цен на дома, исходя из их размера и стоимости.

   using System;
   using Microsoft.ML;
   using Microsoft.ML.Data;

   class Program
   {
       public class HouseData
       {
           public float Size { get; set; }
           public float Price { get; set; }
       }

       public class Prediction
       {
           [ColumnName("Score")]
           public float Price { get; set; }
       }

       static void Main(string[] args)
       {
           MLContext mlContext = new MLContext();

           // 1. Import or create training data
           HouseData[] houseData = {
               new HouseData() { Size = 1.1F, Price = 1.2F },
               new HouseData() { Size = 1.9F, Price = 2.3F },
               new HouseData() { Size = 2.8F, Price = 3.0F },
               new HouseData() { Size = 3.4F, Price = 3.7F } };
           IDataView trainingData = mlContext.Data.LoadFromEnumerable(houseData);

           // 2. Specify data preparation and model training pipeline
           var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })
               .Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Price", maximumNumberOfIterations: 100));

           // 3. Train model
           var model = pipeline.Fit(trainingData);

           // 4. Make a prediction
           var size = new HouseData() { Size = 2.5F };
           var price = mlContext.Model.CreatePredictionEngine<HouseData, Prediction>(model).Predict(size);

           Console.WriteLine($"Predicted price for size: {size.Size*1000} sq ft= {price.Price*100:C}k");

           // Predicted price for size: 2500 sq ft= $261.98k
       }
   }

Порядок работы с кодом

На представленной ниже схеме показана структура кода приложения, а также итеративный процесс разработки модели.

  • Сбор и загрузка обучающих данных в объект IDataView
  • Указание конвейера операций для извлечения функций и применение алгоритма машинного обучения
  • Обучение модели путем вызова функции Fit() для конвейера
  • Оценка модели и итерации для ее улучшения
  • Сохранение модели в двоичном формате для использования в приложении
  • Загрузка модели обратно в объект ITransformer
  • Прогнозирование с помощью функции CreatePredictionEngine.Predict()

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

Рассмотрим эти этапы более подробно.

Модель машинного обучения

Модель ML.NET — это объект, содержащий преобразования для получения прогнозов на основе предоставленных вами данных.

Базовая

Самая базовая модель — это двухмерная линейная регрессия, где одно непрерывное количество пропорционально другому, как в приведенном выше примере с ценами на дома.

Модель линейной регрессии с параметрами смещения и веса

Модель проста: $Цена = b + Размер * w$. Параметры $b$ и $w$ рассчитываются с помощью линии, проведенной через набор пар данных (размер, цена). Данные, используемые для поиска параметров модели, называется обучающими. Входные данные модели машинного обучения называются компонентами. В этом примере $Размер$ — единственный компонент. Эталонные значения, которые используются для обучения модели машинного обучения, называются метками. В этом примере метками служат значения параметра $Цена$ в обучающем наборе данных.

Более сложная модель

Более сложная модель классифицирует финансовые транзакции по категориям, используя текстовые описания транзакций.

Описание транзакции разбивается на набор компонентов — для этого удаляются избыточные слова и символы и подсчитывается количество слов и комбинаций символов. Набор компонентов используется для обучения линейной модели на основе набора категорий в обучающих данных. Чем больше новые описания похожи на те, что уже присутствуют в наборе обучающих данных, тем выше вероятность того, что соответствующим транзакциям будет присвоена та же категория.

Модель классификации текста

И модель прогнозирования цен на дома, и модель классификации текста являются линейными. В зависимости от характера ваших данных и решаемой задачи можно также использовать модели дерева принятия решений, обобщенные аддитивные модели и т. д. Дополнительные сведения о моделях см. в статье Задачи.

Подготовка данных

В большинстве случаев доступные данные не подходят для обучения модели машинного обучения в их исходном виде. Необработанные данные необходимо подготовить (подвергнуть предварительной обработке), прежде чем их можно будет использовать для поиска параметров вашей модели. Возможно, данные придется преобразовать из строковых значений в числовые, освободить от избыточной информации, уменьшить или увеличить их размер, масштабировать или нормализовать.

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

См. сведения о подготовке данных.

Информацию обо всех доступных преобразованиях вы найдете в разделе ресурсов.

Оценка модели

Как узнать, насколько точные прогнозы будет давать обученная вами модель? ML.NET позволяет оценить модель по новым тестовым данным.

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

В примере с ценами на дома мы использовали задачу Регрессия. Чтобы оценить модель, добавьте к исходному образцу следующий код:

        HouseData[] testHouseData =
        {
            new HouseData() { Size = 1.1F, Price = 0.98F },
            new HouseData() { Size = 1.9F, Price = 2.1F },
            new HouseData() { Size = 2.8F, Price = 2.9F },
            new HouseData() { Size = 3.4F, Price = 3.6F }
        };

        var testHouseDataView = mlContext.Data.LoadFromEnumerable(testHouseData);
        var testPriceDataView = model.Transform(testHouseDataView);

        var metrics = mlContext.Regression.Evaluate(testPriceDataView, labelColumnName: "Price");

        Console.WriteLine($"R^2: {metrics.RSquared:0.##}");
        Console.WriteLine($"RMS error: {metrics.RootMeanSquaredError:0.##}");

        // R^2: 0.96
        // RMS error: 0.19

Метрики оценки покажут, что ошибки незначительны, а корреляция между прогнозируемыми результатами и выходными данными теста высока. Это было несложно. На практике для получения хороших метрик модели требуется гораздо более тщательная настройка.

Архитектура ML.NET

В этом разделе описываются архитектурные шаблоны ML.NET. Если вы опытный разработчик .NET, некоторые из этих шаблонов будут знакомы вам, и некоторые из них будут менее знакомы.

Приложение ML.NET начинается с объекта MLContext. Этот одноэлементный объект содержит каталоги. Каталог — это фабрика загрузки и сохранения данных, преобразований, инструкторов и компонентов операций модели. Каждый объект каталога имеет методы для создания различных типов компонентов.

Задача Каталог
Загрузка и сохранение данных DataOperationsCatalog
Подготовка данных TransformsCatalog
Двоичная классификация BinaryClassificationCatalog
Классификация по нескольким классам MulticlassClassificationCatalog
Обнаружение аномалий AnomalyDetectionCatalog
Кластеризация ClusteringCatalog
Прогнозирование ForecastingCatalog
Рейтинг RankingCatalog
Регрессия RegressionCatalog
Рекомендация RecommendationCatalog
Временной ряд TimeSeriesCatalog
Использование модели ModelOperationsCatalog

Через каждую из указанных выше категорий можно перейти к соответствующим методам создания. В Visual Studio каталоги отображаются с помощью IntelliSense.

IntelliSense для инструкторов регрессии

Создание конвейера

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

var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })
    .Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Price", maximumNumberOfIterations: 100));

В представленном ниже фрагменте кода Concatenate и Sdca — это методы из каталога. Каждый из них создает объект IEstimator , добавляемый к конвейеру.

На этом этапе объекты были созданы, но выполнение не произошло.

Обучение модели

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

var model = pipeline.Fit(trainingData);

Вызов функции Fit() задействует входные обучающие данные для оценки параметров модели. Это называется обучение модели. Помните, что модель линейной регрессии, показанная ранее, имела два параметра модели: предвзятость и вес. После вызова функции Fit() значения этих параметров становятся известны. (Большинство моделей будут иметь гораздо больше параметров, чем это.)

См. сведения об обучении моделей.

Полученный объект модели реализует интерфейс ITransformer. Это значит, что модель преобразует входные данные в прогнозы.

IDataView predictions = model.Transform(inputData);

Использование модели

Входные данные можно преобразовывать в прогнозы все сразу или по очереди. Пример цен на жилье сделал оба: в массовой части для оценки модели, и по одному за раз, чтобы сделать новый прогноз. Рассмотрим получение одиночных прогнозов.

var size = new HouseData() { Size = 2.5F };
var predEngine = mlContext.CreatePredictionEngine<HouseData, Prediction>(model);
var price = predEngine.Predict(size);

Метод CreatePredictionEngine() принимает входной и выходной класс данных. Имена полей или атрибуты кода определяют имена столбцов данных, используемых во время обучения модели и прогнозирования. Дополнительные сведения см. в статье Прогнозирование с помощью обученной модели.

Модели и схема данных

В основе конвейера машинного обучения ML.NET лежат объекты DataView.

Каждое преобразование в конвейере имеет входную схему (имена, типы и размеры данных, которые должны присутствовать во входных данных) и схему вывода (имена, типы и размеры данных, которые создаются после преобразования).

Если схема вывода из одного преобразования в конвейере не соответствует входной схеме, ML.NET выдает исключение.

Объект представления данных содержит столбцы и строки. Каждый столбец содержит имя, тип и длину. Например, столбцы входных данных в примере с ценами на дома — это Size и Price. Оба имеют тип и являются скорее скалярными, а не векторными величинами.

Пример представления данных ML.NET с данными прогнозов по ценам на дома

Все алгоритмы ML.NET ищут входной столбец, который является вектором. По умолчанию этот столбец вектора называется "Функции". Вот почему пример цены на жилье объединяет столбец Size в новый столбец с именем Features.

var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })

Все алгоритмы также создают новые столбцы после выполнения прогноза. Фиксированные имена этих новых столбцов зависят от типа алгоритма машинного обучения. Для задачи регрессии один из новых столбцов называется Score , как показано в атрибуте данных о ценах.

public class Prediction
{
    [ColumnName("Score")]
    public float Price { get; set; }
}

Дополнительные сведения о выходных столбцах различных задач машинного обучения см в руководстве Задачи машинного обучения.

Важное свойство объектов DataView заключается в том, что они оцениваются лениво. Представления данных загружаются и используются только во время обучения и оценки модели и при прогнозировании данных. В процессе написания и тестирования приложения ML.NET можно использовать отладчик Visual Studio, чтобы посмотреть на любой объект представления данных, вызвав метод предварительного просмотра.

var debug = testPriceDataView.Preview();

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

Развертывание модели

В реальных приложениях обучение и оценка модели будут отделены от прогнозирования. На практике эти действия часто выполняют разные группы разработчиков. Ваша команда разработчиков модели может сохранить модель для использования в приложении прогнозирования.

mlContext.Model.Save(model, trainingData.Schema,"model.zip");

Следующие шаги