使用经过训练的模型进行预测
了解如何使用经过训练的模型进行预测
创建数据模型
输入数据
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; }
}
输出数据
与 Features
和 Label
输入列名一样,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
方法应用于每个元素。
此代码示例假设你有一个名为 predictionEnginePool
的 PredictionEnginePool 和一个名为 housingData
的 IEnumerable<HousingData>
。
IEnumerable<HousingPrediction> predictions = housingData.Select(input => predictionEnginePool.Predict(input));
结果是一个包含预测实例的 IEnumerable
。 在本例中,该值为 IEnumerable<HousingPrediction>
。