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