Trenowanie i ocenianie modelu

Dowiedz się, jak tworzyć modele uczenia maszynowego, zbierać metryki i mierzyć wydajność przy użyciu ML.NET. Mimo że ten przykład trenuje model regresji, koncepcje mają zastosowanie w większości innych algorytmów.

Dzielenie danych na potrzeby trenowania i testowania

Celem modelu uczenia maszynowego jest zidentyfikowanie wzorców w danych treningowych. Te wzorce służą do przewidywania przy użyciu nowych danych.

Dane mogą być modelowane przez klasę, na przykład HousingData.

public class HousingData
{
    [LoadColumn(0)]
    public float Size { get; set; }

    [LoadColumn(1, 3)]
    [VectorType(3)]
    public float[] HistoricalPrices { get; set; }

    [LoadColumn(4)]
    [ColumnName("Label")]
    public float CurrentPrice { get; set; }
}

Biorąc pod uwagę następujące dane, które są ładowane do obiektu IDataView.

HousingData[] housingData = new HousingData[]
{
    new HousingData
    {
        Size = 600f,
        HistoricalPrices = new float[] { 100000f ,125000f ,122000f },
        CurrentPrice = 170000f
    },
    new HousingData
    {
        Size = 1000f,
        HistoricalPrices = new float[] { 200000f, 250000f, 230000f },
        CurrentPrice = 225000f
    },
    new HousingData
    {
        Size = 1000f,
        HistoricalPrices = new float[] { 126000f, 130000f, 200000f },
        CurrentPrice = 195000f
    },
    new HousingData
    {
        Size = 850f,
        HistoricalPrices = new float[] { 150000f,175000f,210000f },
        CurrentPrice = 205000f
    },
    new HousingData
    {
        Size = 900f,
        HistoricalPrices = new float[] { 155000f, 190000f, 220000f },
        CurrentPrice = 210000f
    },
    new HousingData
    {
        Size = 550f,
        HistoricalPrices = new float[] { 99000f, 98000f, 130000f },
        CurrentPrice = 180000f
    }
};

TrainTestSplit Użyj metody , aby podzielić dane na zestawy trenowania i testowania. Wynik będzie obiektem zawierającym TrainTestData dwa IDataView elementy członkowskie, jeden dla zestawu pociągu i drugi dla zestawu testowego. Procent podziału danych jest określany przez testFraction parametr . Poniższy fragment kodu zawiera 20 procent oryginalnych danych dla zestawu testowego.

DataOperationsCatalog.TrainTestData dataSplit = mlContext.Data.TrainTestSplit(data, testFraction: 0.2);
IDataView trainData = dataSplit.TrainSet;
IDataView testData = dataSplit.TestSet;

Przygotowywanie danych

Dane muszą być wstępnie przetworzone przed trenowanie modelu uczenia maszynowego. Więcej informacji na temat przygotowywania danych można znaleźć w artykule z instrukcjami przygotowywania danych, a także w artykule transforms page.

ML.NET algorytmy mają ograniczenia dotyczące typów kolumn wejściowych. Ponadto wartości domyślne są używane dla nazw kolumn wejściowych i wyjściowych, gdy nie określono żadnych wartości.

Praca z oczekiwanymi typami kolumn

Algorytmy uczenia maszynowego w ML.NET oczekują wektora zmiennoprzecinkowego o znanym rozmiarze jako danych wejściowych. VectorType Zastosuj atrybut do modelu danych, gdy wszystkie dane są już w formacie liczbowym i mają być przetwarzane razem (tj. piksele obrazu).

Jeśli dane nie są liczbowe i chcesz zastosować różne przekształcenia danych dla każdej z kolumn indywidualnie, użyj Concatenate metody po przetworzeniu wszystkich kolumn, aby połączyć wszystkie poszczególne kolumny w jeden wektor funkcji, który jest wyjściowy do nowej kolumny.

Poniższy fragment kodu łączy Size kolumny i HistoricalPrices w jeden wektor funkcji, który jest wyjściowy do nowej kolumny o nazwie Features. Ponieważ istnieje różnica w skalach, NormalizeMinMax jest stosowana do Features kolumny w celu normalizacji danych.

// Define Data Prep Estimator
// 1. Concatenate Size and Historical into a single feature vector output to a new column called Features
// 2. Normalize Features vector
IEstimator<ITransformer> dataPrepEstimator =
    mlContext.Transforms.Concatenate("Features", "Size", "HistoricalPrices")
        .Append(mlContext.Transforms.NormalizeMinMax("Features"));

// Create data prep transformer
ITransformer dataPrepTransformer = dataPrepEstimator.Fit(trainData);

// Apply transforms to training data
IDataView transformedTrainingData = dataPrepTransformer.Transform(trainData);

Praca z domyślnymi nazwami kolumn

ML.NET algorytmy używają domyślnych nazw kolumn, jeśli nie są określone. Wszyscy trenerzy mają parametr o nazwie featureColumnName dla danych wejściowych algorytmu, a jeśli ma to zastosowanie, mają również parametr dla oczekiwanej wartości o nazwie labelColumnName. Domyślnie te wartości są Features i Label odpowiednio.

Używając Concatenate metody podczas przetwarzania wstępnego w celu utworzenia nowej kolumny o nazwie Features, nie ma potrzeby określania nazwy kolumny funkcji w parametrach algorytmu, ponieważ już istnieje w wstępnie przetworzonym IDataView. Kolumna etykiety to CurrentPrice, ale ponieważ ColumnName atrybut jest używany w modelu danych, ML.NET zmienia nazwę CurrentPrice kolumny, w Label której usunięto konieczność podania labelColumnName parametru do narzędzia do szacowania algorytmu uczenia maszynowego.

Jeśli nie chcesz używać domyślnych nazw kolumn, przekaż nazwy kolumn funkcji i etykiet jako parametry podczas definiowania narzędzia do szacowania algorytmu uczenia maszynowego, jak pokazano w kolejnym fragmencie kodu:

var UserDefinedColumnSdcaEstimator = mlContext.Regression.Trainers.Sdca(labelColumnName: "MyLabelColumnName", featureColumnName: "MyFeatureColumnName");

Buforowanie danych

Domyślnie, gdy dane są przetwarzane, są ładowane z opóźnieniem lub przesyłane strumieniowo, co oznacza, że trenerzy mogą ładować dane z dysku i iterować je wielokrotnie podczas trenowania. W związku z tym buforowanie jest zalecane w przypadku zestawów danych, które mieszczą się w pamięci, aby zmniejszyć liczbę ładowanych danych z dysku. Buforowanie jest wykonywana w ramach EstimatorChain elementu przy użyciu polecenia AppendCacheCheckpoint.

Zaleca się stosowanie AppendCacheCheckpoint przed wszystkimi trenerami w potoku.

Korzystając z poniższego EstimatorChainelementu , dodaj AppendCacheCheckpoint , zanim StochasticDualCoordinateAscent trener buforuje wyniki poprzednich narzędzia do szacowania do późniejszego użycia przez trenera.

// 1. Concatenate Size and Historical into a single feature vector output to a new column called Features
// 2. Normalize Features vector
// 3. Cache prepared data
// 4. Use Sdca trainer to train the model
IEstimator<ITransformer> dataPrepEstimator =
    mlContext.Transforms.Concatenate("Features", "Size", "HistoricalPrices")
        .Append(mlContext.Transforms.NormalizeMinMax("Features"))
        .AppendCacheCheckpoint(mlContext);
        .Append(mlContext.Regression.Trainers.Sdca());

Trenowanie modelu uczenia maszynowego

Po wstępnie przetworzonych danych użyj Fit metody , aby wytrenować model uczenia maszynowego przy użyciu algorytmu StochasticDualCoordinateAscent regresji.

// Define StochasticDualCoordinateAscent regression algorithm estimator
var sdcaEstimator = mlContext.Regression.Trainers.Sdca();

// Build machine learning model
var trainedModel = sdcaEstimator.Fit(transformedTrainingData);

Wyodrębnianie parametrów modelu

Po wytrenowaniu modelu wyodrębnij zdobytą wiedzę ModelParameters na potrzeby inspekcji lub ponownego trenowania. Zapewniają LinearRegressionModelParameters stronniczość i poznane współczynniki lub wagi wytrenowanego modelu.

var trainedModelParameters = trainedModel.Model as LinearRegressionModelParameters;

Uwaga

Inne modele mają parametry specyficzne dla ich zadań. Na przykład algorytm K-Średnich umieszcza dane w klastrze na podstawie centroidów i KMeansModelParameters zawiera właściwość, która przechowuje te poznane centroidy. Aby dowiedzieć się więcej, odwiedź dokumentację interfejsu Microsoft.ML.Trainers API i poszukaj klas, które zawierają ModelParameters ich nazwę.

Ocena jakości modelu

Aby ułatwić wybór najlepszego modelu, należy ocenić jego wydajność na danych testowych. Evaluate Użyj metody , aby zmierzyć różne metryki dla wytrenowanego modelu.

Uwaga

Metoda Evaluate tworzy różne metryki w zależności od tego, które zadanie uczenia maszynowego zostało wykonane. Aby uzyskać więcej informacji, odwiedź dokumentację interfejsuMicrosoft.ML.DataAPI i poszukaj klas, które zawierają Metrics w ich nazwie.

// Measure trained model performance
// Apply data prep transformer to test data
IDataView transformedTestData = dataPrepTransformer.Transform(testData);

// Use trained model to make inferences on test data
IDataView testDataPredictions = trainedModel.Transform(transformedTestData);

// Extract model metrics and get RSquared
RegressionMetrics trainedModelMetrics = mlContext.Regression.Evaluate(testDataPredictions);
double rSquared = trainedModelMetrics.RSquared;

W poprzednim przykładzie kodu:

  1. Zestaw danych testowych jest wstępnie przetwarzany przy użyciu wcześniej zdefiniowanych przekształceń przygotowywania danych.
  2. Wytrenowany model uczenia maszynowego służy do przewidywania danych testowych.
  3. Evaluate W metodzie wartości w CurrentPrice kolumnie zestawu danych testowych są porównywane z Score kolumną nowo przewidywanych danych wyjściowych w celu obliczenia metryk dla modelu regresji, z których jeden z nich R-Squared jest przechowywany w zmiennejrSquared.

Uwaga

W tym małym przykładzie R-Squared jest liczbą nie z zakresu od 0 do 1 ze względu na ograniczony rozmiar danych. W rzeczywistym scenariuszu powinna zostać wyświetlona wartość z zakresu od 0 do 1.