Поделиться через


Руководство по классификации цветов ириса с помощью кластеризации k-средних с помощью ML.NET

В этом руководстве показано, как использовать ML.NET для создания модели кластеризации для набора данных о цветках ириса.

В этом руководстве вы узнаете, как:

  • Определение проблемы
  • Выберите соответствующую задачу машинного обучения
  • Подготовка данных
  • Загрузка и преобразование данных
  • Выбор алгоритма обучения
  • Обучение модели
  • Использование модели для прогнозирования

Предпосылки

Определение проблемы

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

Выберите соответствующую задачу машинного обучения

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

Создайте консольное приложение

  1. Создайте консольное приложение C# с именем IrisFlowerClustering. Нажмите кнопку Далее.

  2. Выберите .NET 8 в качестве платформы для использования. Нажмите кнопку Создать.

  3. Создайте каталог с именем Data в проекте для хранения файлов набора данных и моделей:

    В обозревателе решений щелкните проект правой кнопкой мыши и выберите команду "Добавить>новую папку". Введите "Данные" и нажмите ВВОД.

  4. Установите пакет NuGet Microsoft.ML :

    Замечание

    В этом примере используется последняя стабильная версия упомянутых пакетов NuGet, если не указано иное.

    В обозревателе решений щелкните проект правой кнопкой мыши и выберите Управление пакетами NuGet. Выберите "nuget.org" в качестве источника пакета, перейдите на вкладку "Обзор ", найдите Microsoft.ML и выберите "Установить". Нажмите кнопку "ОК " в диалоговом окне "Предварительные изменения" , а затем нажмите кнопку "Принять" в диалоговом окне принятия лицензий, если вы согласны с условиями лицензии для перечисленных пакетов.

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

  1. Скачайте набор данных iris.data и сохраните его в папку данных , созданную на предыдущем шаге. Дополнительные сведения о наборе данных Iris см. на странице "Набор данных о цветах ириса" и на странице "Набор данных Iris", который является источником набора данных.

  2. В обозревателе решений щелкните правой кнопкой мыши файл iris.data и выберите "Свойства". В разделе "Дополнительно" измените значение Копировать в выходной каталог на Копировать, если новее.

Файл iris.data содержит пять столбцов, представляющих:

  • длина чашелистика в сантиметрах
  • ширина чашелистика в сантиметрах
  • длина лепестка в сантиметрах
  • ширина лепестка в сантиметрах
  • тип цветка ириса

Для примера кластеризации в этом руководстве игнорируется последний столбец.

Создание классов данных

Создайте классы для входных данных и прогнозов:

  1. В обозревателе решений щелкните проект правой кнопкой мыши и выберите пункт "Добавить>новый элемент".

  2. В диалоговом окне "Добавление нового элемента" выберите класс и измените поле "Имя " на IrisData.cs. Затем нажмите кнопку "Добавить".

  3. Добавьте следующую using директиву в новый файл:

    using Microsoft.ML.Data;
    

Удалите существующее определение класса и добавьте следующий код, который определяет классы IrisData и ClusterPrediction, в файл IrisData.cs :

public class IrisData
{
    [LoadColumn(0)]
    public float SepalLength;

    [LoadColumn(1)]
    public float SepalWidth;

    [LoadColumn(2)]
    public float PetalLength;

    [LoadColumn(3)]
    public float PetalWidth;
}

public class ClusterPrediction
{
    [ColumnName("PredictedLabel")]
    public uint PredictedClusterId;

    [ColumnName("Score")]
    public float[]? Distances;
}

IrisData — это входной класс данных и содержит определения для каждой функции из набора данных. Используйте атрибут LoadColumn , чтобы указать индексы исходных столбцов в файле набора данных.

Класс ClusterPrediction представляет выходные данные модели кластеризации, примененной к экземпляру IrisData . Используйте атрибут ColumnName , чтобы привязать PredictedClusterId поля Distances к столбцам PredictedLabel и Score соответственно. В случае задачи кластеризации эти столбцы имеют следующее значение:

  • Столбец PredictedLabel содержит идентификатор прогнозируемого кластера.
  • Столбец score содержит массив с квадратами евклидовых расстояний до центроидов кластеров. Длина массива равна количеству кластеров.

Замечание

float Используйте тип для представления значений с плавающей запятой в классах входных и прогнозирующих данных.

Определение путей к данным и моделям

Вернитесь к файлу Program.cs и добавьте два поля для хранения путей к файлу набора данных и к файлу, чтобы сохранить модель:

  • _dataPath содержит путь к файлу с набором данных, используемым для обучения модели.
  • _modelPath содержит путь к файлу, в котором хранится обученная модель.

Добавьте следующий код в using директивы, чтобы указать эти пути:

string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "iris.data");
string _modelPath = Path.Combine(Environment.CurrentDirectory, "Data", "IrisClusteringModel.zip");

Создание контекста машинного обучения

Добавьте следующие дополнительные using директивы в начало файла Program.cs :

using Microsoft.ML;
using IrisFlowerClustering;

Замените Console.WriteLine("Hello World!"); строку следующим кодом:

var mlContext = new MLContext(seed: 0);

Класс Microsoft.ML.MLContext представляет среду машинного обучения и предоставляет механизмы ведения журнала и точек входа для загрузки данных, обучения моделей, прогнозирования и других задач. Это сравнимо концептуально с использованием DbContext в Entity Framework.

Настройка загрузки данных

Добавьте следующий код ниже MLContext , чтобы настроить способ загрузки данных:

IDataView dataView = mlContext.Data.LoadFromTextFile<IrisData>(_dataPath, hasHeader: false, separatorChar: ',');

Универсальный MLContext.Data.LoadFromTextFile метод расширения определяет схему набора данных из предоставленного IrisData типа и возвращает IDataView , который можно использовать в качестве входных данных для преобразователей.

Создание конвейера обучения

В этом руководстве конвейер обучения задачи кластеризации состоит из двух следующих этапов:

  • объединение загруженных столбцов в один столбец признаков, который используется тренером кластеризации;
  • KMeansTrainer Используйте обучающий средство для обучения модели с помощью алгоритма кластеризации k-средних средств.

Добавьте следующее после загрузки данных:

string featuresColumnName = "Features";
var pipeline = mlContext.Transforms
    .Concatenate(featuresColumnName, "SepalLength", "SepalWidth", "PetalLength", "PetalWidth")
    .Append(mlContext.Clustering.Trainers.KMeans(featuresColumnName, numberOfClusters: 3));

Код указывает, что набор данных должен быть разделен на три кластера.

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

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

var model = pipeline.Fit(dataView);

Сохранение модели

На этом этапе у вас есть модель, которая может быть интегрирована в любые существующие или новые приложения .NET. Чтобы сохранить модель в файл .zip, добавьте следующий код ниже, вызывающий Fit метод:

using (var fileStream = new FileStream(_modelPath, FileMode.Create, FileAccess.Write, FileShare.Write))
{
    mlContext.Model.Save(model, dataView.Schema, fileStream);
}

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

Чтобы сделать прогнозы, используйте PredictionEngine<TSrc,TDst> класс, который принимает экземпляры входного типа через конвейер преобразователя и создает экземпляры выходного типа. Добавьте следующую строку для создания экземпляра этого класса:

var predictor = mlContext.Model.CreatePredictionEngine<IrisData, ClusterPrediction>(model);

PredictionEngine — это удобный API, который позволяет выполнять прогноз на одном экземпляре данных. PredictionEngine не является потокобезопасной. Его можно использовать в однопоточных или прототипных средах. Для повышения производительности и безопасности потоков в рабочих средах используйте PredictionEnginePool службу, которая создает ObjectPoolPredictionEngine объекты для использования во всем приложении. См. это руководство по использованию PredictionEnginePool в веб-API ASP.NET Core.

Замечание

PredictionEnginePool Расширение службы в настоящее время находится в предварительной версии.

TestIrisData Создайте класс для размещения тестовых экземпляров данных:

  1. В обозревателе решений щелкните проект правой кнопкой мыши и выберите пункт "Добавить>новый элемент".

  2. В диалоговом окне "Добавление нового элемента" выберите класс и измените поле "Имя " на TestIrisData.cs. Затем нажмите кнопку "Добавить".

  3. Измените класс, чтобы он был статическим, как в следующем примере:

    static class TestIrisData
    

В этом руководстве представлен один экземпляр данных Ирис в этом классе. Вы можете добавить другие сценарии для экспериментов с моделью. Добавьте следующий код в TestIrisData класс:

internal static readonly IrisData Setosa = new IrisData
{
    SepalLength = 5.1f,
    SepalWidth = 3.5f,
    PetalLength = 1.4f,
    PetalWidth = 0.2f
};

Чтобы узнать кластер, к которому принадлежит указанный элемент, вернитесь к файлу Program.cs и добавьте следующий код в нижней части файла:

var prediction = predictor.Predict(TestIrisData.Setosa);
Console.WriteLine($"Cluster: {prediction.PredictedClusterId}");
Console.WriteLine($"Distances: {string.Join(" ", prediction.Distances ?? Array.Empty<float>())}");

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

Cluster: 2
Distances: 11.69127 0.02159119 25.59896

Поздравляю! Теперь вы успешно создали модель машинного обучения для кластеризации ирисов и использовали ее для прогнозирования. Исходный код для этого руководства можно найти в репозитории dotnet/samples GitHub.

Дальнейшие шаги

Из этого руководства вы узнали, как:

  • Определение проблемы
  • Выберите соответствующую задачу машинного обучения
  • Подготовка данных
  • Загрузка и преобразование данных
  • Выбор алгоритма обучения
  • Обучение модели
  • Использование модели для прогнозирования

Ознакомьтесь с репозиторием dotnet/machinelearning GitHub, чтобы продолжить обучение и найти дополнительные примеры.