Samouczek: kategoryzowanie kwiatów irysów przy użyciu klastrowania metodą k-średnich z ML.NET
W tym samouczku pokazano, jak używać ML.NET do tworzenia modelu klastrowania dla zestawu danych irysów kwiatowych.
Z tego samouczka dowiesz się, jak wykonywać następujące działania:
- Omówienie problemu
- Wybieranie odpowiedniego zadania uczenia maszynowego
- Przygotowywanie danych
- Ładowanie i przekształcanie danych
- Wybieranie algorytmu uczenia
- Trenowanie modelu
- Korzystanie z modelu na potrzeby przewidywań
Warunki wstępne
Omówienie problemu
Ten problem polega na podzieleniu zestawu kwiatów irysów w różnych grupach na podstawie cech kwiatu. Te cechy to długość i szerokość sepa oraz długość i szerokość płatka. W tym samouczku przyjęto założenie, że typ każdego kwiatu jest nieznany. Chcesz poznać strukturę zestawu danych z funkcji i przewidzieć, jak wystąpienie danych pasuje do tej struktury.
Wybieranie odpowiedniego zadania uczenia maszynowego
Ponieważ nie wiesz, do której grupy należy każdy kwiat, wybierasz zadanie nienadzorowanego uczenia maszynowego. Aby podzielić zestaw danych na grupy w taki sposób, aby elementy w tej samej grupie były bardziej podobne do siebie nawzajem niż do elementów z innych grup, należy użyć zadania uczenia maszynowego klastrowania.
Tworzenie aplikacji konsolowej
Utwórz aplikację konsolową w języku C# o nazwie "IrisFlowerClustering". Kliknij przycisk Dalej.
Wybierz platformę .NET 8 jako platformę do użycia. Kliknij przycisk Utwórz.
Utwórz katalog o nazwie Data w projekcie, aby przechowywać zestaw danych i pliki modelu:
W eksploratorze rozwiązań kliknij prawym przyciskiem myszy projekt i wybierz pozycję Dodaj>Nowy folder. Wpisz „Dane” i wybierz , a następnie wciśnij Enter.
Zainstaluj pakiet NuGet Microsoft.ML.
Notatka
W tym przykładzie użyto najnowszej stabilnej wersji pakietów NuGet wymienionych, chyba że określono inaczej.
W eksploratorze rozwiązań kliknij prawym przyciskiem myszy projekt i wybierz pozycję Zarządzaj pakietami NuGet. Wybierz "nuget.org" jako źródło pakietu, przejdź do karty Przeglądaj, wyszukaj Microsoft.ML i naciśnij Zainstaluj. Wybierz przycisk OK w oknie dialogowym Podgląd zmian, a następnie wybierz przycisk Akceptuję w oknie dialogowym Akceptacja licencji, jeśli akceptujesz warunki licencji dla wymienionych pakietów.
Przygotowywanie danych
Pobierz zestaw danych iris.data i zapisz go w folderze Data utworzonym w poprzednim kroku. Aby uzyskać więcej informacji na temat zestawu danych irysów, zobacz stronę Wikipedii dotyczącą zestawu danych Irysów oraz stronę Iris Data Set, która jest źródłem zestawu danych.
W Eksploratorze Rozwiązań kliknij prawym przyciskiem myszy plik iris.data i wybierz pozycję Właściwości . W obszarze Advancedzmień wartość Kopiuj do katalogu docelowego na Skopiuj, jeśli nowsze.
Plik iris.data zawiera pięć kolumn reprezentujących:
- długość sepa w centymetrach
- szerokość sepa w centymetrach
- długość płatka w centymetrach
- szerokość płatka w centymetrach
- rodzaj kwiatu irysów
Ze względu na przykład klastrowania ten samouczek ignoruje ostatnią kolumnę.
Tworzenie klas danych
Utwórz klasy dla danych wejściowych i przewidywań:
W eksploratorze rozwiązań kliknij prawym przyciskiem myszy projekt, a następnie wybierz pozycję Dodaj nowy element>.
W oknie dialogowym Dodawanie nowego elementu wybierz pozycję Klasa i zmień pole Nazwa na IrisData.cs. Następnie wybierz pozycję Dodaj.
Dodaj następującą dyrektywę
using
do nowego pliku:using Microsoft.ML.Data;
Usuń istniejącą definicję klasy i dodaj następujący kod, który definiuje klasy IrisData
i ClusterPrediction
do pliku 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
jest klasą danych wejściowych i ma definicje dla każdej funkcji z zestawu danych. Użyj atrybutu LoadColumn, aby określić indeksy kolumn źródłowych w pliku zestawu danych.
Klasa ClusterPrediction
reprezentuje dane wyjściowe modelu klastrowania zastosowanego do wystąpienia IrisData
. Użyj atrybutu ColumnName, aby powiązać pola PredictedClusterId
i Distances
z kolumnami PredictedLabel i Score. W przypadku zadania klastrowania te kolumny mają następujące znaczenie:
- kolumna PredictedLabel zawiera identyfikator przewidywanego klastra.
- Kolumna Score zawiera tablicę z kwadratowymi odległościami euklidesowymi do centroidów klastra. Długość tablicy jest równa liczbie klastrów.
Notatka
Użyj typu float
, aby reprezentować wartości zmiennoprzecinkowe w klasach danych wejściowych i przewidywania.
Definiowanie danych i ścieżek modelu
Wróć do pliku Program.cs i dodaj dwa pola, aby przechowywać ścieżki do pliku zestawu danych i do pliku w celu zapisania modelu:
-
_dataPath
zawiera ścieżkę do pliku z zestawem danych używanym do trenowania modelu. -
_modelPath
zawiera ścieżkę do pliku, w którym jest przechowywany wytrenowany model.
Dodaj następujący kod w dyrektywach using
, aby określić te ścieżki:
string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "iris.data");
string _modelPath = Path.Combine(Environment.CurrentDirectory, "Data", "IrisClusteringModel.zip");
Tworzenie kontekstu uczenia maszynowego
Dodaj następujące dodatkowe dyrektywy using
na początku pliku Program.cs:
using Microsoft.ML;
using IrisFlowerClustering;
Zastąp wiersz Console.WriteLine("Hello World!");
następującym kodem:
var mlContext = new MLContext(seed: 0);
Klasa Microsoft.ML.MLContext reprezentuje środowisko uczenia maszynowego i udostępnia mechanizmy rejestrowania i punktów wejścia na potrzeby ładowania danych, trenowania modelu, przewidywania i innych zadań. Jest to porównywalne koncepcyjnie z użyciem DbContext
w programie Entity Framework.
Konfigurowanie ładowania danych
Dodaj następujący kod poniżej MLContext
, aby skonfigurować sposób ładowania danych:
IDataView dataView = mlContext.Data.LoadFromTextFile<IrisData>(_dataPath, hasHeader: false, separatorChar: ',');
Ogólna metoda rozszerzenia MLContext.Data.LoadFromTextFile
wywnioskuje schemat zestawu danych z podanego typu IrisData
i zwraca IDataView, które mogą być używane jako dane wejściowe dla transformatorów.
Tworzenie potoku szkoleniowego
Na potrzeby tego samouczka potok szkoleniowy zadania klastrowania składa się z dwóch następujących kroków:
- Łączenie załadowanych kolumn do jednej kolumny cech , które są używane przez trenera klastrowania.
- użyj trenera KMeansTrainer, aby wytrenować model przy użyciu algorytmu klastrowania k-średnich++.
Dodaj następujące elementy po załadowaniu danych:
string featuresColumnName = "Features";
var pipeline = mlContext.Transforms
.Concatenate(featuresColumnName, "SepalLength", "SepalWidth", "PetalLength", "PetalWidth")
.Append(mlContext.Clustering.Trainers.KMeans(featuresColumnName, numberOfClusters: 3));
Kod określa, że zestaw danych powinien być podzielony w trzech klastrach.
Trenowanie modelu
Kroki, które zostały dodane w poprzednich sekcjach, przygotowały pipeline do treningu, jednak żaden z nich nie został wykonany. Dodaj następujący wiersz w dolnej części pliku, aby przeprowadzić ładowanie danych i trenowanie modelu:
var model = pipeline.Fit(dataView);
Zapisywanie modelu
Na tym etapie masz model, który można zintegrować z dowolnymi istniejącymi lub nowymi aplikacjami platformy .NET. Aby zapisać model w pliku .zip, dodaj poniższy kod wywołujący metodę Fit
:
using (var fileStream = new FileStream(_modelPath, FileMode.Create, FileAccess.Write, FileShare.Write))
{
mlContext.Model.Save(model, dataView.Schema, fileStream);
}
Korzystanie z modelu na potrzeby przewidywań
Aby przewidywać, użyj klasy PredictionEngine<TSrc,TDst>, która przyjmuje wystąpienia typu wejściowego za pośrednictwem potoku przekształcania i generuje wystąpienia typu wyjściowego. Dodaj następujący wiersz, aby utworzyć wystąpienie tej klasy:
var predictor = mlContext.Model.CreatePredictionEngine<IrisData, ClusterPrediction>(model);
PredictionEngine to wygodny interfejs API, który umożliwia przewidywanie pojedynczego wystąpienia danych.
PredictionEngine
nie jest bezpieczny dla wątków. Dopuszczalne jest użycie w środowiskach jednowątkowych lub prototypowych. W celu poprawy wydajności i bezpieczeństwa wątkowego w środowiskach produkcyjnych należy użyć usługi PredictionEnginePool
, która tworzy ObjectPool
obiektów PredictionEngine
do użytku w całej aplikacji. Zobacz ten przewodnik o tym, jak używać i PredictionEnginePool
w ASP.NET Core Web API.
Notatka
rozszerzenie usługi PredictionEnginePool
jest obecnie dostępne w wersji zapoznawczej.
Utwórz klasę TestIrisData
, aby pomieścić wystąpienia danych testowych:
W eksploratorze rozwiązań kliknij prawym przyciskiem myszy projekt, a następnie wybierz pozycję Dodaj nowy element>.
W oknie dialogowym Dodawanie nowego elementu wybierz pozycję Klasa i zmień pole Nazwa na TestIrisData.cs. Następnie wybierz pozycję Dodaj.
Zmodyfikuj klasę tak, aby wyglądała statycznie w poniższym przykładzie:
static class TestIrisData
W tym samouczku przedstawiono jedno wystąpienie danych iris w tej klasie. Możesz dodać inne scenariusze, aby eksperymentować z modelem. Dodaj następujący kod do klasy TestIrisData
:
internal static readonly IrisData Setosa = new IrisData
{
SepalLength = 5.1f,
SepalWidth = 3.5f,
PetalLength = 1.4f,
PetalWidth = 0.2f
};
Aby dowiedzieć się, do którego należy określony element, wróć do pliku Program.cs i dodaj następujący kod w dolnej części pliku:
var prediction = predictor.Predict(TestIrisData.Setosa);
Console.WriteLine($"Cluster: {prediction.PredictedClusterId}");
Console.WriteLine($"Distances: {string.Join(" ", prediction.Distances ?? Array.Empty<float>())}");
Uruchom program, aby zobaczyć, który klaster zawiera określone wystąpienie danych i odległości kwadratowe od tego wystąpienia do centroidów klastra. Wyniki powinny być podobne do następujących:
Cluster: 2
Distances: 11.69127 0.02159119 25.59896
Gratulacje! Udało Ci się utworzyć model uczenia maszynowego na potrzeby klastrowania irysów i używać go do przewidywania. Kod źródłowy tego samouczka można znaleźć w repozytorium dotnet/samples GitHub.
Następne kroki
W tym samouczku nauczyłeś się, jak:
- Omówienie problemu
- Wybieranie odpowiedniego zadania uczenia maszynowego
- Przygotowywanie danych
- Ładowanie i przekształcanie danych
- Wybieranie algorytmu uczenia
- Trenowanie modelu
- Korzystanie z modelu na potrzeby przewidywań
Zapoznaj się z repozytorium dotnet/machinelearning GitHub, aby kontynuować naukę i znaleźć więcej przykładów.