Partilhar via


Treinar um modelo de aprendizado de máquina usando validação cruzada

Saiba como usar a validação cruzada para treinar modelos de aprendizado de máquina mais robustos no ML.NET.

A validação cruzada é uma técnica de treinamento e avaliação de modelos que divide os dados em várias partições e treina vários algoritmos nessas partições. Esta técnica melhora a robustez do modelo ao armazenar dados do processo de treinamento. Além de melhorar o desempenho em observações invisíveis, em ambientes com restrição de dados pode ser uma ferramenta eficaz para modelos de treinamento com um conjunto de dados menor.

Os dados e o modelo de dados

Dados fornecidos de um arquivo que tem o seguinte formato:

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

Os dados podem ser modelados por uma classe como HousingData e carregados em um IDataViewarquivo .

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; }
}

Preparar os dados

Pré-processe os dados antes de usá-los para criar o modelo de aprendizado de máquina. Neste exemplo, as Size colunas e HistoricalPrices são combinadas em um único vetor de recurso, que é a saída para uma nova coluna chamada Features usando o Concatenate método. Além de colocar os dados no formato esperado pelos algoritmos ML.NET, a concatenação de colunas otimiza as operações subsequentes no pipeline aplicando a operação uma vez para a coluna concatenada em vez de cada uma das colunas separadas.

Uma vez que as colunas são combinadas em um único vetor, NormalizeMinMax é aplicado à Features coluna para obter Size e HistoricalPrices no mesmo intervalo entre 0-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);

Modelo de comboio com validação cruzada

Uma vez que os dados tenham sido pré-processados, é hora de treinar o modelo. Primeiro, selecione o algoritmo que mais se alinha com a tarefa de aprendizado de máquina a ser executada. Como o valor previsto é um valor numericamente contínuo, a tarefa é a regressão. Um dos algoritmos de regressão implementados pela ML.NET é o StochasticDualCoordinateAscentCoordinator algoritmo. Para treinar o modelo com validação cruzada, use o CrossValidate método.

Nota

Embora este exemplo use um modelo de regressão linear, o CrossValidate é aplicável a todas as outras tarefas de aprendizado de máquina em ML.NET exceto a Deteção de Anomalias.

// 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 executa as seguintes operações:

  1. Particiona os dados em um número de partições igual ao valor especificado no numberOfFolds parâmetro. O resultado de cada partição é um TrainTestData objeto.
  2. Um modelo é treinado em cada uma das partições usando o estimador de algoritmo de aprendizado de máquina especificado no conjunto de dados de treinamento.
  3. O desempenho de cada modelo é avaliado usando o Evaluate método no conjunto de dados de teste.
  4. O modelo juntamente com suas métricas são retornados para cada um dos modelos.

O resultado armazenado em cvResults é uma coleção de CrossValidationResult objetos. Este objeto inclui o modelo treinado, bem como métricas que são acessíveis a partir do Model e Metrics propriedades, respectivamente. Neste exemplo, a Model propriedade é do tipo ITransformer e a Metrics propriedade é do tipo RegressionMetrics.

Avaliar o modelo

As métricas para os diferentes modelos treinados podem ser acessadas através da Metrics propriedade do objeto individual CrossValidationResult . Neste caso, a métrica R-Squared é acessada e armazenada na variável rSquared.

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

Se você inspecionar o rSquared conteúdo da variável, a saída deve ser de cinco valores variando de 0-1 onde mais perto de 1 significa melhor. Usando métricas como o R-Squared, selecione os modelos do melhor para o pior desempenho. Em seguida, selecione o modelo superior para fazer previsões ou executar operações adicionais.

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

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