Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
В этом руководстве показано, как использовать ML.NET для создания модели кластеризации для набора данных о цветках ириса.
В этом руководстве вы узнаете, как:
- Определение проблемы
- Выберите соответствующую задачу машинного обучения
- Подготовка данных
- Загрузка и преобразование данных
- Выбор алгоритма обучения
- Обучение модели
- Использование модели для прогнозирования
Предпосылки
Определение проблемы
Эта проблема заключается в делении набора цветков ириса в разных группах на основе признаков цветков. Эти признаки представляют собой длину и ширину чашельца и длину и ширину лепестка. В этом руководстве предполагается, что тип каждого цветка неизвестен. Вы хотите узнать структуру набора данных из функций и предсказать, как экземпляр данных соответствует этой структуре.
Выберите соответствующую задачу машинного обучения
Так как вы не знаете, к какой группе принадлежит каждый цветок, вы выбираете задачу неуправляемого машинного обучения . Чтобы разделить набор данных на группы таким образом, чтобы элементы в одной группе были более похожи друг на друга, чем в других группах, используйте задачу машинного обучения кластеризации .
Создайте консольное приложение
Создайте консольное приложение C# с именем IrisFlowerClustering. Нажмите кнопку Далее.
Выберите .NET 8 в качестве платформы для использования. Нажмите кнопку Создать.
Создайте каталог с именем Data в проекте для хранения файлов набора данных и моделей:
В обозревателе решений щелкните проект правой кнопкой мыши и выберите команду "Добавить>новую папку". Введите "Данные" и нажмите ВВОД.
Установите пакет NuGet Microsoft.ML :
Замечание
В этом примере используется последняя стабильная версия упомянутых пакетов NuGet, если не указано иное.
В обозревателе решений щелкните проект правой кнопкой мыши и выберите Управление пакетами NuGet. Выберите "nuget.org" в качестве источника пакета, перейдите на вкладку "Обзор ", найдите Microsoft.ML и выберите "Установить". Нажмите кнопку "ОК " в диалоговом окне "Предварительные изменения" , а затем нажмите кнопку "Принять" в диалоговом окне принятия лицензий, если вы согласны с условиями лицензии для перечисленных пакетов.
Подготовка данных
Скачайте набор данных iris.data и сохраните его в папку данных , созданную на предыдущем шаге. Дополнительные сведения о наборе данных Iris см. на странице "Набор данных о цветах ириса" и на странице "Набор данных Iris", который является источником набора данных.
В обозревателе решений щелкните правой кнопкой мыши файл iris.data и выберите "Свойства". В разделе "Дополнительно" измените значение Копировать в выходной каталог на Копировать, если новее.
Файл iris.data содержит пять столбцов, представляющих:
- длина чашелистика в сантиметрах
- ширина чашелистика в сантиметрах
- длина лепестка в сантиметрах
- ширина лепестка в сантиметрах
- тип цветка ириса
Для примера кластеризации в этом руководстве игнорируется последний столбец.
Создание классов данных
Создайте классы для входных данных и прогнозов:
В обозревателе решений щелкните проект правой кнопкой мыши и выберите пункт "Добавить>новый элемент".
В диалоговом окне "Добавление нового элемента" выберите класс и измените поле "Имя " на IrisData.cs. Затем нажмите кнопку "Добавить".
Добавьте следующую
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 Создайте класс для размещения тестовых экземпляров данных:
В обозревателе решений щелкните проект правой кнопкой мыши и выберите пункт "Добавить>новый элемент".
В диалоговом окне "Добавление нового элемента" выберите класс и измените поле "Имя " на TestIrisData.cs. Затем нажмите кнопку "Добавить".
Измените класс, чтобы он был статическим, как в следующем примере:
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, чтобы продолжить обучение и найти дополнительные примеры.