Voorspellingen doen met een getraind model

Meer informatie over het gebruik van een getraind model om voorspellingen te doen

Gegevensmodellen maken

Invoergegevens

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; }
}

Uitvoergegevens

Net als bij de namen van Label de Features invoerkolommen heeft ML.NET standaardnamen voor de voorspelde waardekolommen die door een model worden geproduceerd. Afhankelijk van de taak kan de naam verschillen.

Omdat het algoritme dat in dit voorbeeld wordt gebruikt een lineair regressie-algoritme is, wordt Score de standaardnaam van de uitvoerkolom gedefinieerd door het ColumnName kenmerk op de PredictedPrice eigenschap.

class HousingPrediction
{
    [ColumnName("Score")]
    public float PredictedPrice { get; set; }
}

Een voorspellingspijplijn instellen

Of u nu één of batchvoorspelling maakt, de voorspellingspijplijn moet in de toepassing worden geladen. Deze pijplijn bevat zowel de gegevensvoorverwerkingstransformaties als het getrainde model. Met het onderstaande codefragment wordt de voorspellingspijplijn uit een bestand met de naam model.zipgeladen.

//Create MLContext
MLContext mlContext = new MLContext();

// Load Trained Model
DataViewSchema predictionPipelineSchema;
ITransformer predictionPipeline = mlContext.Model.Load("model.zip", out predictionPipelineSchema);

Enkele voorspelling

Als u één voorspelling wilt doen, maakt u een PredictionEngine met behulp van de geladen voorspellingspijplijn.

// Create PredictionEngines
PredictionEngine<HousingData, HousingPrediction> predictionEngine = mlContext.Model.CreatePredictionEngine<HousingData, HousingPrediction>(predictionPipeline);

Gebruik vervolgens de Predict methode en geef uw invoergegevens door als parameter. U ziet dat voor het gebruik van de Predict methode niet vereist is dat de invoer een IDataView). Dit komt doordat het handig is om de invoergegevenstypemanipulatie te internaliseren, zodat u een object van het invoergegevenstype kunt doorgeven. Daarnaast CurrentPrice wordt ervan uitgegaan dat er op dit moment geen waarde is voor het doel of label dat u probeert te voorspellen met behulp van nieuwe gegevens.

// Input Data
HousingData inputData = new HousingData
{
    Size = 900f,
    HistoricalPrices = new float[] { 155000f, 190000f, 220000f }
};

// Get Prediction
HousingPrediction prediction = predictionEngine.Predict(inputData);

Als u de Score eigenschap van het prediction object opent, moet u een waarde krijgen die vergelijkbaar is met 150079.

Tip

PredictionEngine is niet thread-safe. Daarnaast moet u overal een exemplaar van het exemplaar maken dat nodig is in uw toepassing. Naarmate uw toepassing groeit, kan dit proces onbeheerbaar worden. Gebruik voor verbeterde prestaties en threadveiligheid een combinatie van afhankelijkheidsinjectie en de PredictionEnginePool-service , waarmee een ObjectPool aantal PredictionEngine objecten wordt gemaakt voor gebruik in uw toepassing.

Zie Een model implementeren in een web-API en een model implementeren in Azure Functions voor voorbeelden van het gebruik van de PredictionEnginePool-service.

Zie afhankelijkheidsinjectie in ASP.NET Core voor meer informatie.

Meerdere voorspellingen (IDataView)

Op basis van de volgende gegevens laadt u deze in een IDataView. In dit geval is de naam van het IDataView bestand inputData. Omdat CurrentPrice het doel of label is dat u probeert te voorspellen met behulp van nieuwe gegevens, wordt ervan uitgegaan dat er momenteel geen waarde voor is.

// 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 }
    }
};

Gebruik vervolgens de Transform methode om de gegevenstransformaties toe te passen en voorspellingen te genereren.

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

Inspecteer de voorspelde waarden met behulp van de GetColumn methode.

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

De voorspelde waarden in de scorekolom moeten er als volgt uitzien:

Observatie Voorspelling
1 144638.2
2 150079.4
3 107789.8

Meerdere voorspellingen (PredictionEnginePool)

Als u meerdere voorspellingen wilt doen met PredictionEnginePool, kunt u een IEnumerable met meerdere exemplaren van uw modelinvoer nemen. Bijvoorbeeld een IEnumerable<HousingInput> en pas de Predict methode toe op elk element met behulp van de methode VAN LINQ Select .

In dit codevoorbeeld wordt ervan uitgegaan dat u een PredictionEnginePool hebt aangeroepen predictionEnginePool en een IEnumerable<HousingData> aangeroepen housingData.

IEnumerable<HousingPrediction> predictions = housingData.Select(input => predictionEnginePool.Predict(input));

Het resultaat is een IEnumerable met exemplaren van uw voorspellingen. In dit geval zou het IEnumerable<HousingPrediction> zijn.