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>.