Träna och utvärdera en modell

Lär dig hur du skapar maskininlärningsmodeller, samlar in mått och mäter prestanda med ML.NET. Även om det här exemplet tränar en regressionsmodell gäller begreppen i de flesta andra algoritmer.

Dela upp data för träning och testning

Målet med en maskininlärningsmodell är att identifiera mönster i träningsdata. Dessa mönster används för att göra förutsägelser med hjälp av nya data.

Data kan modelleras av en klass som 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; }
}

Med tanke på följande data som läses in i en 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 Använd metoden för att dela upp data i tränings- och testuppsättningar. Resultatet blir ett TrainTestData objekt som innehåller två IDataView medlemmar, en för träningsuppsättningen och det andra för testuppsättningen. Procentandelen datadelning bestäms av parametern testFraction . Kodfragmentet nedan innehåller 20 procent av de ursprungliga data för testuppsättningen.

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

Förbereda data

Data måste förbearbetas innan du tränar en maskininlärningsmodell. Mer information om dataförberedelse finns i artikeln om dataförberedelser samt transforms page.

ML.NET algoritmer har begränsningar för indatakolumntyper. Dessutom används standardvärden för indata- och utdatakolumnnamn när inga värden anges.

Arbeta med förväntade kolumntyper

Maskininlärningsalgoritmerna i ML.NET förväntar sig en flyttalvektor med känd storlek som indata. VectorType Tillämpa attributet på datamodellen när alla data redan är i numeriskt format och är avsedda att bearbetas tillsammans (dvs. bildpixlar).

Om data inte är numeriska och du vill tillämpa olika datatransformeringar på var och en av kolumnerna individuellt använder du Concatenate metoden när alla kolumner har bearbetats för att kombinera alla enskilda kolumner i en enda funktionsvektor som matas ut till en ny kolumn.

Följande kodfragment kombinerar kolumnerna Size och HistoricalPrices till en enda funktionsvektor som matas ut till en ny kolumn med namnet Features. Eftersom det finns en skillnad i skalor NormalizeMinMax tillämpas på Features kolumnen för att normalisera data.

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

Arbeta med standardkolumnnamn

ML.NET algoritmer använder standardkolumnnamn när inga anges. Alla utbildare har en parameter som anropas featureColumnName för indata för algoritmen och när det är tillämpligt har de också en parameter för det förväntade värdet som kallas labelColumnName. Som standard är Features dessa värden respektive Label .

Genom att använda Concatenate metoden under förbearbetningen för att skapa en ny kolumn med namnet Featuresbehöver du inte ange funktionskolumnnamnet i parametrarna för algoritmen eftersom den redan finns i den förbearbetade IDataView. Etikettkolumnen är CurrentPrice, men eftersom ColumnName attributet används i datamodellen byter ML.NET namn på kolumnen CurrentPriceLabel som tar bort behovet av att ange parametern labelColumnName till maskininlärningsalgoritmberäknaren.

Om du inte vill använda standardkolumnnamnen skickar du in namnen på funktions- och etikettkolumnerna som parametrar när du definierar maskininlärningsalgoritmens estimator, vilket visas av följande kodfragment:

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

Cachelagring av data

När data bearbetas läses den som standard lätt in eller strömmas, vilket innebär att utbildare kan läsa in data från disken och iterera över dem flera gånger under träningen. Därför rekommenderas cachelagring för datauppsättningar som får plats i minnet för att minska antalet gånger data läses in från disken. Cachelagring görs som en del av en EstimatorChain med hjälp AppendCacheCheckpointav .

Vi rekommenderar att du använder AppendCacheCheckpoint före några utbildare i pipelinen.

Med hjälp av följande EstimatorChaincachelagrar lägger du till AppendCacheCheckpoint innan StochasticDualCoordinateAscent tränaren cachelagrar resultatet från de tidigare skattningarna för senare användning av tränaren.

// 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äna maskininlärningsmodellen

När data har förbearbetats använder du Fit metoden för att träna maskininlärningsmodellen med regressionsalgoritmen StochasticDualCoordinateAscent .

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

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

Extrahera modellparametrar

När modellen har tränats extraherar du den inlärda ModelParameters för inspektion eller omträning. Tillhandahålla LinearRegressionModelParameters bias och inlärda koefficienter eller vikter för den tränade modellen.

var trainedModelParameters = trainedModel.Model as LinearRegressionModelParameters;

Kommentar

Andra modeller har parametrar som är specifika för deras uppgifter. Till exempel placerar K-Means-algoritmen data i kluster baserat på centroider och KMeansModelParameters innehåller en egenskap som lagrar dessa inlärda centroider. Mer information finns i API-dokumentationen Microsoft.ML.Trainers och leta efter klasser som innehåller ModelParameters i deras namn.

Utvärdera modellkvalitet

För att hjälpa till att välja den modell som fungerar bäst är det viktigt att utvärdera dess prestanda på testdata. Evaluate Använd metoden för att mäta olika mått för den tränade modellen.

Kommentar

Metoden Evaluate genererar olika mått beroende på vilken maskininlärningsuppgift som utfördes. Mer information finns i API-dokumentationen Microsoft.ML.Data och leta efter klasser som innehåller Metrics i deras namn.

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

I föregående kodexempel:

  1. Testdatauppsättningen bearbetas i förväg med hjälp av de dataförberedelsetransformeringar som tidigare definierats.
  2. Den tränade maskininlärningsmodellen används för att göra förutsägelser om testdata.
  3. Evaluate I metoden jämförs värdena i kolumnen i CurrentPrice testdatauppsättningen Score mot kolumnen i de nya utdataförutsägelserna för att beräkna måtten för regressionsmodellen, varav en, R-Squared lagras i variabelnrSquared.

Kommentar

I det här lilla exemplet är R-Squared ett tal som inte ligger i intervallet 0–1 på grund av datans begränsade storlek. I ett verkligt scenario bör du förvänta dig att se ett värde mellan 0 och 1.