Faça previsões com um modelo treinado
Saiba como usar um modelo treinado para fazer previsões
Criar modelos de dados
Dados de entrada
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; }
}
Dados de saída
Como os nomes das Features
colunas e Label
de entrada, ML.NET tem nomes padrão para as colunas de valor previsto produzidas por um modelo. Dependendo da tarefa, o nome pode ser diferente.
Como o algoritmo usado neste exemplo é um algoritmo de regressão linear, o nome padrão da coluna de saída é Score
definido pelo ColumnName
atributo na PredictedPrice
propriedade.
class HousingPrediction
{
[ColumnName("Score")]
public float PredictedPrice { get; set; }
}
Configurar um pipeline de previsão
Seja fazendo uma previsão única ou em lote, o pipeline de previsão precisa ser carregado no aplicativo. Esse pipeline contém as transformações de pré-processamento de dados, bem como o modelo treinado. O trecho de código abaixo carrega o pipeline de previsão de um arquivo chamado model.zip
.
//Create MLContext
MLContext mlContext = new MLContext();
// Load Trained Model
DataViewSchema predictionPipelineSchema;
ITransformer predictionPipeline = mlContext.Model.Load("model.zip", out predictionPipelineSchema);
Previsão única
Para fazer uma única previsão, crie uma PredictionEngine
usando o pipeline de previsão carregado.
// Create PredictionEngines
PredictionEngine<HousingData, HousingPrediction> predictionEngine = mlContext.Model.CreatePredictionEngine<HousingData, HousingPrediction>(predictionPipeline);
Em seguida, use o Predict
método e passe seus dados de entrada como um parâmetro. Observe que usar o Predict
método não requer que a entrada seja um IDataView
). Isso ocorre porque ele internaliza convenientemente a manipulação do tipo de dados de entrada para que você possa passar um objeto do tipo de dados de entrada. Além disso, como CurrentPrice
é o alvo ou rótulo que você está tentando prever usando novos dados, supõe-se que não há valor para ele no momento.
// Input Data
HousingData inputData = new HousingData
{
Size = 900f,
HistoricalPrices = new float[] { 155000f, 190000f, 220000f }
};
// Get Prediction
HousingPrediction prediction = predictionEngine.Predict(inputData);
Se você acessar a Score
propriedade do prediction
objeto, deverá obter um valor semelhante a 150079
.
Gorjeta
PredictionEngine
não é thread-safe. Além disso, você precisa criar uma instância dele em todos os lugares em que for necessário em seu aplicativo. À medida que seu aplicativo cresce, esse processo pode se tornar incontrolável. Para melhorar o desempenho e a segurança de threads, use uma combinação de injeção de dependência e o serviço PredictionEnginePool, que cria um ObjectPool
de PredictionEngine
objetos para uso em todo o aplicativo.
Para obter exemplos sobre como usar o serviço PredictionEnginePool , consulte implantar um modelo em uma API Web e implantar um modelo no Azure Functions.
Consulte Injeção de dependência no ASP.NET Core para obter mais informações.
Várias previsões (IDataView)
Dado os seguintes dados, carregue-os em um IDataView
arquivo . Neste caso, o nome do IDataView
é inputData
. Como CurrentPrice
é o alvo ou rótulo que você está tentando prever usando novos dados, presume-se que não há valor para ele no momento.
// Actual data
HousingData[] housingData = new HousingData[]
{
new HousingData
{
Size = 850f,
HistoricalPrices = new float[] { 150000f, 175000f, 210000f }
},
new HousingData
{
Size = 900f,
HistoricalPrices = new float[] { 155000f, 190000f, 220000f }
},
new HousingData
{
Size = 550f,
HistoricalPrices = new float[] { 99000f, 98000f, 130000f }
}
};
Em seguida, use o Transform
método para aplicar as transformações de dados e gerar previsões.
// Predicted Data
IDataView predictions = predictionPipeline.Transform(inputData);
Inspecione os valores previstos usando o GetColumn
método.
// Get Predictions
float[] scoreColumn = predictions.GetColumn<float>("Score").ToArray();
Os valores previstos na coluna de pontuação devem ter a seguinte aparência:
Observação | Previsão |
---|---|
1 | 144638.2 |
2 | 150079.4 |
3 | 107789.8 |
Várias previsões (PredictionEnginePool)
Para fazer várias previsões usando PredictionEnginePool, você pode usar várias IEnumerable
instâncias da entrada do modelo. Por exemplo, um IEnumerable<HousingInput>
e aplique o método a cada elemento usando o Predict
Select
método do LINQ.
Este exemplo de código pressupõe que você tenha um PredictionEnginePool chamado predictionEnginePool
e um IEnumerable<HousingData>
chamado housingData
.
IEnumerable<HousingPrediction> predictions = housingData.Select(input => predictionEnginePool.Predict(input));
O resultado é uma IEnumerable
instância contendo suas previsões. Neste caso, seria IEnumerable<HousingPrediction>
.