使用定型的模型預測

了解如何使用定型的模型建立預測

建立資料模型

輸入資料

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

輸出資料

例如 FeaturesLabel 輸入資料行名稱,ML.NET 有模型產生的預測值資料行預設名稱。 依工作不同,名稱可能不同。

因為用於此範例的演算法是線性迴歸演算法,所以輸出資料行預設名稱是 Score,由 PredictedPrice 屬性的 ColumnName 屬性所定義。

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

設定預測管線

無論是建立單一或批次預測,預測管線都需要載入到應用程式中。 此管線包含資料前置處理轉換以及定型的模型。 下列程式碼片段會從名為 model.zip 的檔案載入預測管線。

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

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

單一預測

若要建立單一預測,請使用載入的預測管線建立 PredictionEngine

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

然後,使用 Predict 方法,並傳入您的輸入資料作為參數。 請注意,使用 Predict 方法不要求輸入成為 IDataView)。 這是因為它方便內化輸入資料類型操作,使您可以傳入輸入資料類型的物件。 此外,因為 CurrentPrice 是您想要使用新資料嘗試預測的目標或標籤,所以假設它目前沒有任何值。

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

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

如果您存取 prediction 物件的 Score 屬性,您應該取得類似 150079 的值。

提示

PredictionEngine 不是安全執行緒。 此外,您必須在應用程式內有需要的任何地方建立其執行個體。 隨著應用程式成長,此程序可能會變得無法管理。 為了提升效能和執行緒的安全性,請合併使用相依性插入與 PredictionEnginePool 服務,以建立 PredictionEngine 物件的 ObjectPool 供整個應用程式使用。

如需如何使用PredictionEnginePool服務的範例,請參閱將模型部署到 Web API,並將模型部署至 Azure Functions

如需詳細資訊,請參閱 ASP.NET Core 中的相依性插入

多個預測 (IDataView)

指定下列資料,將它載入 IDataView。 在此案例中,IDataView 的名稱為 inputData。 因為 CurrentPrice 是您想要使用新資料嘗試預測的目標或標籤,所以假設它目前沒有任何值。

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

然後,使用 Transform 方法套用資料轉換並產生預測。

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

使用 GetColumn 方法檢查預測的值。

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

分數資料行中的預測值看起來應該如下所示:

觀測 預測
1 144638.2
2 150079.4
3 107789.8

多個預測 (PredictionEnginePool)

若要使用 PredictionEnginePool 進行多個預測,您可以採用包含多個模型輸入執行個體的 IEnumerable。 例如,IEnumerable<HousingInput> 以及使用 LINQ 的 Select 方法來將 Predict 方法套用至每個元素。

此程式碼範例假設您有名為 predictionEnginePoolPredictionEnginePool 及名為 housingDataIEnumerable<HousingData>

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

其結果是一個包含預測執行個體的 IEnumerable。 在此案例中,這將會是 IEnumerable<HousingPrediction>