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