學習ML.NET(2): 使用模型進行預測

學習ML.NET(2): 使用模型進行預測

來自專欄編程與讀書

訓練模型

在上一篇文章中,我們已經通過LearningPipeline訓練好了一個「鳶尾花瓣預測」模型,

var model = pipeline.Train<IrisData, IrisPrediction>();

現在就可以讓模型對一條沒有人工標註結果的數據進行分析,返回一個預測結果。

var prediction = model.Predict(new IrisData() { SepalLength = 3.3f, SepalWidth = 1.6f, PetalLength = 0.2f, PetalWidth = 5.1f, }); Console.WriteLine($"Predicted flower type is: {prediction.PredictedLabels}");

或者一次預測一批數據

var inputs = new[]{ new IrisData() { SepalLength = 3.3f, SepalWidth = 1.6f, PetalLength = 0.2f, PetalWidth = 5.1f, } ,new IrisData() { SepalLength = 5.2f, SepalWidth = 3.5f, PetalLength = 1.5f, PetalWidth = 0.2f, } };var predictions = model.Predict(inputs);

保存模型

但是大多數時候,已經訓練好的模型以後還需要繼續可以使用,因此需要把它持久化,寫入到zip文件中。

await model.WriteAsync("IrisPredictionModel.zip");

使用模型

一旦建立了機器學習模型,就可以部署它,利用它進行預測。我們可以通過REST API,接受來自客戶端的數據輸入,並返回預測結果。

  • 創建API項目

dotnet new webapi -o myApi

  • 安裝依賴項

cd myApidotnet add package Microsoft.MLdotnet restore

  • 引用模型

要在API中引用我們前面保存的模型,只需將IrisPredictionModel.zip複製到API項目目錄中即可。

  • 創建數據結構

我們的模型使用數據結構IrisData和IrisPrediction來定義特徵和預測屬性。因此,當使用我們的模型通過API進行預測時,它也需要引用這些數據結構。因此,我們需要在API項目中定義IrisData和IrisPrediction。類的內容與上一篇文章中創建模型項目中的內容相同。

using Microsoft.ML.Runtime.Api;namespace myApi{ public class IrisData { [Column("0")] public float SepalLength; [Column("1")] public float SepalWidth; [Column("2")] public float PetalLength; [Column("3")] public float PetalWidth; [Column("4")] [ColumnName("Label")] public string Label; }}

using Microsoft.ML.Runtime.Api;namespace myApi{ public class IrisPrediction { [ColumnName("PredictedLabel")] public string PredictedLabels; }}

  • 創建Controller

現在,在API項目的Controllers目錄中,創建PredictController類,用於處理來自客戶端的預測請求,它包含一個POST方法

using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using Microsoft.AspNetCore.Mvc;using Microsoft.ML;namespace myApi.Controllers{ [Route("api/[controller]")] [ApiController] public class PredictController : ControllerBase { // POST api/predict [HttpPost] public async Task<string> Post([FromBody] IrisData value) { var model = await PredictionModel.ReadAsync<IrisData,IrisPrediction>("IrisPredictionModel.zip"); var prediction = model.Predict(value); return prediction.PredictedLabels; } }}

  • 測試API

使用如下命令行運行程序:

dotnet run

然後,使用POSTMAN或其他工具向http://localhost:5000/api/predict發送POST請求,請求數據類似:

{ "SepalLength": 3.3, "SepalWidth": 1.6, "PetalLength": 0.2, "PetalWidth": 5.1,}

如果成功,將會返回"Iris-virginica"。

推薦閱讀:

TAG:模型 | 科技 | 機器學習 |