Co to jest ML.NET i jak działa?

ML.NET umożliwia dodawanie uczenia maszynowego do aplikacji platformy .NET w scenariuszach online lub offline. Dzięki tej funkcji można tworzyć automatyczne przewidywania przy użyciu danych dostępnych dla aplikacji. Aplikacje uczenia maszynowego wykorzystują wzorce w danych, aby przewidywać, a nie muszą być jawnie zaprogramowane.

Centralnym elementem ML.NET jest model uczenia maszynowego. Model określa kroki potrzebne do przekształcenia danych wejściowych w przewidywanie. Za pomocą ML.NET można wytrenować model niestandardowy, określając algorytm lub zaimportować wstępnie wytrenowane modele TensorFlow i ONNX.

Po utworzeniu modelu możesz dodać go do aplikacji, aby utworzyć przewidywania.

ML.NET działa w systemach Windows, Linux i macOS przy użyciu platformy .NET lub w systemie Windows przy użyciu programu .NET Framework. Wersja 64-bitowa jest obsługiwana na wszystkich platformach. Wersja 32-bitowa jest obsługiwana w systemie Windows, z wyjątkiem funkcji związanych z biblioteką TensorFlow, LightGBM i ONNX.

W poniższej tabeli przedstawiono przykłady typów przewidywań, które można wykonać za pomocą ML.NET.

Typ przewidywania Przykład
Klasyfikacja/kategoryzacja Automatycznie podziel opinie klientów na pozytywne i negatywne kategorie.
Regresja/Przewidywanie wartości ciągłych Przewidywanie ceny domów na podstawie rozmiaru i lokalizacji.
Wykrywanie anomalii Wykrywanie fałszywych transakcji bankowych.
Zalecenia Zaproponuj produkty, które kupujący online mogą chcieć kupić na podstawie poprzednich zakupów.
Szereg czasowy/dane sekwencyjne Prognozowanie pogody lub sprzedaży produktów.
Klasyfikacja obrazów Kategoryzuj patologie na obrazach medycznych.
Klasyfikacja tekstu Kategoryzuj dokumenty na podstawie ich zawartości.
Podobieństwo zdań Zmierz, jak podobne są dwa zdania.

Witaj, ML.NET World

Kod w poniższym fragmencie kodu przedstawia najprostszą aplikację ML.NET. W tym przykładzie skonstruowano model regresji liniowej w celu przewidywania cen domów przy użyciu danych dotyczących wielkości domu i ceny.

   using System;
   using Microsoft.ML;
   using Microsoft.ML.Data;

   class Program
   {
       public class HouseData
       {
           public float Size { get; set; }
           public float Price { get; set; }
       }

       public class Prediction
       {
           [ColumnName("Score")]
           public float Price { get; set; }
       }

       static void Main(string[] args)
       {
           MLContext mlContext = new MLContext();

           // 1. Import or create training data
           HouseData[] houseData = {
               new HouseData() { Size = 1.1F, Price = 1.2F },
               new HouseData() { Size = 1.9F, Price = 2.3F },
               new HouseData() { Size = 2.8F, Price = 3.0F },
               new HouseData() { Size = 3.4F, Price = 3.7F } };
           IDataView trainingData = mlContext.Data.LoadFromEnumerable(houseData);

           // 2. Specify data preparation and model training pipeline
           var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })
               .Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Price", maximumNumberOfIterations: 100));

           // 3. Train model
           var model = pipeline.Fit(trainingData);

           // 4. Make a prediction
           var size = new HouseData() { Size = 2.5F };
           var price = mlContext.Model.CreatePredictionEngine<HouseData, Prediction>(model).Predict(size);

           Console.WriteLine($"Predicted price for size: {size.Size*1000} sq ft= {price.Price*100:C}k");

           // Predicted price for size: 2500 sq ft= $261.98k
       }
   }

Przepływ pracy kodu

Na poniższym diagramie przedstawiono strukturę kodu aplikacji, a także iteracyjny proces tworzenia modelu:

  • Zbieranie i ładowanie danych treningowych do obiektu IDataView
  • Określanie potoku operacji w celu wyodrębnienia funkcji i zastosowania algorytmu uczenia maszynowego
  • Trenowanie modelu przez wywołanie metody Fit() w potoku
  • Ocena modelu i iteracja w celu ulepszenia
  • Zapisz model w formacie binarnym do użycia w aplikacji
  • Załaduj model z powrotem do obiektu ITransformer
  • Tworzenie przewidywań przez wywołanie metody CreatePredictionEngine.Predict()

ML.NET przepływ tworzenia aplikacji, w tym składniki do generowania danych, opracowywania potoków, trenowania modelu, oceny modelu i użycia modelu

Przyjrzyjmy się nieco bliżej tym pojęciom.

Model uczenia maszynowego

Model ML.NET to obiekt zawierający przekształcenia do wykonania na danych wejściowych w celu dotarcia do przewidywanych danych wyjściowych.

Podstawowy

Najbardziej podstawowym modelem jest regresja liniowa dwuwymiarowa, gdzie jedna ilość ciągła jest proporcjonalna do innej, jak w powyższym przykładzie cen domu.

Model regresji liniowej z stronniczymi i parametrami wagi

Model jest po prostu: $Price = b + Rozmiar * w$. Parametry $b$ i $w$ są szacowane przez dopasowanie linii na zestawie par (rozmiar, cena). Dane używane do znajdowania parametrów modelu są nazywane danymi treningowymi. Dane wejściowe modelu uczenia maszynowego są nazywane funkcjami. W tym przykładzie $Size$ jest jedyną funkcją. Podstawowe wartości używane do trenowania modelu uczenia maszynowego są nazywane etykietami. W tym miejscu wartości $Price$ w zestawie danych treningowych to etykiety.

Bardziej złożone

Bardziej złożony model klasyfikuje transakcje finansowe do kategorii przy użyciu opisu tekstu transakcji.

Każdy opis transakcji jest podzielony na zestaw funkcji przez usunięcie nadmiarowych wyrazów i znaków oraz zliczanie kombinacji wyrazów i znaków. Zestaw funkcji służy do trenowania modelu liniowego na podstawie zestawu kategorii w danych treningowych. Im bardziej podobny jest nowy opis dotyczy tych w zestawie treningowym, tym bardziej prawdopodobne będzie przypisanie go do tej samej kategorii.

Model klasyfikacji tekstu

Model cen domu i model klasyfikacji tekstu są modelami liniowymi . W zależności od charakteru danych i rozwiązywanego problemu można również użyć modeli drzewa decyzyjnego, uogólnionych modeli dodatków i innych. Więcej informacji na temat modeli można znaleźć w temacie Zadania.

Przygotowywanie danych

W większości przypadków dostępne dane nie są odpowiednie do bezpośredniego trenowania modelu uczenia maszynowego. Dane pierwotne należy przygotować lub wstępnie przetworzyć, zanim będzie można go użyć do znalezienia parametrów modelu. Może być konieczne przekonwertowanie danych z wartości ciągu na reprezentację liczbową. Być może masz nadmiarowe informacje w danych wejściowych. Może być konieczne zmniejszenie lub rozszerzenie wymiarów danych wejściowych. Dane mogą być znormalizowane lub skalowane.

W samouczkach ML.NET przedstawiono różne potoki przetwarzania danych dla danych tekstowych, obrazów, liczbowych i szeregów czasowych używanych na potrzeby określonych zadań uczenia maszynowego.

Jak przygotować dane , pokazuje, jak bardziej ogólnie zastosować przygotowywanie danych.

Dodatek do wszystkich dostępnych przekształceń można znaleźć w sekcji zasobów.

Ocena modelu

Po wytrenowanym modelu wiesz, jak dobrze będzie przewidywać przyszłe przewidywania? Dzięki ML.NET możesz ocenić model pod kątem niektórych nowych danych testowych.

Każdy typ zadania uczenia maszynowego zawiera metryki używane do oceny dokładności i dokładności modelu względem zestawu danych testowych.

W naszym przykładzie ceny domu użyliśmy zadania Regresja . Aby ocenić model, dodaj następujący kod do oryginalnego przykładu.

        HouseData[] testHouseData =
        {
            new HouseData() { Size = 1.1F, Price = 0.98F },
            new HouseData() { Size = 1.9F, Price = 2.1F },
            new HouseData() { Size = 2.8F, Price = 2.9F },
            new HouseData() { Size = 3.4F, Price = 3.6F }
        };

        var testHouseDataView = mlContext.Data.LoadFromEnumerable(testHouseData);
        var testPriceDataView = model.Transform(testHouseDataView);

        var metrics = mlContext.Regression.Evaluate(testPriceDataView, labelColumnName: "Price");

        Console.WriteLine($"R^2: {metrics.RSquared:0.##}");
        Console.WriteLine($"RMS error: {metrics.RootMeanSquaredError:0.##}");

        // R^2: 0.96
        // RMS error: 0.19

Metryki oceny informują, że błąd jest niski i że korelacja między przewidywanymi danymi wyjściowymi a danymi wyjściowymi testu jest wysoka. To było łatwe! W rzeczywistych przykładach potrzeba większego dostrajania, aby osiągnąć dobre metryki modelu.

architektura ML.NET

W tej sekcji opisano wzorce architektury ML.NET. Jeśli jesteś doświadczonym deweloperem platformy .NET, niektóre z tych wzorców będą Ci znane, a niektóre będą mniej znane.

Aplikacja ML.NET rozpoczyna się od MLContext obiektu. Ten pojedynczy obiekt zawiera wykazy. Wykaz to fabryka danych do ładowania i zapisywania danych, transformacji, trenerów i składników operacji modelu. Każdy obiekt wykazu ma metody tworzenia różnych typów składników.

Zadanie Wykaz
Ładowanie i zapisywanie danych DataOperationsCatalog
Przygotowywanie danych TransformsCatalog
Klasyfikacja binarna BinaryClassificationCatalog
Klasyfikacja wieloklasowa MulticlassClassificationCatalog
Wykrywanie anomalii AnomalyDetectionCatalog
Klastrowanie ClusteringCatalog
Prognozowanie ForecastingCatalog
Rankingi RankingCatalog
Regresja RegressionCatalog
Zalecenie RecommendationCatalog
Szeregi czasowe TimeSeriesCatalog
Użycie modelu ModelOperationsCatalog

Możesz przejść do metod tworzenia w każdej z powyższych kategorii. Za pomocą programu Visual Studio wykazy są wyświetlane za pośrednictwem funkcji IntelliSense.

IntelliSense dla trenerów regresji

Kompilowanie potoku

Wewnątrz każdego wykazu znajduje się zestaw metod rozszerzeń, których można użyć do utworzenia potoku trenowania.

var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })
    .Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Price", maximumNumberOfIterations: 100));

W fragmencie Concatenate kodu i Sdca są obie metody w wykazie. Każda z nich tworzy obiekt IEstimator , który jest dołączany do potoku.

W tym momencie obiekty zostały utworzone, ale nie wykonano żadnego wykonania.

Szkolenie modelu

Po utworzeniu obiektów w potoku dane mogą służyć do trenowania modelu.

var model = pipeline.Fit(trainingData);

Wywołanie Fit() używa danych szkoleniowych wejściowych do oszacowania parametrów modelu. Jest to nazywane trenowaniem modelu. Pamiętaj, że pokazany wcześniej model regresji liniowej miał dwa parametry modelu: stronniczą i wagę. Po wywołaniu Fit() znane są wartości parametrów. (Większość modeli będzie mieć o wiele więcej parametrów niż to).

Więcej informacji na temat trenowania modelu można dowiedzieć się w temacie How to train your model (Jak trenować model).

Wynikowy obiekt modelu implementuje ITransformer interfejs. Oznacza to, że model przekształca dane wejściowe w przewidywania.

IDataView predictions = model.Transform(inputData);

Korzystanie z modelu

Dane wejściowe można przekształcić zbiorczo w przewidywania lub jedno dane wejściowe. Przykład ceny domu zrobił zarówno: zbiorczo w celu oceny modelu, jak i jeden na raz, aby utworzyć nowe przewidywanie. Przyjrzyjmy się tworzeniu pojedynczych przewidywań.

var size = new HouseData() { Size = 2.5F };
var predEngine = mlContext.CreatePredictionEngine<HouseData, Prediction>(model);
var price = predEngine.Predict(size);

Metoda CreatePredictionEngine() przyjmuje klasę danych wejściowych i klasę wyjściową. Nazwy pól lub atrybuty kodu określają nazwy kolumn danych używanych podczas trenowania i przewidywania modelu. Aby uzyskać więcej informacji, zobacz Make predictions with a trained model (Tworzenie przewidywań przy użyciu wytrenowanego modelu).

Modele danych i schemat

Podstawowym elementem potoku ML.NET uczenia maszynowego są obiekty DataView .

Każde przekształcenie w potoku ma schemat wejściowy (nazwy danych, typy i rozmiary, których transformacja oczekuje na dane wejściowe); oraz schemat danych wyjściowych (nazwy danych, typy i rozmiary generowane przez przekształcenie po przekształceniu).

Jeśli schemat wyjściowy z jednej transformacji w potoku nie jest zgodny ze schematem wejściowym następnej transformacji, ML.NET zgłosi wyjątek.

Obiekt widoku danych zawiera kolumny i wiersze. Każda kolumna ma nazwę i typ oraz długość. Na przykład kolumny wejściowe w przykładzie ceny domu to Size (Rozmiar) i Price (Cena). Są one zarówno typem, jak i są ilościami skalarnych, a nie wektorami.

ML.NET przykład widoku danych z danymi przewidywania cen domu

Wszystkie algorytmy ML.NET szukają kolumny wejściowej, która jest wektorem. Domyślnie ta kolumna wektorowa nosi nazwę Funkcje. Dlatego przykład ceny domu łączy kolumnę Size (Rozmiar ) z nową kolumną o nazwie Features (Funkcje).

var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })

Wszystkie algorytmy tworzą również nowe kolumny po wykonaniu przewidywania. Stałe nazwy tych nowych kolumn zależą od typu algorytmu uczenia maszynowego. W przypadku zadania regresji jedna z nowych kolumn nosi nazwę Score (Wynik ), jak pokazano w atrybucie danych cen.

public class Prediction
{
    [ColumnName("Score")]
    public float Price { get; set; }
}

Więcej informacji na temat kolumn wyjściowych różnych zadań uczenia maszynowego można znaleźć w przewodniku Machine Edukacja Tasks( Zadania maszynowe).

Ważną właściwością obiektów DataView jest to, że są one oceniane leniwie. Widoki danych są ładowane i obsługiwane tylko podczas trenowania i oceny modelu oraz przewidywania danych. Podczas pisania i testowania aplikacji ML.NET możesz użyć debugera programu Visual Studio, aby przyjrzeć się dowolnemu obiektowi widoku danych, wywołując metodę Preview .

var debug = testPriceDataView.Preview();

Możesz obserwować zmienną debug w debugerze i sprawdzać jego zawartość. Nie należy używać metody Preview w kodzie produkcyjnym, ponieważ znacznie obniża wydajność.

Wdrożenie modelu

W rzeczywistych aplikacjach kod trenowania i oceny modelu będzie oddzielony od przewidywania. W rzeczywistości te dwie działania są często wykonywane przez oddzielne zespoły. Zespół deweloperów modeli może zapisać model do użycia w aplikacji przewidywania.

mlContext.Model.Save(model, trainingData.Schema,"model.zip");

Następne kroki

  • Dowiedz się, jak tworzyć aplikacje przy użyciu różnych zadań uczenia maszynowego z bardziej realistycznymi zestawami danych w samouczkach.

  • Dowiedz się więcej o konkretnych tematach w przewodnikach z instrukcjami.

  • Jeśli jesteś bardzo chętny, możesz zapoznać się bezpośrednio z dokumentacją referencyjną interfejsu API.