Przewidywanie przy użyciu wytrenowanego modelu

Dowiedz się, jak używać wytrenowanego modelu do tworzenia przewidywań

Tworzenie modeli danych

Dane wejściowe

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

Dane wyjściowe

Features Podobnie jak nazwy kolumn wejściowych i , Label ML.NET ma domyślne nazwy kolumn przewidywanych wartości utworzonych przez model. W zależności od zadania nazwa może się różnić.

Ponieważ algorytm używany w tym przykładzie jest algorytmem regresji liniowej, domyślna nazwa kolumny wyjściowej jest Score zdefiniowana przez ColumnName atrybut właściwości PredictedPrice .

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

Konfigurowanie potoku przewidywania

Niezależnie od tego, czy jest to przewidywanie pojedyncze, czy wsadowe, potok przewidywania musi zostać załadowany do aplikacji. Ten potok zawiera zarówno przekształcenia przetwarzania wstępnego danych, jak i wytrenowany model. Poniższy fragment kodu ładuje potok przewidywania z pliku o nazwie model.zip.

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

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

Pojedyncze przewidywanie

Aby utworzyć pojedyncze przewidywanie, utwórz PredictionEngine element przy użyciu załadowanego potoku przewidywania.

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

Następnie użyj Predict metody i przekaż dane wejściowe jako parametr. Zwróć uwagę, że użycie Predict metody nie wymaga, aby dane wejściowe to IDataView). Wynika to z tego, że wygodnie wewnętrznych operacje manipulowania typem danych wejściowych, dzięki czemu można przekazać obiekt typu danych wejściowych. Ponadto ponieważ CurrentPrice element docelowy lub etykieta, którą próbujesz przewidzieć przy użyciu nowych danych, zakłada się, że w tej chwili nie ma żadnej wartości.

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

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

Jeśli uzyskujesz dostęp do Score właściwości prediction obiektu, należy uzyskać wartość podobną do 150079.

Napiwek

PredictionEngine nie jest bezpieczny wątkowo. Ponadto należy utworzyć wystąpienie wszędzie tam, gdzie jest potrzebne w aplikacji. W miarę rozwoju aplikacji ten proces może stać się niezarządzany. W celu zwiększenia wydajności i bezpieczeństwa wątków należy użyć kombinacji wstrzykiwania zależności i usługi PredictionEnginePool , która tworzy ObjectPoolPredictionEngine obiekty do użytku w całej aplikacji.

Aby zapoznać się z przykładami dotyczącymi korzystania z usługi PredictionEnginePool, zobacz wdrażanie modelu w internetowym interfejsie API i wdrażanie modelu w usłudze Azure Functions.

Aby uzyskać więcej informacji, zobacz wstrzykiwanie zależności w programie ASP.NET Core .

Wiele przewidywań (IDataView)

Biorąc pod uwagę następujące dane, załaduj je do obiektu IDataView. W takim przypadku nazwa elementu IDataView to inputData. Ponieważ CurrentPrice jest to docelowa lub etykieta, którą próbujesz przewidzieć przy użyciu nowych danych, zakłada się, że w tej chwili nie ma żadnej wartości.

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

Następnie użyj Transform metody , aby zastosować przekształcenia danych i wygenerować przewidywania.

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

Sprawdź przewidywane wartości przy użyciu GetColumn metody .

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

Przewidywane wartości w kolumnie score powinny wyglądać następująco:

Obserwacji Przewidywanie
1 144638.2
2 150079.4
3 107789.8

Wiele przewidywań (PredictionEnginePool)

Aby wykonać wiele przewidywań przy użyciu funkcji PredictionEnginePool, możesz użyć IEnumerable wielu wystąpień danych wejściowych modelu. Na przykład metoda IEnumerable<HousingInput> i zastosuj metodę Predict do każdego elementu przy użyciu metody LINQ Select .

W tym przykładzie kodu założono, że masz wywołaną predictionEnginePool pulę PredictionEnginePool i IEnumerable<HousingData> o nazwie housingData.

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

Wynik jest IEnumerable zawierający wystąpienia prognoz. W tym przypadku będzie to IEnumerable<HousingPrediction>.