Condividi tramite


Addestrare un modello di apprendimento automatico usando la convalida incrociata

Informazioni su come usare la convalida incrociata per eseguire il training di modelli di Machine Learning più affidabili in ML.NET.

La convalida incrociata è una tecnica di training e valutazione del modello che suddivide i dati in più partizioni e esegue il training di più algoritmi su queste partizioni. Questa tecnica migliora l'affidabilità del modello escludendo i dati dal processo di addestramento. Oltre a migliorare le prestazioni sulle osservazioni non visualizzate, negli ambienti vincolati dai dati può essere uno strumento efficace per il training dei modelli con un set di dati più piccolo.

Dati e modello di dati

Dati forniti da un file con il formato seguente:

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

I dati possono essere modellati da una classe come HousingData e caricati in un 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; }
}

Prepara i dati

Pre-elaborare i dati prima di usarli per compilare il modello di Machine Learning. In questo esempio, le colonne Size e HistoricalPrices vengono combinate in un singolo vettore di funzionalità, che viene restituito a una nuova colonna denominata Features usando il metodo Concatenate. Oltre a ottenere i dati nel formato previsto dagli algoritmi di ML.NET, la concatenazione delle colonne ottimizza le operazioni successive nella pipeline applicando l'operazione una volta per la colonna concatenata anziché per ognuna delle colonne separate.

Una volta combinate le colonne in un singolo vettore, NormalizeMinMax viene applicato alla colonna Features per ottenere Size e HistoricalPrices nello stesso intervallo compreso tra 0 e 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);

Eseguire il training del modello con convalida incrociata

Dopo aver pre-elaborato i dati, è possibile eseguire il training del modello. Selezionare prima di tutto l'algoritmo più allineato all'attività di Machine Learning da eseguire. Poiché il valore stimato è un valore numericamente continuo, l'attività è regressione. Uno degli algoritmi di regressione implementati da ML.NET è l'algoritmo di StochasticDualCoordinateAscentCoordinator. Per eseguire il training del modello con convalida incrociata, usare il metodo CrossValidate.

Nota

Anche se questo esempio usa un modello di regressione lineare, CrossValidate è applicabile a tutte le altre attività di Machine Learning in ML.NET ad eccezione del rilevamento anomalie.

// 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 esegue le operazioni seguenti:

  1. Partiziona i dati in un numero di partizioni uguali al valore specificato nel parametro numberOfFolds. Il risultato di ogni partizione è un oggetto TrainTestData.
  2. Viene addestrato un modello su ciascuna partizione utilizzando l'estimatore dell'algoritmo di machine learning specificato nell'insieme di dati di addestramento.
  3. Le prestazioni di ogni modello vengono valutate usando il metodo Evaluate nel set di dati di test.
  4. Il modello insieme alle relative metriche viene restituito per ognuno dei modelli.

Il risultato archiviato in cvResults è una raccolta di oggetti CrossValidationResult. Questo oggetto include il modello addestrato e le metriche, che sono entrambe accessibili attraverso le proprietà Model e Metrics rispettivamente. In questo esempio la proprietà Model è di tipo ITransformer e la proprietà Metrics è di tipo RegressionMetrics.

Valutare il modello

È possibile accedere alle metriche per i diversi modelli sottoposti a training tramite la proprietà Metrics del singolo oggetto CrossValidationResult. In questo caso, l' della metrica R-Squared è accessibile e archiviata nella variabile .

IEnumerable<double> rSquared =
    cvResults
        .Select(fold => fold.Metrics.RSquared);

Se si esamina il contenuto della variabile rSquared, l'output deve essere composto da cinque valori compresi tra 0 e 1, dove più vicino a 1 indica meglio. Usando metriche come R-Squared, selezionare i modelli tra le migliori e le prestazioni peggiori. Selezionare quindi il modello principale con cui eseguire stime o eseguire operazioni aggiuntive.

// Select all models
ITransformer[] models =
    cvResults
        .OrderByDescending(fold => fold.Metrics.RSquared)
        .Select(fold => fold.Model)
        .ToArray();

// Get Top Model
ITransformer topModel = models[0];