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

ML.NET库学习004:ML.NET基础知识复盘

文章目录

  • ML.NET库学习004:ML.NET基础知识复盘
    • 背景
    • 简单的 ML.NET 应用程序
    • 代码工作流
    • 机器学习模型
      • 基础
      • 进阶
    • ML.NET 架构
      • 构建管道
      • 训练模型
      • 使用模型
    • 数据模型和架构
      • 模型部署

ML.NET库学习004:ML.NET基础知识复盘

学了几个小项目,发现好多方法莫名其妙。仔细思索,觉得是没有ML.NET的知识基础,直接上手看代码,先应该整体了解一下概念,再去看代码。

背景

ML.NET 使您能够在联机或脱机方案中将机器学习添加到 .NET 应用程序。借助此功能,您可以使用应用程序可用的数据进行自动预测。机器学习应用程序利用数据中的模式进行预测,而不需要显式编程。ML.NET 的核心是机器学习模型。
在这里插入图片描述

该模型指定了将输入数据转换为预测所需的步骤。借助 ML.NET,您可以通过指定算法来训练自定义模型,也可以导入预先训练的 TensorFlow 和 Open Neural Network Exchange (ONNX) 模型。拥有模型后,您可以将其添加到应用程序中以进行预测。

ML.NET 使用 .NET 在 Windows、Linux 和 macOS 上运行,或使用 .NET Framework 在 Windows 上运行。所有平台都支持 64 位。Windows 支持 32 位,但 TensorFlow、LightGBM 和 ONNX 相关功能除外。下表显示了您可以使用 ML.NET 进行的预测类型的示例。
在这里插入图片描述

简单的 ML.NET 应用程序

以下代码段中的代码演示了最简单的 ML.NET 应用程序。此示例构造一个线性回归模型,以使用房屋大小和价格数据预测房价。

using Microsoft.ML;
using Microsoft.ML.Data;

class Program
{
    public record HouseData
    {
        public float Size { get; set; }
        public float Price { get; set; }
    }

    public record Prediction
    {
        [ColumnName("Score")]
        public float Price { get; set; }
    }

    static void Main(string[] args)
    {
        MLContext mlContext = new();

        // 1. Import or create training data.
        HouseData[] houseData = [
                new() { Size = 1.1F, Price = 1.2F },
                new() { Size = 1.9F, Price = 2.3F },
                new() { Size = 2.8F, Price = 3.0F },
                new() { Size = 3.4F, Price = 3.7F }
                ];
        IDataView trainingData = mlContext.Data.LoadFromEnumerable(houseData);

        // 2. Specify data preparation and model training pipeline.
        EstimatorChain<RegressionPredictionTransformer<Microsoft.ML.Trainers.LinearRegressionModelParameters>> pipeline = mlContext.Transforms.Concatenate("Features", ["Size"])
            .Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Price", maximumNumberOfIterations: 100));

        // 3. Train model.
        TransformerChain<RegressionPredictionTransformer<Microsoft.ML.Trainers.LinearRegressionModelParameters>> model = pipeline.Fit(trainingData);

        // 4. Make a prediction.
        HouseData size = new() { Size = 2.5F };
        Prediction price = mlContext.Model.CreatePredictionEngine<HouseData, Prediction>(model).Predict(size);

        Console.WriteLine($"Predicted price for size: {size.Size * 1000} sq ft = {price.Price * 100:C}k");

        // Predicted price for size: 2500 sq ft = $261.98k
    }
}

代码工作流

下图展示了应用程序代码结构和模型开发的迭代过程:
收集训练数据并将其加载到 IDataView 对象中
指定作管道以提取特征并应用机器学习算法
通过在管道上调用 Fit(IDataView) 来训练模型
评估模型并迭代以改进
将模型保存为二进制格式,以便在应用程序中使用
将模型加载回 ITransformer 对象
通过调用 PredictionEngineBase<TSrc,TDst> 进行预测。
在这里插入图片描述

机器学习模型

ML.NET 模型是一个对象,其中包含要对输入数据执行的转换,以得出预测的输出。

基础

最基本的模型是二维线性回归,其中一个连续量与另一个连续量成正比,如前面所示的房价示例所示。
在这里插入图片描述

模型很简单:Price=b+Size∗w.参数b和w通过在一组 (size, price) 对上拟合一条线来估计。用于查找模型参数的数据称为训练数据。机器学习模型的输入称为特征。在此示例中,Size是唯一的功能。用于训练机器学习模型的 ground-truth 值称为标签。在这里,Pr我ce训练数据集中的值是标签。

进阶

更复杂的模型使用交易文本描述将金融交易分类为多个类别。通过删除冗余的单词和字符,并计算单词和字符的组合,每个交易描述都分解为一组特征。该特征集用于根据训练数据中的类别集训练线性模型。
新描述与训练集中的描述越相似,就越有可能将其分配到同一类别。

在这里插入图片描述在这里插入图片描述

房屋价格模型和文本分类模型都是线性模型。根据数据的性质和要解决的问题,您还可以使用决策树模型、广义加法模型等。您可以在 Tasks 中找到有关模型的更多信息。

ML.NET 架构

本节介绍 ML.NET 的架构模式。如果您是一位经验丰富的 .NET 开发人员,则其中一些模式对您来说可能很熟悉,而另一些则不太熟悉。
ML.NET 应用程序以 MLContext 对象开头。此 singleton 对象包含 catalogs。目录是用于数据加载和保存、转换、训练器和模型作组件的工厂。每个目录对象都有用于创建不同类型元件的方法。

在这里插入图片描述

您可以导航到列出的每个类别中的创建方法。如果使用 Visual Studio,则目录也会通过 IntelliSense 显示。
在这里插入图片描述

构建管道

每个目录中都有一组可用于创建训练管道的扩展方法。

var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })
    .Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Price", maximumNumberOfIterations: 100));

在代码段中,和 都是目录中的方法。它们各自创建一个附加到管道的 IEstimator 对象。ConcatenateSdca此时,对象已创建,但尚未执行。

训练模型

创建管道中的对象后,可以使用数据来训练模型。

var model = pipeline.Fit(trainingData);

Calling 使用输入的训练数据来估计模型的参数。这称为训练模型。请记住,前面显示的线性回归模型有两个模型参数:bias 和 weight。调用后,参数的值是已知的。(大多数模型的参数比这多得多。Fit()Fit()
您可以在如何训练模型中了解有关模型训练的更多信息。
生成的模型对象实现 ITransformer 接口。也就是说,该模型将输入数据转换为预测。

IDataView predictions = model.Transform(inputData);

使用模型

您可以将输入数据批量转换为预测,也可以一次转换一个输入。房价示例同时执行了两项作:批量评估模型,一次一个进行新的预测。让我们看看如何进行单个预测。

var size = new HouseData() { Size = 2.5F };
var predEngine = mlContext.CreatePredictionEngine<HouseData, Prediction>(model);
var price = predEngine.Predict(size);

该方法采用一个 input 类和一个 output 类。字段名称或代码属性确定模型训练和预测期间使用的数据列的名称。有关更多信息,请参阅使用经过训练的模型进行预测。CreatePredictionEngine()

数据模型和架构

ML.NET机器学习管道的核心是 DataView 对象。
管道中的每个转换都有一个输入架构(转换希望在其输入上看到的数据名称、类型和大小);和输出架构(转换后生成的数据名称、类型和大小)。如果管道中一个转换的输出架构与下一个转换的输入架构不匹配,ML.NET 将引发异常。数据视图对象包含列和行。
每列都有一个名称、一个类型和一个长度。例如,房价示例中的输入列是 Size 和 Price。
它们都是 Single 类型,并且它们是标量而不是向量。
在这里插入图片描述

所有 ML.NET 算法都查找作为向量的输入列。默认情况下,此向量列称为 Features。这就是房价示例将 Size 列连接到名为 Features 的新列的原因。

var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })

所有算法在执行预测后还会创建新列。这些新列的固定名称取决于机器学习算法的类型。对于回归任务,其中一个新列称为 Score,如 price data 属性中所示。

public class Prediction
{
    [ColumnName("Score")]
    public float Price { get; set; }
}

您可以在 Machine Learning Tasks 指南中找到有关不同机器学习任务的输出列的更多信息。DataView 对象的一个重要属性是它们被延迟计算。数据视图仅在模型训练和评估以及数据预测期间加载和作。在编写和测试 ML.NET 应用程序时,可以使用 Visual Studio 调试器通过调用 Preview 方法查看任何数据视图对象。

var debug = testPriceDataView.Preview();

模型部署

在实际应用程序中,您的模型训练和评估代码将与预测分开。事实上,这两项活动通常由不同的团队执行。您的模型开发团队可以保存模型以在预测应用程序中使用。

mlContext.Model.Save(model, trainingData.Schema, "model.zip");

http://www.kler.cn/a/539070.html

相关文章:

  • 操作系统知识速记:虚拟内存
  • 处理数据及其选择关键列进行一次聚类
  • 存储系统、网盘系统的访问留痕
  • 开源项目介绍-词云生成
  • 腾讯云TI平台×DeepSeek:开启AI超强体验,解锁部署秘籍
  • leetcode刷题日记 1
  • 202406 青少年软件编程等级考试C/C++ 三级真题答案及解析(电子学会)
  • 测试文章内容1
  • 如何写出优秀的单元测试?
  • 跟着李沐老师学习深度学习(二)
  • Jetbrains IDE http客户端使用教程
  • Unet 改进:引入残差模块ResidualBlock
  • 《qt easy3d中添加Delaunay-2d重建》
  • 使用Python进行数据采集与解析!
  • 小结:NAT
  • YouBIP 项目
  • C# 比较两个List集合内容是否相同
  • 国产编辑器EverEdit - 查找下一个单词与查找上一个单词
  • 软件工程-分析建模
  • DeepSeek 提示工程:解锁 AI 对话的六维超能力
  • 34.日常算法
  • Windows系统中常用的命令
  • 构建高效Facebook广告矩阵:精准营销与广告投放的全新策略
  • OHOS(HarmonyOS) 编译 C/C++ 库
  • 使用Termux和Ollama在Android设备上构建与运行AI模型
  • 本地部署DeepSeek方法记录