Effectuer des prédictions avec un modèle entraîné
Découvrez comment utiliser un modèle entraîné pour effectuer des prédictions.
Créer des modèles de données
Données d’entrée
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; }
}
Données de sortie
Comme les noms de colonne d’entrée Features
et Label
, ML.NET a des noms par défaut pour les colonnes de valeur prédite produites par un modèle. Selon la tâche, le nom peut différer.
L’algorithme utilisé dans cet exemple étant un algorithme de régression linéaire, le nom par défaut de la colonne de sortie est Score
, défini par l’attribut ColumnName
sur la propriété PredictedPrice
.
class HousingPrediction
{
[ColumnName("Score")]
public float PredictedPrice { get; set; }
}
Configurer un pipeline de prédiction
Que vous effectuiez une prédiction unique ou par lot, vous devez charger le pipeline de prédiction dans l’application. Ce pipeline contient les transformations de prétraitement de données ainsi que le modèle entraîné. L’extrait de code ci-dessous charge le pipeline de prédiction à partir d’un fichier nommé model.zip
.
//Create MLContext
MLContext mlContext = new MLContext();
// Load Trained Model
DataViewSchema predictionPipelineSchema;
ITransformer predictionPipeline = mlContext.Model.Load("model.zip", out predictionPipelineSchema);
Prédiction unique
Pour effectuer une prédiction unique, créez un PredictionEngine
en utilisant le pipeline de prédiction chargé.
// Create PredictionEngines
PredictionEngine<HousingData, HousingPrediction> predictionEngine = mlContext.Model.CreatePredictionEngine<HousingData, HousingPrediction>(predictionPipeline);
Ensuite, utilisez la méthode Predict
pour transmettre vos données d’entrée en tant que paramètre. Notez que l’utilisation de la méthode Predict
ne requiert pas que l’entrée soit un IDataView
). En effet, elle internalise facilement la manipulation du type de données d’entrée afin que vous puissiez passer un objet du type de données d’entrée. De plus, CurrentPrice
étant la cible ou l’étiquette que vous tentez de prédire à l’aide de nouvelles données, aucune valeur correspondante n’est censée exister pour le moment.
// Input Data
HousingData inputData = new HousingData
{
Size = 900f,
HistoricalPrices = new float[] { 155000f, 190000f, 220000f }
};
// Get Prediction
HousingPrediction prediction = predictionEngine.Predict(inputData);
Si vous accédez à la propriété Score
de l’objet prediction
, vous devez obtenir une valeur similaire à 150079
.
Conseil
PredictionEngine
n’est pas thread-safe. En outre, vous devez créer une instance de celui-ci partout où il est nécessaire dans votre application. À mesure que votre application croît, ce processus peut devenir non gérable. Pour améliorer les performances et la sécurité des threads, utilisez une combinaison d’injection de dépendances et du service PredictionEnginePool, qui crée un ObjectPool
d’objets PredictionEngine
à utiliser dans votre application.
Pour obtenir des exemples sur l’utilisation du service PredictionEnginePool, consultez Déployer un modèle sur une API web et Déployer un modèle sur Azure Functions.
Pour plus d’informations, consultez Injection de dépendances dans ASP.NET Core.
Prédictions multiples (IDataView)
Soient les données suivantes. Chargez-les dans un IDataView
. Dans ce cas, le nom de notre IDataView
est inputData
. CurrentPrice
étant la cible ou l’étiquette que vous tentez de prédire à l’aide de nouvelles données, aucune valeur correspondante n’est censée exister pour le moment.
// 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 }
}
};
Ensuite, utilisez la méthode Transform
pour appliquer les transformations de données et générer des prédictions.
// Predicted Data
IDataView predictions = predictionPipeline.Transform(inputData);
Inspectez les valeurs prédites à l’aide de la méthode GetColumn
.
// Get Predictions
float[] scoreColumn = predictions.GetColumn<float>("Score").ToArray();
Les valeurs prédites dans la colonne des scores doivent se présenter comme suit :
Observation | Prédiction |
---|---|
1 | 144638.2 |
2 | 150079.4 |
3 | 107789.8 |
Prédictions multiples (PredictionEnginePool)
Pour effectuer plusieurs prédictions à l’aide de PredictionEnginePool, vous pouvez prendre un IEnumerable
contenant plusieurs instances de votre entrée de modèle. Par exemple un IEnumerable<HousingInput>
, puis appliquez la méthode Predict
à chaque élément à l’aide de la méthode Select
LINQ.
Cet exemple de code suppose que vous avez un PredictionEnginePool appelé predictionEnginePool
et un IEnumerable<HousingData>
appelé housingData
.
IEnumerable<HousingPrediction> predictions = housingData.Select(input => predictionEnginePool.Predict(input));
Le résultat est un IEnumerable
contenant des instances de vos prédictions. Dans cet exemple, il s’agit de IEnumerable<HousingPrediction>
.