Megosztás a következőn keresztül:


Előrejelzések készítése betanított modellel

Megtudhatja, hogyan használhat betanított modelleket előrejelzések készítésére.

Adatmodellek létrehozása

Bemeneti adatok

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

Kimeneti adatok

A Features és a Label bemeneti oszlopnevekhez hasonlóan az ML.NET alapértelmezett neveket rendel a modell által létrehozott előrejelzett értékoszlopokhoz. A nevek a tevékenységtől függően eltérhetnek.

Mivel a mintában használt algoritmus lineáris regressziós algoritmus, a kimeneti oszlop alapértelmezett neve Score, amelyet a PredictedPrice tulajdonság ColumnName attribútuma határoz meg.

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

Előrejelzési folyamat beállítása

Akár egyetlen, akár kötegelt előrejelzést készít, az előrejelzési folyamatot be kell tölteni az alkalmazásba. Ez a folyamat az adatelőfeldolgozási átalakításokat és a betanított modellt is tartalmazza. Az alábbi kódrészlet betölti az előrejelzési folyamatot egy model.zipnevű fájlból.

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

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

Egyetlen előrejelzés

Egyetlen előrejelzés készítéséhez hozzon létre egy PredictionEngine-t a betöltött előrejelzési folyamat segítségével.

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

Ezután használja a Predict metódust, és adja meg paraméterként a bemeneti adatokat. Figyelje meg, hogy a Predict metódus használatához nem szükséges, hogy a bemenet IDataViewlegyen. Ennek az az oka, hogy kényelmesen internalizálja a bemeneti adattípus-kezelést, hogy a bemeneti adattípus egy objektumát átadhassa. Emellett mivel CurrentPrice az a cél vagy címke, amelyet új adatokkal szeretne előrejelezni, feltételezzük, hogy jelenleg nincs értéke.

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

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

Ha hozzáfér a prediction objektum Score tulajdonságához, a 150079értékhez hasonló értéket kell kapnia.

Borravaló

PredictionEngine nem szálbiztos. Emellett az alkalmazásban mindenhol létre kell hoznia egy példányt, ahol szükség van rá. Az alkalmazás növekedésével ez a folyamat kezelhetetlenné válhat. A jobb teljesítmény és a szálbiztonság érdekében használja a függőséginjektálás és a PredictionEnginePool szolgáltatás kombinációját, amely PredictionEngine objektumok ObjectPool hoz létre az alkalmazás teljes területén való használatra.

A PredictionEnginePool szolgáltatás használatának példáira, mint például: modell üzembe helyezése webes API-ra vagy modell üzembe helyezése az Azure Functions szolgáltatásba.

További információért lásd: Függőséginjektálás az ASP.NET Core-ban.

Több előrejelzés (IDataView)

A következő adatok alapján töltse be az adatokat IDataView-ba. Ebben az esetben a IDataView neve inputData. Mivel CurrentPrice az a cél vagy címke, amelyet új adatok használatával szeretne előrejelezni, feltételezzük, hogy jelenleg nincs érték.

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

Ezután használja a Transform metódust az adatátalakítások alkalmazásához és előrejelzések létrehozásához.

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

A GetColumn metódussal vizsgálja meg az előrejelzett értékeket.

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

A pontszámoszlop előrejelzett értékeinek a következő értékekhez kell hasonlítania:

Megfigyelés Jóslás
1 144638.2
2 150079.4
3 107789.8

Több előrejelzés (PredictionEnginePool)

Ha több előrejelzést szeretne készíteni PredictionEnginePoolhasználatával, a modell bemenetének több példányát tartalmazó IEnumerable is készíthet. Vegyünk például egy IEnumerable<HousingInput>, és alkalmazzuk a Predict metódust az egyes elemekre a LINQ Select metódus használatával.

Ez a kódminta feltételezi, hogy van egy PredictionEnginePool nevű predictionEnginePool, és egy housingDatanevű IEnumerable<HousingData>.

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

Az eredmény egy IEnumerable, amely tartalmazza a jóslatainak példányait. Ebben az esetben IEnumerable<HousingPrediction>lenne.