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 page
artikel .
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 Features
te 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 IDataView
kolom. 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:
- De testgegevensset wordt vooraf verwerkt met behulp van de eerder gedefinieerde transformaties voor gegevensvoorbereiding.
- Het getrainde machine learning-model wordt gebruikt om voorspellingen te doen over de testgegevens.
- In de
Evaluate
methode worden de waarden in de kolom van deCurrentPrice
testgegevensset vergeleken met de kolom met deScore
nieuwe uitvoervoorspellingen om de metrische gegevens voor het regressiemodel te berekenen, waarvan een R-Squared wordt opgeslagen in derSquared
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.