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:
- Partiziona i dati in un numero di partizioni uguali al valore specificato nel parametro
numberOfFolds
. Il risultato di ogni partizione è un oggettoTrainTestData
. - Viene addestrato un modello su ciascuna partizione utilizzando l'estimatore dell'algoritmo di machine learning specificato nell'insieme di dati di addestramento.
- Le prestazioni di ogni modello vengono valutate usando il metodo
Evaluate
nel set di dati di test. - 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
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];