当前位置: 首页 > news >正文

ML.Net 学习之使用经过训练的模型进行预测

什么是ML.Net:(学习文档上摘的一段:ML.NET 文档 - 教程和 API 参考 | Microsoft Learn 【学习入口】)

它使你能够在联机或脱机场景中将机器学习添加到 .NET 应用程序中。 借助此功能,可以使用应用程序的可用数据进行自动预测。 机器学习应用程序利用数据中的模式来进行预测,而不需要进行显式编程

ML.NET 的核心是机器学习模型 。 该模型指定将输入数据转换为预测所需的步骤。 借助 ML.NET,可以通过指定算法来训练自定义模型,也可以导入预训练的 TensorFlow 和 ONNX 模型。

拥有模型后,可以将其添加到应用程序中进行预测。

说明:我已经用.cli工具生成好模型了,现在需要用训练模型生成预测数据。我需要用多线程的方式来预测,查看文档后大概有以下几种预测方式

(1)单一预测,使用PredictionEngine

//定义的输入数据的类

 ModelInput inputData = new ModelInput()
 {
     Stock_cd = @"s_600803",
     Stock_subject = @"油气开采;甲醇;蜱虫;天然气;并购重组;沪港通概念;油价上调;海藻炼油;融资融券;转融券标的",
     Stock_block = @"994392,992046",
     Stati_date = @"2013/1/14",
     IsNewStock = @"否",
     Stock_capital = 9857851F,
     Price = 11.922F,
     Volume = 14950900F,
     Orders = -1043.7F,
     Transaction = -3330F,
 };


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

 // Load Trained Model  StockHolderPrediction.mlnet是已经训练好的模型
 string filepath = Path.Combine(Environment.CurrentDirectory, "StockHolderPrediction.mlnet");
 DataViewSchema predictionPipelineSchema;
 ITransformer predictionPipeline = mlContext.Model.Load(filepath, out predictionPipelineSchema);
 PredictionEngine<ModelInput, ModelOutput> predictionEngine = mlContext.Model.CreatePredictionEngine<ModelInput, ModelOutput>(predictionPipeline);

 ModelOutput prediction = predictionEngine.Predict(inputData);

PredictionEngine 不是线程安全。 此外,必须在应用程序中的每一处所需位置创建它的实例。 随着应用程序的增长,此过程可能会变得难以管理。为了提高性能和线程安全,请结合使用依赖项注入和 PredictionEnginePool 服务

(2)单一预测,使用PredictionEnginePool

 ModelInput inputData = new ModelInput()
 {
     Stock_cd = @"s_600803",
     Stock_subject = @"油气开采;甲醇;蜱虫;天然气;并购重组;沪港通概念;油价上调;海藻炼油;融资融券;转融券标的",
     Stock_block = @"994392,992046",
     Stati_date = @"2013/1/14",
     IsNewStock = @"否",
     Stock_capital = 9857851F,
     Price = 11.922F,
     Volume = 14950900F,
     Orders = -1043.7F,
     Transaction = -3330F,
 };


 //Make Prediction
 ModelOutput prediction = _predictionEnginePool.Predict(modelName: "StockHolderPrediction", example: inputData);

说明:上面这句之前我是这样写的:ModelOutput prediction = _predictionEnginePool.Predict(inputData);一直报错:You need to configure a default, not named, model before you use this method.

网上资料少,为了找这问题花好长时间

(3)多个预测,使用PredictionEnginePool

 List<ModelInput> inputDataList = new List<ModelInput>();
 inputDataList.Add(new ModelInput()
 {
     Stock_cd = @"s_600803",
     Stock_subject = @"油气开采;甲醇;蜱虫;天然气;并购重组;沪港通概念;油价上调;海藻炼油;融资融券;转融券标的",
     Stock_block = @"994392,992046",
     Stati_date = @"2013/1/14",
     IsNewStock = @"否",
     Stock_capital = 9857851F,
     Price = 11.922F,
     Volume = 14950900F,
     Orders = -1043.7F,
     Transaction = -3330F,
 });


 IEnumerable<ModelOutput> predictions = inputDataList.Select(input => _predictionEnginePool.Predict(modelName: "StockHolderPrediction", example: input));

 foreach (ModelOutput model in predictions)
 {

 }

可以用这个方法,预测一组(多个)。

(4)多个预测采用,IDataView

 List<ModelInput> inputDataList = new List<ModelInput>();
 inputDataList.Add(new ModelInput()
 {
     Stock_cd = @"s_600803",
     Stock_subject = @"油气开采;甲醇;蜱虫;天然气;并购重组;沪港通概念;油价上调;海藻炼油;融资融券;转融券标的",
     Stock_block = @"994392,992046",
     Stati_date = @"2013/1/14",
     IsNewStock = @"否",
     Stock_capital = 9857851F,
     Price = 11.922F,
     Volume = 14950900F,
     Orders = -1043.7F,
     Transaction = -3330F,
 });


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

 // Load Trained Model
 string filepath = Path.Combine(Environment.CurrentDirectory, "StockHolderPrediction.mlnet");
 DataViewSchema predictionPipelineSchema;
 ITransformer predictionPipeline = mlContext.Model.Load(filepath, out predictionPipelineSchema);

 // Predicted Data
 IDataView inputDataView = mlContext.Data.LoadFromEnumerable(inputDataList);
 IDataView predictions = predictionPipeline.Transform(inputDataView);

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

经测试,这几种方式都能预测出结果,下一步,我需要比较哪一种方法用在多线程中比较好。

说明:我创建的是一个ASP.NET Core Web 应用(visual studio 2022)

需要注入PredictionEnginePool

说明:本文是经过学习摸索后写的总结性文章,难免遗漏。主要是备忘。不喜勿喷!

http://www.lryc.cn/news/404795.html

相关文章:

  • 为什么 centos 下使用 tree 命令看不见 .env 文件
  • 数据库基础与性能概述及相关术语
  • docker基于外部缓存加速构建方案
  • 【C语言】 作业11 链表+实现函数封装
  • 【Ubuntu】Ubuntu20修改MAC地址
  • ClickHouse集成LDAP实现简单的用户认证
  • C语言-预处理详解
  • 计算机网络-VLAN间通信(三层通信)模拟实现
  • 【JAVA】数据类型及变量
  • 微软蓝屏事件暴露的网络安全问题
  • 11 - FFmpeg - 编码 AAC
  • OS Copilot初体验的感受与心得
  • Ajax学习笔记
  • 医学深度学习与机器学习融合的随想
  • 坑人的macos tar 命令 (实际上是bsdtar)换用 gnu tar
  • 【SpringBoot3】全局异常处理
  • vue-Treeselect
  • 【机器学习框架TensorFlow和PyTorch】基本使用指南
  • matlab 中的methods(Access = protected) 是什么意思
  • 【漏洞复现】Netgear WN604 downloadFile.php 信息泄露漏洞(CVE-2024-6646)
  • 图像处理 -- ISP调优(tuning)的步骤整理
  • 【中项】系统集成项目管理工程师-第4章 信息系统架构-4.2系统架构
  • node.js中nodemon : 无法加载和使用问题,这是由于windows安全策略影起的按如下操作即可
  • 【SD】 Stable Diffusion(SD)原理详解与ComfyUI使用 2
  • 【学习笔记】无人机系统(UAS)的连接、识别和跟踪(七)-广播远程识别码(Broadcast Remote ID)
  • VMware 虚拟机 ping 不通原因排查
  • websocket状态机
  • JCR一区级 | Matlab实现CPO-Transformer-LSTM多变量回归预测【2024新算法】
  • 力扣3226 使两个整数相等的位更改次数
  • VLAN 划分案例详解