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

  1. Utwórz aplikację konsolową języka C# o nazwie "IrisFlowerClustering". Kliknij przycisk Dalej.

  2. Wybierz platformę .NET 6 jako platformę do użycia. Kliknij przycisk Utwórz.

  3. 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.

  4. 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

  1. 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.

  2. 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ń:

  1. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt, a następnie wybierz polecenie Dodaj>nowy element.

  2. W oknie dialogowym Dodawanie nowego elementu wybierz pozycję Klasa i zmień pole Nazwa na IrisData.cs. Następnie wybierz przycisk Dodaj .

  3. 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 ObjectPoolPredictionEngine 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:

  1. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt, a następnie wybierz polecenie Dodaj>nowy element.

  2. W oknie dialogowym Dodawanie nowego elementu wybierz pozycję Klasa i zmień pole Nazwa na TestIrisData.cs. Następnie wybierz przycisk Dodaj .

  3. 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.