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 de namen van de Features invoerkolommen Label heeft ML.NET standaardnamen voor de voorspelde waardekolommen die door een model worden geproduceerd. De namen kunnen verschillen, afhankelijk van de taak.

Omdat het algoritme dat in dit voorbeeld wordt gebruikt een lineair regressie-algoritme is, is Scorede standaardnaam van de uitvoerkolom, die wordt 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 volgende codefragment wordt de voorspellingspijplijn uit een bestand met de naam model.zipgeladen.

Important

Laad alleen modellen uit vertrouwde bronnen. Het laden van modellen van niet-vertrouwde bronnen is een beveiligingsrisico.

//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. Merk op dat voor het gebruik van de methode Predict niet vereist is dat de invoer een IDataView is. Dat komt doordat het handig is om de invoergegevenstypemanipulatie te internaliseren, zodat u een object van het invoergegevenstype kunt doorgeven. Aangezien CurrentPrice de doelvariabele of het label is dat u probeert te voorspellen op basis van nieuwe gegevens, wordt ervan uitgegaan dat deze momenteel geen waarde heeft.

// 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 draadveilig. Daarnaast moet u op elke plek waar het nodig is in uw applicatie een instantie ervan maken. 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 Corevoor meer informatie.

Meerdere voorspellingen (IDataView)

Gegeven de volgende gegevens, laad 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 ongeveer als volgt uitzien:

Observatie Prediction
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. Neem bijvoorbeeld een IEnumerable<HousingInput> methode en pas deze Predict toe op elk element met behulp van de LINQ-methode Select .

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

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

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