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");