ML.NET 教程 - 10 分钟入门
介绍
目标
在 Visual Studio 中使用 ML.NET Model Builder 来训练和使用你的首个机器学习模型。
安装 ML.NET CLI,然后使用 ML.NET 训练并使用第一个机器学习模型。
先决条件
无。
macOS 12.0 或更高版本。
完成时间
10分钟 + 下载/安装时间
方案
可以预测客户评论的文本是负面还是正面情绪的应用。
下载并安装
下载并安装 Visual Studio 2022。
在安装过程中,应选择 .NET 桌面开发工作负载以及可选的 ML.NET Model Builder 组件。使用上面的链接时应预先正确选择所有先决条件,如下图所示:
已有 Visual Studio 2022?
如果已有 Visual Studio 2022,请确保它处于最新状态,并且已安装所需的工作负载:
- 选择 Windows 徽标键,键入 Visual Studio 安装程序,然后按“输入”。
- 如果出现提示,则请允许安装程序进行自我更新。
- 如果 Visual Studio 2022 的更新可用,则将显示“更新”按钮。选择它以在修改安装之前进行更新。我们建议在本教程中使用最新的 Visual Studio 2022 版本。
- 找到 Visual Studio 2022 安装并选择 修改。
- 选择 .NET 桌面开发 并确保已在右窗格中选择 ML.NET Model Builder。请选择 修改 按钮。
升级到最新版本的 Model Builder
在 Visual Studio中启用 ML.NET Model Builder 后,下载并安装最新版本。
下载后,请双击 .vsix 文件来安装扩展。
检查 Visual Studio 更新
本教程针对最新版本的 Visual Studio 进行了优化。如果已有 Visual Studio 2022,则可以检查更新:
- 选择 Windows 徽标键,键入 Visual Studio 安装程序,然后按“输入”。
- 如果出现提示,则请允许安装程序进行自我更新。
- 如果有可用的更新,则 Visual Studio 2022 安装将具有 更新 按钮。请选择该按钮以进行更新。
安装 .NET SDK
要生成 .NET 应用,需要下载并安装 .NET 8 SDK (软件开发工具包)。
下载 .NET 8 SDK x64 (Intel)
下载 .NET 8 SDK Arm64 (Apple Silicon)
如果使用的是带有 Apple M1 或 M2 芯片的 Mac,则需要安装 Arm64 版本的 SDK。
安装 ML.NET CLI
ML.NET 命令行接口(CLI),提供用于通过 ML.NET 构建机器学习模型的工具。
注意:目前,ML.NET CLI 处于预览阶段,仅支持最新 LTS 版本的 .NET SDK (.NET 8)。
对于安装步骤,建议使用 Bash 控制台。由于 macOS 的默认值为 zsh 控制台,因此可通过打开新终端并运行下面的命令来创建单个实例。
bash
对于 x64 计算机 - 运行以下命令:
dotnet tool install -g mlnet-linux-x64
对于 ARM64 芯片体系结构 - 改为运行以下命令:
dotnet tool install -g mlnet-linux-arm64
如果工具成功安装,应会看到以下输出消息,其中 [arch]
是芯片体系结构:
You can invoke the tool using the following command: mlnet
Tool 'mlnet-linux-[arch]' (version 'X.X.X') was successfully installed.
dotnet tool install -g mlnet-osx-x64
对于 ARM64 芯片体系结构 - 改为运行以下命令:
dotnet tool install -g mlnet-osx-arm64
如果工具成功安装,则应会看到输出消息,其中 [arch]
是类似于以下内容的芯片体系结构:
You can invoke the tool using the following command: mlnet
Tool 'mlnet-osx-[arch]' (version 'X.X.X') was successfully installed.
注意: 如果正在使用非 Bash 的控制台(例如,zsh - macOS 的新默认设置),则需要授予 mlnet
可执行权限并将mlnet
包含在系统路径中。安装 mlnet (或任何全局工具)时,终端中应显示如何执行此操作的说明。通常,以下命令应适用于大多数系统: chmod +x [PATH-TO-MLNET-CLI-EXECUTABLE]
如果看到与下述类似的说明,请在终端中运行它们。
cat << \EOF >> ~/.zprofile
#Add .NET Core SDK tools
export PATH="$PATH:~/.dotnet/tools"
EOF
或者,可以尝试使用以下命令运行 mlnet 工具:
~/.dotnet/tools/mlnet
如果运行该命令仍出现错误,请使用下面的“我遇到了问题”按钮报告问题并获取解决问题的帮助。
创建应用
打开 Visual Studio 并新建 .NET 控制台应用:
- 从 Visual Studio 2022 开始窗口中选择 新建项目。
- 选择 C# 控制台应用 项目模板。
- 将项目名称更改为
myMLApp
。 - 确保不选中将解决方案和项目置于同一目录中。
- 选择“下一步”按钮。
- 选择 .NET 8.0 (长期支持) 作为 Framework。
- 选择“创建”按钮。Visual Studio 将创建项目并加载
Program.cs
文件。
添加机器学习
右击 解决方案资源管理器 中的
myMLApp
项目,并选择 添加 > 机器学习模型。- 在“添加新项目”对话框中,确保选中“机器学习模型(ML.NET)”。
将“名称”字段更改为
SentimentModel.mbconfig
,然后选择“添加”按钮。
一个名为 SentimentModel.mbconfig
的新文件将添加到你的解决方案中,并且 Model Builder UI 将在 Visual Studio 的新停靠工具窗口中打开。mbconfig 文件只是一个 JSON 文件,用于跟踪 UI 的状态。
Model Builder 将通过以下步骤指导你完成构建机器学习模型的过程。
在终端中,运行以下命令:
mkdir myMLApp
cd myMLApp
mkdir
命令会创建名为 myMLApp
的新目录命令,cd myMLApp
命令会将你放入新创建的应用目录中。
将在接下来的步骤中生成模型训练代码。
选取方案
若要生成模型,首先需要选择机器学习场景。Model Builder 支持多种场景:
注意:如果教程截图与你看到的内容不符,则可能需要更新 Model Builder 的版本。转到扩展 > 管理扩展,确保 Model Builder 没有可用的更新。本教程使用的版本是 17.18.2。
在这种情况下,将根据客户评价的内容(文字)预测情绪。
-
在“Model Builder 方案”屏幕中,选择数据分类 方案,因为要预测注释属于哪个类别(正或负)。
-
在选择 数据分类方案后,必须选择训练环境。虽然一些方案支持在 Azure 中进行训练,但“分类”目前仅支持本地训练,因此,请保持选择 本地 环境,并继续执行 数据 步骤。
要生成模型,需要选择机器学习方案。
ML.NET CLI 支持多种 ML 场景:
- 分类 - 如果要预测数据属于哪一类别(例如,分析客户评价的情绪是正面的还是负面的),请使用此功能。
- 图像分类 - 需要预测图像属于哪个类别时,请使用此项 (例如,预测图像是猫还是狗)
- 回归(例如,值预测) - 如果想要预测数值,请使用此值(例如,预测房价)。
- 预测–如果要预测时序中的未来值(例如预测季度销售额),请使用此方法。
- 建议–如果要根据历史分级(例如产品建议)向用户推荐项目,请使用此选项。
在这种情况下,你将根据客户评价的内容(文字)来预测情绪,因此你将使用“分类”。
下载并添加数据
下载 UCI 机器学习存储库中的带情绪标签的句子数据集。解压缩 sentiment labelled sentences.zip
并保存 yelp_labelled.txt
文件到 myMLApp
目录。
你的解决方案资源管理器应如下所示:
yelp_labelled.txt
中的每一行代表用户在 Yelp 上对餐厅的不同评论。第一列代表用户留下的评论,第二列代表文本的情绪(0 为负面,1 为正面)。这些列由制表符分隔,并且数据集没有标头。数据如下所示:
Wow... Loved this place. 1
Crust is not good. 0
Not tasty and the texture was just nasty. 0
添加数据
在 Model Builder 中,可以从本地文件添加数据或连接到 SQL Server 数据库。这次你将从文件添加 yelp_labelled.txt
。
选择 文件 作为输入数据源类型。
浏览
yelp_labelled.txt
。选择数据集后,数据预览会显示在 数据预览 部分中。由于数据集没有标头,因此将自动生成标头("col0" 和 "col1")。在“预测列 (标签)”下,选择 "col1"。“标签”是预测内容,在本例中是在数据集的第二列 ("col1") 中发现的情绪。
用于帮助预测标签的列称为“特征”。除“标签”外,数据集中的所有列都将自动选择为“特征”。在这种情况下,审阅评论列(“col0”)是特征列。可以在“高级数据选项”中更新特征列并修改其他数据加载选项,但在本示例中不是必需的。
添加数据后,请转到“训练”步骤。
训练模型
现在,将使用 yelp_labelled.txt
数据集来训练模型。
Model Builder 会根据生成性能最佳模型给定的定型时间,评估多个具有不同算法和设置的模型。
将“训练时间”(即希望 Model Builder 探索各种模型的时间)更改为 60 秒(如果训练后未发现模型,则可以尝试增加此数字)。请注意,对于较大的数据集,训练时间会更长。Model Builder 会根据数据集大小自动调整训练时间。
可更新高级训练选项中使用的优化指标和算法,但在此示例中不必要。
选择开始训练以开始训练过程。训练开始后,可以看到剩余时间。
训练结果
完成训练后,你可以查看训练结果摘要。
- 最佳 MacroAccuracy - 这将向你展示 Model Builder 找到的最佳模型的准确性。准确性越高意味着模型对于测试数据的预测越正确。
- 最佳模型 - 这将显示在 Model Builder 探索期间表现最佳的算法。
- 训练时间 - 显示训练/探索模型所花费的总时间量。
- 已浏览的模型(总计) - 这将显示 Model Builder 在给定时间内浏览的模型总数。
- 生成的代码隐藏 - 这显示为帮助使用模型或训练新模型而生成的文件的名称。
如果需要,可以在“机器学习输出”窗口中查看有关定型会话的详细信息。
模型训练完成后,转到评估步骤。
在终端中,运行以下命令(在 myMLApp
文件夹中):
mlnet classification --dataset "yelp_labelled.txt" --label-col 1 --has-header false --name SentimentModel --train-time 60
这些命令分别代表什么?
mlnet classification
命令使用 AutoML 运行 ML.NET,在给定的训练时间内,通过数据转换、算法和算法选项的不同组合,探索分类模型的多次迭代,然后选择性能最高的模型。
- --dataset: 你选择了
yelp_labelled.txt
作为数据集(在内部,CLI 会将一个数据集拆分为定型数据集和测试数据集)。 - --label-col: 必须指定要预测的目标列(或标签)。这种情况下,需要预测第二列中的情绪(零索引列代表这是列 "1")。
- --has-header: 使用此选项指定数据集是否具有标头。在这种情况下,数据集没有标头,因此它是 false。
- --name: 使用此选项可为机器学习模型和相关资产提供名称。在这种情况下,与此机器学习模型关联的所有资产的名称都具有 SentimentModel。
- --train-time: 还必须指定希望 ML.NET CLI 浏览不同模型的时间量。在这种情况下为 60 秒(如果训练后未找到模型,则可以尝试增加此数字)。请注意,对于较大的数据集,应设置更长的训练时间。
进度
当 ML.NET CLI 探索不同的模型时,将会显示以下数据:
- 开始训练 - 本部分显示每次模型迭代,包括使用的训练器(算法)和该迭代的评估指标。
- 剩余时间 - 此项和进度栏将指示训练过程还剩多少时间(以秒为单位)。
- 最佳算法–这将向你显示到目前为止执行最佳的算法。
- 最佳分数 - 这将向你展示到目前为止最佳模型的性能。准确度越高意味着模型对测试数据的预测更准确。
如果需要,可以在 CLI 生成的日志文件中查看有关训练会话的详细信息。
评估模型
评估步骤显示性能最佳的算法以及最佳准确度,并让你在 UI 中尝试相应模型。
立即试用模型
可以在“试用模型”部分对样本输入进行预测。文本框中预先填充了数据集的第一行数据,但你可以更改输入并选择“预测”按钮来尝试不同的情绪预测。
在这种情况下,0 表示负面情绪,1 表示正面情绪。
注意: 如果模型性能不佳(例如,如果“准确度”低或模型仅预测 '1' 值),则可以尝试添加更多时间并再次训练。这是使用极小数据集的示例;对于生产级模型,需要添加更多的数据和训练时间。
在评估和试用模型后,继续执行“使用”步骤。
ML.NET CLI 选择最佳模型后,将会显示“训练摘要”,其中显示了探索过程的摘要,包括在给定的训练时间内探索的模型数量。
热门模型
ML.NET CLI 为性能最高的模型生成代码的同时,还会在给定的探索时间内,以最高精度显示顶层模型(最多 5 个)。它会显示这些顶部模型的多个评估指标,包括 AUC、AUPRC 和 F1 分数。如需获取更多信息,请参阅 ML.NET 指标。
生成代码
训练完成后,4 个文件将作为代码隐藏自动添加到 SentimentModel.mbconfig
中:
SentimentModel.consumption.cs
: 此文件包含模型输入和输出类以及可用于模型消耗的Predict
方法。SentimentModel.evaluate.cs
: 此文件包含CalculatePFI
方法,该方法使用排列特征重要性(PFI)技术来评估哪些特征对模型预测贡献最大。SentimentModel.mlnet
: 该文件是经过训练的 ML.NET 模型,它是一个序列化的 zip 文件。SentimentModel.training.cs
: 此文件包含用于了解输入列对模型预测的重要性的代码。
在 Model Builder 的 Consume 步骤中,提供了一个代码片段,用于为模型创建样本输入并使用模型对该输入进行预测。
Model Builder 还提供了项目模板,可以选择将其添加到解决方案中。有两个项目模板(一个控制台应用和一个 Web API)使用经过训练的模型。
ML.NET CLI 添加了机器学习模型以及用于训练和使用模型的代码,其中包括以下内容:
-
已创建名为 SentimentModel 的新目录,它包含 .NET 控制台应用,此应用包括以下文件:
Program.cs
: 此文件包含用于运行模型的代码。SentimentModel.consumption.cs
: 此文件包含模型输入和输出类以及可用于模型消耗的Predict
方法。SentimentModel.mbconfig
: 此文件是一个 JSON 文件,用于跟踪训练中的配置和结果。SentimentModel.training.cs
: 此文件包含用于训练最终模型的训练管道(数据转换、算法和算法参数)。SentimentModel.zip
: 该文件是经过训练的 ML.NET 模型,它是一个序列化的 zip 文件。
若要尝试该模型,可以运行控制台应用来使用模型预测单个语句的情绪。
使用模型
最后一步是在最终用户应用程序中使用经过训练的模型。
-
将
myMLApp
项目中的Program.cs
代码替换为以下代码:Program.csusing MyMLApp; // Add input data var sampleData = new SentimentModel.ModelInput() { Col0 = "This restaurant was wonderful." }; // Load model and predict output of sample data var result = SentimentModel.Predict(sampleData); // If Prediction is 1, sentiment is "Positive"; otherwise, sentiment is "Negative" var sentiment = result.PredictedLabel == 1 ? "Positive" : "Negative"; Console.WriteLine($"Text: {sampleData.Col0}\nSentiment: {sentiment}");
-
运行
myMLApp
(选择“Ctrl+F5”或“调试”>“在不调试的情况下启动”)。应看到以下输出,内容为预测输入语句是正的还是负的。
ML.NET CLI 生成了经过训练的模型和代码,因此现在可以按照以下步骤在 .NET 应用程序(例如,SentimentModel
控制台应用)中使用该模型:
- 在命令行中,导航到
consumeModelApp
目录。Terminalcd SentimentModel
-
在任何代码编辑器中打开
Program.cs
然后检查代码。代码应如下所示:Program.csusing System; namespace SentimentModel.ConsoleApp { class Program { static void Main(string[] args) { // Add input data SentimentModel.ModelInput sampleData = new SentimentModel.ModelInput() { Col0 = @"Wow... Loved this place." }; // Make a single prediction on the sample data and print results var predictionResult = SentimentModel.Predict(sampleData); Console.WriteLine("Using model to make single prediction -- Comparing actual Col1 with predicted Col1 from sample data...\n\n"); Console.WriteLine($"Col0: @{"Wow... Loved this place."}"); Console.WriteLine($"Col1: {1F}"); Console.WriteLine($"\n\nPredicted Col1: {predictionResult.PredictedLabel}\n\n"); Console.WriteLine("=============== End of process, hit any key to finish ==============="); Console.ReadKey(); } } }
-
运行
SentimentModel.ConsoleApp
。可以通过在终端中运行以下命令来执行此操作(请确保你位于SentimentModel
中):Terminaldotnet run
输出应如下所示:
TerminalUsing model to make single prediction -- Comparing actual Col1 with predicted Col1 from sample data... Col0: Wow... Loved this place. Col1: 1 Class Score ----- ----- 1 0.9651076 0 0.034892436 =============== End of process, hit any key to finish ===============
后续步骤
恭喜,你已使用 ML.NET Model Builder 构建了首个机器学习模型!
现在你已经掌握了基础知识,请在 Microsoft Learn 上使用自助学习模块继续学习,你将使用传感器数据来检测制造设备是否已损坏。
ML.NET 初学者
Luis 将为你介绍机器学习和 AI 的概念,解释可以使用它做什么,并指导你开始使用 OpenAI、Azure AI 服务和 ML.NET:
你可能还会关注...
恭喜,你已使用 ML.NET CLI 构建了首个机器学习模型!
使用 ML.NET CLI 进行分类(尤其是情绪分析)后,可以尝试其他方案。使用出租车费用数据集试用回归方案(尤其是价格预测),以继续使用 ML.NET CLI 构建 ML.NET 模型。
ML.NET 初学者
Luis 将为你介绍机器学习和 AI 的概念,解释可以使用它做什么,并指导你开始使用 OpenAI、Azure AI 服务和 ML.NET:
你可能还会关注...