Treffen von Vorhersagen mit einem trainierten Modell
Erfahren Sie, wie Sie ein trainiertes Modell verwenden, um Vorhersagen zu treffen
Erstellen von Datenmodellen
Eingabedaten
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; }
}
Ausgabedaten
Für die vorhergesagten Wertspalten, die von einem Modell erstellt werden, hat ML.NET Standardnamen wie die Eingabespaltenamen Features
und Label
. Abhängig von der Aufgabe kann der Name abweichen.
Da der in diesem Beispiel verwendete Algorithmus ein linearer Regressionsalgorithmus ist, lautet der Standardname der Ausgabespalte Score
und wird durch das ColumnName
-Attribut für die PredictedPrice
-Eigenschaft definiert.
class HousingPrediction
{
[ColumnName("Score")]
public float PredictedPrice { get; set; }
}
Einrichten einer Vorhersagepipeline
Die Vorhersagepipeline muss sowohl bei einer einzelnen als auch Batchvorhersage in die Anwendung geladen werden. Diese Pipeline enthält sowohl die Vorverarbeitungs-Datentransformationen als auch das trainierte Modell. Der folgende Codeausschnitt lädt die Vorhersagepipeline aus einer Datei namens model.zip
.
//Create MLContext
MLContext mlContext = new MLContext();
// Load Trained Model
DataViewSchema predictionPipelineSchema;
ITransformer predictionPipeline = mlContext.Model.Load("model.zip", out predictionPipelineSchema);
Einzelne Vorhersage
Um eine einzelne Vorhersage zu machen, erstellen Sie eine PredictionEngine
mithilfe der geladenen Vorhersagepipeline.
// Create PredictionEngines
PredictionEngine<HousingData, HousingPrediction> predictionEngine = mlContext.Model.CreatePredictionEngine<HousingData, HousingPrediction>(predictionPipeline);
Verwenden Sie dann die Predict
-Methode, und übergeben Sie Ihre Eingabedaten als Parameter. Beachten Sie, dass die Verwendung der Predict
-Methode nicht voraussetzt, dass die Eingabe eine IDataView
ist. Der Grund ist, dass sie die Bearbeitung des Eingabedatentyps einfach internalisiert, sodass Sie ein Objekt des Eingabedatentyps übergeben können. Da darüber hinaus CurrentPrice
das Ziel oder Label ist, das Sie mit den neuen Daten vorhersagen möchten, wird vorausgesetzt, dass zurzeit kein Wert dafür vorhanden ist.
// Input Data
HousingData inputData = new HousingData
{
Size = 900f,
HistoricalPrices = new float[] { 155000f, 190000f, 220000f }
};
// Get Prediction
HousingPrediction prediction = predictionEngine.Predict(inputData);
Wenn Sie auf die Score
-Eigenschaft des prediction
-Objekts zugreifen, sollten Sie einen Wert ähnlich wie 150079
erhalten.
Tipp
PredictionEngine
ist nicht threadsicher. Außerdem müssen Sie eine Instanz davon überall dort erstellen, wo diese in Ihrer Anwendung erforderlich ist. Wenn die Anwendung wächst, kann dieser Prozess ggf. nicht mehr verwaltet werden. Um eine bessere Leistung und Threadsicherheit zu erzielen, verwenden Sie eine Kombination aus Abhängigkeitsinjektion (Dependency Injection, DI) und dem PredictionEnginePool-Dienst, der einen ObjectPool
aus PredictionEngine
-Objekten für die Verwendung in Ihrer gesamten Anwendung erstellt.
Beispiele zur Verwendung des PredictionEnginePool-Diensts finden Sie unter Bereitstellen eines Modells in einer ASP.NET Core-Web-API und Bereitstellen des Modells für Azure Functions.
Weitere Informationen finden Sie unter Abhängigkeitsinjektion in ASP.NET Core.
Mehrere Vorhersagen (IDataView)
Laden Sie die folgenden Daten in eine IDataView
. In diesem Fall ist inputData
der Name von IDataView
. Da CurrentPrice
das Ziel oder Label ist, das Sie mit den neuen Daten vorhersagen möchten, wird vorausgesetzt, dass zurzeit kein Wert dafür vorhanden ist.
// 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 }
}
};
Verwenden Sie dann die Transform
-Methode zum Anwenden der Datentransformationen und Generieren von Vorhersagen.
// Predicted Data
IDataView predictions = predictionPipeline.Transform(inputData);
Überprüfen Sie die vorhergesagten Werte mit der GetColumn
-Methode.
// Get Predictions
float[] scoreColumn = predictions.GetColumn<float>("Score").ToArray();
Die vorhergesagten Werte in der Bewertungsspalte sollten wie folgt aussehen:
Beobachtung | Vorhersage |
---|---|
1 | 144638.2 |
2 | 150079.4 |
3 | 107789.8 |
Mehrere Vorhersagen (PredictionEnginePool)
Um mehrere Vorhersagen mit PredictionEnginePool zu treffen, können Sie ein IEnumerable
mit mehreren Instanzen Ihrer Modelleingabe verwenden. Sie verwenden beispielsweise ein IEnumerable<HousingInput>
und wenden die Predict
-Methode mithilfe der LINQ-Methode Select
auf jedes Element an.
In diesem Codebeispiel wird davon ausgegangen, dass Sie über einen PredictionEnginePool mit dem Namen predictionEnginePool
und ein IEnumerable<HousingData>
mit dem Namen housingData
verfügen.
IEnumerable<HousingPrediction> predictions = housingData.Select(input => predictionEnginePool.Predict(input));
Das Ergebnis ist ein IEnumerable
, das Instanzen Ihrer Vorhersagen enthält. In diesem Fall ist dies IEnumerable<HousingPrediction>
.