Freigeben über


Erstellen von Vorhersagen mit einem trainierten Modell

Erfahren Sie, wie Sie ein trainiertes Modell verwenden, um Vorhersagen zu erstellen.

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

Wie die Eingabespaltennamen Features und Label hat ML.NET Standardnamen für die prognostizierten Wertespalten, die von einem Modell erzeugt werden. Die Namen können je nach Aufgabe unterschiedlich sein.

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

Unabhängig davon, ob eine einzelne oder eine gebündelte Vorhersage durchgeführt wird, muss die Vorhersagepipeline in die Anwendung geladen werden. Diese Pipeline enthält sowohl die Datenvorverarbeitungstransformationen als auch das trainierte Modell. Der folgende Codeausschnitt lädt die Vorhersagepipeline aus einer Datei mit dem Namen 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 zu 150079erhalten.

Tipp

PredictionEngine ist nicht thread-sicher. Darüber hinaus müssen Sie eine Instanz davon überall erstellen, wo sie in Ihrer Anwendung benötigt wird. Wenn Ihre Anwendung wächst, kann dieser Prozess unwaltbar 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 für die Verwendung des PredictionEnginePool--Diensts finden Sie unter Bereitstellen eines Modells in einer Web-API und Bereitstellen eines 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, um die Datentransformationen anzuwenden und Vorhersagen zu generieren.

// Predicted Data
IDataView predictions = predictionPipeline.Transform(inputData);

Überprüfen Sie die vorhergesagten Werte mithilfe der GetColumn-Methode.

// Get Predictions
float[] scoreColumn = predictions.GetColumn<float>("Score").ToArray();

Die vorhergesagten Werte in der Bewertungsspalte sollten den folgenden Werten ähneln:

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