Träna en maskininlärningsmodell med hjälp av korsvalidering
Lär dig hur du använder korsvalidering för att träna mer robusta maskininlärningsmodeller i ML.NET.
Korsvalidering är en tränings- och modellutvärderingsteknik som delar upp data i flera partitioner och tränar flera algoritmer på dessa partitioner. Den här tekniken förbättrar modellens robusthet genom att hålla ut data från träningsprocessen. Förutom att förbättra prestanda för osynliga observationer kan det i databegränsade miljöer vara ett effektivt verktyg för att träna modeller med en mindre datamängd.
Data- och datamodellen
Angivna data från en fil som har följande format:
Size (Sq. ft.), HistoricalPrice1 ($), HistoricalPrice2 ($), HistoricalPrice3 ($), Current Price ($)
620.00, 148330.32, 140913.81, 136686.39, 146105.37
550.00, 557033.46, 529181.78, 513306.33, 548677.95
1127.00, 479320.99, 455354.94, 441694.30, 472131.18
1120.00, 47504.98, 45129.73, 43775.84, 46792.41
Data kan modelleras av en klass som HousingData
och läsas in i en IDataView
.
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; }
}
Förbereda data
Förbearbeta data innan du använder dem för att skapa maskininlärningsmodellen. I det här exemplet kombineras kolumnerna Size
och HistoricalPrices
till en enda funktionsvektor, som är utdata till en ny kolumn som heter Features
med hjälp av Concatenate
metoden. Förutom att hämta data i det format som förväntas av ML.NET algoritmer optimerar sammanfogning av kolumner efterföljande åtgärder i pipelinen genom att tillämpa åtgärden en gång för den sammanfogade kolumnen i stället för var och en av de separata kolumnerna.
När kolumnerna har kombinerats till en enda vektor NormalizeMinMax
tillämpas på Features
kolumnen för att hämta Size
och HistoricalPrices
i samma intervall mellan 0 och 1.
// Define data prep estimator
IEstimator<ITransformer> dataPrepEstimator =
mlContext.Transforms.Concatenate("Features", new string[] { "Size", "HistoricalPrices" })
.Append(mlContext.Transforms.NormalizeMinMax("Features"));
// Create data prep transformer
ITransformer dataPrepTransformer = dataPrepEstimator.Fit(data);
// Transform data
IDataView transformedData = dataPrepTransformer.Transform(data);
Träna modell med korsvalidering
När data har bearbetats i förväg är det dags att träna modellen. Välj först den algoritm som bäst överensstämmer med den maskininlärningsuppgift som ska utföras. Eftersom det förutsagda värdet är ett numeriskt kontinuerligt värde är aktiviteten regression. En av regressionsalgoritmerna som implementeras av ML.NET är algoritmen StochasticDualCoordinateAscentCoordinator
. Om du vill träna modellen med korsvalidering använder du CrossValidate
metoden.
Kommentar
Även om det här exemplet använder en linjär regressionsmodell gäller CrossValidate för alla andra maskininlärningsuppgifter i ML.NET förutom avvikelseidentifiering.
// Define StochasticDualCoordinateAscent algorithm estimator
IEstimator<ITransformer> sdcaEstimator = mlContext.Regression.Trainers.Sdca();
// Apply 5-fold cross validation
var cvResults = mlContext.Regression.CrossValidate(transformedData, sdcaEstimator, numberOfFolds: 5);
CrossValidate
utför följande åtgärder:
- Partitioner data i ett antal partitioner som är lika med det värde som anges i parametern
numberOfFolds
. Resultatet av varje partition är ettTrainTestData
objekt. - En modell tränas på var och en av partitionerna med hjälp av den angivna maskininlärningsalgoritmberäknaren på träningsdatauppsättningen.
- Varje modells prestanda utvärderas med hjälp av
Evaluate
metoden på testdatauppsättningen. - Modellen tillsammans med dess mått returneras för var och en av modellerna.
Resultatet som lagras i cvResults
är en samling CrossValidationResult
objekt. Det här objektet innehåller den tränade modellen samt mått som både är tillgängliga från Model
respektive Metrics
egenskaper. I det här exemplet är egenskapen Model
av typen ITransformer
och egenskapen Metrics
är av typen RegressionMetrics
.
Utvärdera modellen
Mått för de olika tränade modellerna kan nås via Metrics
egenskapen för det enskilda CrossValidationResult
objektet. I det här fallet används R-Squared-måttet och lagras i variabeln rSquared
.
IEnumerable<double> rSquared =
cvResults
.Select(fold => fold.Metrics.RSquared);
Om du inspekterar innehållet i variabeln rSquared
ska utdata vara fem värden från 0–1 där närmare 1 betyder bäst. Med hjälp av mått som R-Squared väljer du modellerna från bäst till sämst presterande. Välj sedan den översta modellen för att göra förutsägelser eller utföra ytterligare åtgärder med.
// Select all models
ITransformer[] models =
cvResults
.OrderByDescending(fold => fold.Metrics.RSquared)
.Select(fold => fold.Model)
.ToArray();
// Get Top Model
ITransformer topModel = models[0];