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.
Ten samouczek zawiera informacje na temat wykonywania następujących czynności:
- 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ń
Wymagania wstępne
Omówienie problemu
Ten problem dotyczy dzielenia zestawu kwiatów irysów w różnych grupach na podstawie cech kwiatu. Te cechy to długość i szerokość sepy 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 nienadzorowane zadanie uczenia maszynowego . Aby podzielić zestaw danych w grupach w taki sposób, aby elementy w tej samej grupie były bardziej podobne do siebie niż w innych grupach, użyj zadania uczenia maszynowego klastrowania .
Tworzenie aplikacji konsolowej
Utwórz aplikację konsolową języka C# o nazwie "IrisFlowerClustering". Kliknij przycisk Dalej.
Wybierz platformę .NET 6 jako platformę do użycia. Kliknij przycisk Utwórz.
Utwórz katalog o nazwie Dane w projekcie, aby przechowywać zestaw danych i pliki modelu:
W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt i wybierz polecenie Dodaj>nowy folder. Wpisz "Dane" i naciśnij klawisz Enter.
Zainstaluj pakiet NuGet Microsoft.ML :
Uwaga
W tym przykładzie użyto najnowszej stabilnej wersji pakietów NuGet wymienionych, chyba że określono inaczej.
W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt i wybierz polecenie Zarządzaj pakietami NuGet. Wybierz pozycję "nuget.org" jako źródło pakietu, wybierz kartę Przeglądaj , wyszukaj Microsoft.ML i wybierz przycisk Zainstaluj . Wybierz przycisk OK w oknie dialogowym Podgląd zmian , a następnie wybierz przycisk Akceptuję w oknie dialogowym Akceptacja licencji , jeśli zgadzasz się z postanowieniami licencyjnymi dla wymienionych pakietów.
Przygotowywanie danych
Pobierz zestaw danych iris.data i zapisz go w folderze Dane utworzonym w poprzednim kroku. Aby uzyskać więcej informacji na temat zestawu danych irysów, zobacz stronę Wikipedii zestawu danych i stronę zestawu danychIris , która jest źródłem zestawu danych.
W Eksplorator rozwiązań kliknij prawym przyciskiem myszy plik iris.data i wybierz polecenie Właściwości. W obszarze Zaawansowane zmień wartość opcji Kopiuj do katalogu wyjściowego , aby skopiować, jeśli jest nowsza.
Plik iris.data zawiera pięć kolumn reprezentujących:
- długość sepal w centymetrach
- szerokość sepal 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 Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt, a następnie wybierz polecenie Dodaj>nowy element.
W oknie dialogowym Dodawanie nowego elementu wybierz pozycję Klasa i zmień pole Nazwa na IrisData.cs. Następnie wybierz przycisk Dodaj .
Dodaj następującą
using
dyrektywę 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 IrisData
wystąpienia. Użyj atrybutu ColumnName , aby powiązać PredictedClusterId
pola 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 Euclidean do centroidów klastra. Długość tablicy jest równa liczbie klastrów.
Uwaga
float
Użyj typu , aby reprezentować wartości zmiennoprzecinkowe w klasach danych wejściowych i przewidywania.
Definiowanie ścieżek danych i modelu
Wstecz do pliku Program.cs i dodaj dwa pola do przechowywania ścieżek 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 przechowywany jest wytrenowany model.
Dodaj następujący kod w instrukcjach 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 using
dyrektywy na początku pliku Program.cs :
using Microsoft.ML;
using IrisFlowerClustering;
Zastąp Console.WriteLine("Hello World!");
wiersz 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 do użycia DbContext
w programie Entity Framework.
Konfigurowanie ładowania danych
Dodaj następujący kod poniżej polecenia , MLContext
aby skonfigurować sposób ładowania danych:
IDataView dataView = mlContext.Data.LoadFromTextFile<IrisData>(_dataPath, hasHeader: false, separatorChar: ',');
Metoda rozszerzenia ogólnego wywnioskuje MLContext.Data.LoadFromTextFile
schemat zestawu danych z podanego IrisData
typu i zwracaIDataView, które mogą być używane jako dane wejściowe dla transformatorów.
Tworzenie potoku szkoleniowego
W tym samouczku potok szkoleniowy zadania klastrowania składa się z dwóch następujących kroków:
- Łączenie załadowanych kolumn w jednej kolumnie Funkcje , która jest używana 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 dodane w poprzednich sekcjach przygotowały potok do trenowania, 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 następujący kod poniżej 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 PredictionEngine<TSrc,TDst> klasy, która przyjmuje wystąpienia typu wejściowego za pośrednictwem potoku transformatora i tworzy 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 dla pojedynczego wystąpienia danych. PredictionEngine
nie jest bezpieczne wątkowo. Dopuszczalne jest użycie w środowiskach jednowątkowych lub prototypowych. Aby zwiększyć wydajność i bezpieczeństwo wątków w środowiskach produkcyjnych, użyj PredictionEnginePool
usługi, która tworzy ObjectPool
PredictionEngine
obiekty do użycia w całej aplikacji. Zobacz ten przewodnik dotyczący używania PredictionEnginePool
w internetowym interfejsie API ASP.NET Core.
Uwaga
PredictionEnginePool
Rozszerzenie usługi jest obecnie w wersji zapoznawczej.
Utwórz klasę TestIrisData
, aby pomieścić wystąpienia danych testowych:
W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt, a następnie wybierz polecenie Dodaj>nowy element.
W oknie dialogowym Dodawanie nowego elementu wybierz pozycję Klasa i zmień pole Nazwa na TestIrisData.cs. Następnie wybierz przycisk Dodaj .
Zmodyfikuj klasę tak, aby był statyczna, jak w poniższym przykładzie:
static class TestIrisData
W tym samouczku przedstawiono jedno wystąpienie danych iris w ramach tej klasy. Możesz dodać inne scenariusze do eksperymentowania z modelem. Dodaj następujący kod do TestIrisData
klasy:
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 GitHub dotnet/samples .
Następne kroki
W niniejszym samouczku zawarto informacje na temat wykonywania następujących czynności:
- 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 naszym repozytorium GitHub, aby kontynuować naukę i znaleźć więcej przykładów.