Trénování a vyhodnocení modelu

Naučte se vytvářet modely strojového učení, shromažďovat metriky a měřit výkon pomocí ML.NET. I když tato ukázka trénuje regresní model, koncepty se vztahují ve většině ostatních algoritmů.

Rozdělení dat pro trénování a testování

Cílem modelu strojového učení je identifikovat vzory v trénovacích datech. Tyto vzory se používají k předpovědím pomocí nových dat.

Data lze modelovat podle třídy, jako je 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; }
}

S ohledem na následující data, která jsou načtena do objektu 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 Pomocí metody rozdělte data do trénovacích a testovacích sad. Výsledkem bude TrainTestData objekt, který obsahuje dva IDataView členy, jeden pro trénovací sadu a druhý pro testovací sadu. Procento rozdělení dat je určeno parametrem testFraction . Následující fragment kódu obsahuje 20 procent původních dat pro testovací sadu.

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

Příprava dat

Před trénováním modelu strojového učení je potřeba data předem zpracovat. Další informace o přípravě dat najdete v článku s návody k přípravě dat a také o transforms page.

ML.NET algoritmy mají omezení pro typy vstupních sloupců. Výchozí hodnoty se navíc používají pro názvy vstupních a výstupních sloupců, pokud nejsou zadány žádné hodnoty.

Práce s očekávanými typy sloupců

Algoritmy strojového učení ve ML.NET očekávají plovoucí vektor známé velikosti jako vstup. VectorType Atribut použijte u datového modelu, pokud jsou všechna data již v číselném formátu a je určená ke společnému zpracování (tj. obrazových pixelů).

Pokud data nejsou všechna číselná a chcete u každého sloupce použít různé transformace dat jednotlivě, použijte Concatenate metodu po zpracování všech sloupců ke kombinování všech jednotlivých sloupců do jednoho vektoru funkce, který je výstupem nového sloupce.

Následující fragment kódu kombinuje Size sloupce a HistoricalPrices sloupce do jednoho vektoru funkce, který je výstupem do nového sloupce volaného Features. Vzhledem k tomu, že existuje rozdíl ve škálách, NormalizeMinMax použije se u Features sloupce k normalizaci dat.

// 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);

Práce s výchozími názvy sloupců

ML.NET algoritmy používají výchozí názvy sloupců, pokud nejsou zadány žádné. Všichni trenéři mají parametr volaný featureColumnName pro vstupy algoritmu a pokud je to možné, mají také parametr pro očekávanou hodnotu volanou labelColumnName. Ve výchozím nastavení jsou Features tyto hodnoty a Label v uvedeném pořadí.

Při použití Concatenate metody během předběžného zpracování k vytvoření nového sloupce volaného Features, není nutné zadat název sloupce funkce v parametrech algoritmu, protože již existuje v předzpracované IDataView. Sloupec popisku je CurrentPrice, ale protože ColumnName se atribut používá v datovém modelu, ML.NET přejmenuje CurrentPrice sloupec, na Label který se odebere potřeba poskytnout labelColumnName parametr estimátoru algoritmů strojového učení.

Pokud nechcete používat výchozí názvy sloupců, předejte názvy sloupců funkcí a popisků jako parametry při definování estimátoru algoritmů strojového učení, jak ukazuje následující fragment kódu:

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

Ukládání dat do mezipaměti

Ve výchozím nastavení se při zpracování dat lazily načítá nebo streamuje, což znamená, že trenéři můžou načíst data z disku a iterovat je vícekrát během trénování. Proto se doporučuje ukládání do mezipaměti pro datové sady, které se vejdou do paměti, aby se snížil počet načtení dat z disku. Ukládání do mezipaměti se provádí jako součást EstimatorChain nástroje .AppendCacheCheckpoint

Doporučuje se použít AppendCacheCheckpoint před všemi trenéry v kanálu.

Pomocí následujícího EstimatorChainpříkazu přidáte AppendCacheCheckpoint před StochasticDualCoordinateAscent trenér do mezipaměti výsledky předchozích odhadců pro pozdější použití trenérem.

// 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());

Trénování modelu strojového učení

Po předběžném zpracování dat použijte metodu Fit k trénování modelu strojového StochasticDualCoordinateAscent učení pomocí regresního algoritmu.

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

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

Extrahování parametrů modelu

Po natrénování modelu extrahujte získané poznatky ModelParameters pro kontrolu nebo opětovné trénování. Poskytuje LinearRegressionModelParameters předsudky a naučené koeficienty nebo váhy natrénovaného modelu.

var trainedModelParameters = trainedModel.Model as LinearRegressionModelParameters;

Poznámka:

Jiné modely mají parametry specifické pro jejich úlohy. Například algoritmus K-Means vkládá data do clusteru na základě centroidů a KMeansModelParameters obsahuje vlastnost, která ukládá tyto naučené centroidy. Další informace najdete v Microsoft.ML.Trainers dokumentaci k rozhraní API a vyhledejte třídy, které obsahují ModelParameters jejich název.

Vyhodnocení kvality modelu

Aby bylo možné zvolit model s nejlepším výkonem, je důležité vyhodnotit jeho výkon na testovacích datech. Použijte metodu Evaluate k měření různých metrik pro natrénovaný model.

Poznámka:

Metoda Evaluate vytváří různé metriky v závislosti na tom, jakou úlohu strojového učení se provedly. Další podrobnosti najdete v Microsoft.ML.Data dokumentaci k rozhraní API a vyhledejte třídy, které obsahují Metrics jejich název.

// 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;

V předchozí ukázce kódu:

  1. Testovací datová sada je předem zpracována pomocí dříve definovaných transformací přípravy dat.
  2. Trénovaný model strojového učení slouží k předpovědím testovacích dat.
  3. Evaluate V metodě se hodnoty ve CurrentPrice sloupci testovací sady dat porovnávají se Score sloupcem nově výstupních predikcí pro výpočet metrik regresního modelu, z nichž jeden je uložen v rSquared proměnné R-Squared.

Poznámka:

V tomto malém příkladu je R-Squared číslo, které není v rozsahu 0–1 kvůli omezené velikosti dat. Ve skutečném scénáři byste měli očekávat, že uvidíte hodnotu od 0 do 1.