使用经过训练的模型进行预测

了解如何使用经过训练的模型进行预测

创建数据模型

输入数据

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>