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:

  1. Partitioner data i ett antal partitioner som är lika med det värde som anges i parametern numberOfFolds . Resultatet av varje partition är ett TrainTestData objekt.
  2. En modell tränas på var och en av partitionerna med hjälp av den angivna maskininlärningsalgoritmberäknaren på träningsdatauppsättningen.
  3. Varje modells prestanda utvärderas med hjälp av Evaluate metoden på testdatauppsättningen.
  4. 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];