Een model trainen en evalueren

Meer informatie over het bouwen van machine learning-modellen, het verzamelen van metrische gegevens en het meten van prestaties met ML.NET. Hoewel in dit voorbeeld een regressiemodel wordt getraind, zijn de concepten van toepassing op een meerderheid van de andere algoritmen.

Gegevens splitsen voor training en testen

Het doel van een machine learning-model is het identificeren van patronen in trainingsgegevens. Deze patronen worden gebruikt om voorspellingen te doen met behulp van nieuwe gegevens.

De gegevens kunnen worden gemodelleerd door een klasse zoals 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; }
}

Gezien de volgende gegevens die in een 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
    }
};

Gebruik de TrainTestSplit methode om de gegevens te splitsen in trainings- en testsets. Het resultaat is een TrainTestData object met twee IDataView leden, een voor de treinset en de andere voor de testset. Het percentage gegevens splitsen wordt bepaald door de testFraction parameter. Het onderstaande fragment bevat 20 procent van de oorspronkelijke gegevens voor de testset.

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

De gegevens voorbereiden

De gegevens moeten vooraf worden verwerkt voordat ze een machine learning-model trainen. Meer informatie over gegevensvoorbereiding vindt u in het artikel over het voorbereiden van gegevens en het transforms pageartikel .

ML.NET algoritmen hebben beperkingen voor invoerkolomtypen. Daarnaast worden standaardwaarden gebruikt voor namen van invoer- en uitvoerkolommen wanneer er geen waarden worden opgegeven.

Werken met verwachte kolomtypen

De machine learning-algoritmen in ML.NET verwachten een floatvector van bekende grootte als invoer. Pas het VectorType kenmerk toe op uw gegevensmodel wanneer alle gegevens al een numerieke indeling hebben en zijn bedoeld om samen te worden verwerkt (bijvoorbeeld afbeeldings pixels).

Als gegevens niet alle numerieke gegevens zijn en u verschillende gegevenstransformaties op elk van de kolommen afzonderlijk wilt toepassen, gebruikt u de Concatenate methode nadat alle kolommen zijn verwerkt om alle afzonderlijke kolommen te combineren tot één functievector die naar een nieuwe kolom wordt uitgevoerd.

In het volgende codefragment worden de Size en HistoricalPrices kolommen gecombineerd tot één functievector die wordt uitgevoerd naar een nieuwe kolom met de naam Features. Omdat er een verschil in schalen is, NormalizeMinMax wordt deze toegepast op de Features kolom om de gegevens te normaliseren.

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

Werken met standaardkolomnamen

ML.NET algoritmen gebruiken standaardkolomnamen wanneer er geen worden opgegeven. Alle trainers hebben een parameter die wordt aangeroepen featureColumnName voor de invoer van het algoritme en, indien van toepassing, hebben ze ook een parameter voor de verwachte waarde die wordt aangeroepen labelColumnName. Deze waarden zijn Features standaard respectievelijk Label .

Door de methode te gebruiken tijdens de voorverwerking om een nieuwe kolom met de Concatenate naam Featureste maken, hoeft u de naam van de functiekolom niet op te geven in de parameters van het algoritme, omdat deze al bestaat in de vooraf verwerkte IDataViewkolom. De labelkolom is CurrentPrice, maar omdat het ColumnName kenmerk wordt gebruikt in het gegevensmodel, ML.NET de naam van de CurrentPrice kolom Label wijzigt, waardoor de parameter niet meer hoeft te worden opgegeven labelColumnName voor de machine learning-algoritmeschatter.

Als u de standaardkolomnamen niet wilt gebruiken, geeft u de namen van de functie- en labelkolommen door als parameters bij het definiëren van de machine learning-algoritmeschatter, zoals wordt gedemonstreerd door het volgende fragment:

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

Gegevens opslaan in cache

Wanneer gegevens worden verwerkt, worden deze standaard lui geladen of gestreamd, wat betekent dat trainers de gegevens van de schijf kunnen laden en er meerdere keren overheen kunnen herhalen tijdens de training. Daarom wordt caching aanbevolen voor gegevenssets die in het geheugen passen om het aantal keren dat gegevens vanaf schijf worden geladen, te verminderen. Caching wordt uitgevoerd als onderdeel van een EstimatorChain met behulp van AppendCacheCheckpoint.

Het is raadzaam om te gebruiken AppendCacheCheckpoint voordat er trainers in de pijplijn aanwezig zijn.

Met behulp van het volgende EstimatorChain, toevoegen AppendCacheCheckpoint voordat de trainer de resultaten van de vorige schattingen voor later gebruik door de trainer in de StochasticDualCoordinateAscent cache opgeslagen.

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

Het machine learning-model trainen

Zodra de gegevens vooraf zijn verwerkt, gebruikt u de Fit methode om het machine learning-model te trainen met het StochasticDualCoordinateAscent regressie-algoritme.

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

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

Modelparameters extraheren

Nadat het model is getraind, extraheert u het geleerde ModelParameters voor inspectie of hertraining. Het LinearRegressionModelParameters geeft de vooroordelen en geleerde coëfficiënten of gewichten van het getrainde model op.

var trainedModelParameters = trainedModel.Model as LinearRegressionModelParameters;

Notitie

Andere modellen hebben parameters die specifiek zijn voor hun taken. Het K-Means-algoritme plaatst bijvoorbeeld gegevens in het cluster op basis van zwaartepunten en de KMeansModelParameters bevat een eigenschap waarin deze geleerde zwaartepunten worden opgeslagen. Ga voor meer informatie naar de Microsoft.ML.Trainers API-documentatie en zoek naar klassen die hun naam bevatten ModelParameters .

Modelkwaliteit evalueren

Om het best presterende model te kiezen, is het essentieel om de prestaties te evalueren op testgegevens. Gebruik de Evaluate methode om verschillende metrische gegevens voor het getrainde model te meten.

Notitie

De Evaluate methode produceert verschillende metrische gegevens, afhankelijk van welke machine learning-taak is uitgevoerd. Ga voor meer informatie naar de Microsoft.ML.Data API-documentatie en zoek naar klassen die hun naam bevatten Metrics .

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

In het vorige codevoorbeeld:

  1. De testgegevensset wordt vooraf verwerkt met behulp van de eerder gedefinieerde transformaties voor gegevensvoorbereiding.
  2. Het getrainde machine learning-model wordt gebruikt om voorspellingen te doen over de testgegevens.
  3. In de Evaluate methode worden de waarden in de kolom van de CurrentPrice testgegevensset vergeleken met de kolom met de Score nieuwe uitvoervoorspellingen om de metrische gegevens voor het regressiemodel te berekenen, waarvan een R-Squared wordt opgeslagen in de rSquared variabele.

Notitie

In dit kleine voorbeeld is de R-Squared een getal dat niet binnen het bereik van 0-1 valt vanwege de beperkte grootte van de gegevens. In een praktijkscenario ziet u een waarde tussen 0 en 1.