ML.NET 快速入门与实践教程:开源机器学习框架

简介: 码农刚子带你轻松入门ML.NET!微软开源的.NET专属机器学习框架,无需Python基础,用C#即可完成数据加载、模型训练、评估与预测。本文以成绩预测为案例,详解核心概念与全流程,并附房价预测拓展实践,助你快速上手智能应用开发。

千淘万漉虽辛苦,吹尽狂沙始到金。嗨,大家好!我是码农刚子。今天和大家聊一聊ML.NET 如何快速入门。
ML.NET 是微软为 .NET 开发者量身打造的机器学习框架,让你无需离开熟悉的 C# 环境,就能将智能功能集成到应用中。本文将从一个简单的成绩预测案例入手,逐步带你掌握数据加载、模型训练、评估和预测的全流程,后面有时间还会介绍能大幅提升效率的 Model Builder 可视化工具。
ML.NET 快速入门与实践教程

ML.NET 简介与环境搭建

什么是 ML.NET?

ML.NET 是一个免费的、开源的、跨平台的机器学习框架,专为 .NET 开发者设计 。它允许你在 .NET 应用程序(C# 或 F#)中构建、训练和部署自定义机器学习模型,而无需具备深厚的 Python 或 R 语言机器学习专业知识 。无论是 .NET Core、.NET 5/8 还是 .NET Framework,ML.NET 都能完美支持 。

安装 ML.NET

在你开始编码之前,需要先安装 ML.NET NuGet 包。你可以通过 Visual Studio 的 NuGet 包管理器,或使用 .NET CLI 命令行工具来安装:
dotnet add package Microsoft.ML
除了核心库,根据你的任务场景,可能还需要其他包,比如用于数据操作的Microsoft.ML.DataView或包含特定算法的。

核心概念:理解 ML.NET 的工作流程

使用 ML.NET 构建机器学习模型遵循一个标准化的流程,理解这些核心概念是入门的关键。

  • MLContext:一切操作的起点。它像一个“上下文”或“工厂”,提供了数据加载、模型训练、模型评估等所有 API 的入口 。你可以把它想象成 DbContext 之于 EF Core。
  • IDataView:ML.NET 的核心数据抽象。它不是一个简单的内存集合,而是一个灵活、高效的表格数据表示形式,用于数据加载、转换和训练。你可以从 CSV、SQL 数据库或内存集合中创建它 。
  • 数据处理管道:在训练模型之前,原始数据通常需要进行清洗、转换和特征工程。ML.NET 允许你将一系列的数据转换操作(如连接特征、处理缺失值、文本向量化)组合成一个管道。
  • 训练器 (Trainer):即机器学习算法。ML.NET 内置了丰富的训练器,用于解决回归、分类、聚类、异常检测等不同任务。
  • 模型 (ITransformer):数据管道和训练器组合在一起,对数据“拟合”后生成的产物。这个模型可以被保存、加载,并用于对新数据进行预测 。
  • 预测引擎 (PredictionEngine):模型训练好后,你需要使用 CreatePredictionEngine 创建一个预测引擎,它接收单个输入数据对象,并输出预测结果 。

下图清晰地展示了从数据到最终预测的完整流程:
最终预测的完整流程

  1. 准备数据源(CSV, txt, 数据库等)
  2. MLContext.Create() 加载数据至 IDataView
  3. 定义数据处理管道(特征提取, 连接, 转换等)
  4. 追加训练器(如 Sdca 回归)
  5. 在训练数据上调用 Fit 方法
  6. 得到训练完成的模型(ITransformer)
  7. 保存模型为:Model.zip
  8. 创建 PredictionEngine 用于单次预测
  9. 输入新数据,然后输出预测结果

实践案例:学生考试成绩预测(回归)

让我们通过一个最简单的例子——根据学习时长预测考试成绩,来动手实践 ML.NET 的整个工作流。这是经典的回归任务,即预测一个连续的数值 。

1. 准备数据

首先,创建一个名为 data.csv 的文件,内容如下:

StudyHours,Score
1,50
2,60
3,65
4,70
5,75

2. 定义数据类

在你的 C# 项目中,定义两个类来映射数据和预测结果 。

using Microsoft.ML.Data;

// 用于加载输入数据
public class StudentData
{
    [LoadColumn(0)] // 指定在数据文件中的列索引
    public float StudyHours { get; set; }

    [LoadColumn(1)]
    public float Score { get; set; } // 这是标签(Label),即我们要预测的值
}

// 用于存储预测结果
public class StudentPrediction
{
    [ColumnName("Score")] // 指定输出列的名称,需与模型输出的列名一致
    public float PredictedScore { get; set; }
}

3. 构建、训练并评估模型

现在,在 Program.cs 中编写核心逻辑 。

using Microsoft.ML;

// 1. 初始化 MLContext
var mlContext = new MLContext(seed: 0); // 设置随机种子以确保结果可重现

// 2. 加载数据
string dataPath = "data.csv";
var data = mlContext.Data.LoadFromTextFile<StudentData>(dataPath, separatorChar: ',', hasHeader: true);

// 3. 分割数据集为训练集和测试集
var trainTestSplit = mlContext.Data.TrainTestSplit(data, testFraction: 0.2);
var trainData = trainTestSplit.TrainSet; // 用于训练的数据
var testData = trainTestSplit.TestSet;   // 用于评估的数据

// 4. 构建数据处理和训练管道
//    - Concatenate: 将所有特征列(这里是 StudyHours)合并到一个名为 "Features" 的列中,这是 ML.NET 的默认输入列名
//    - Append: 追加一个回归训练器(SDCA 算法)
var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "StudyHours" })
    .Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Score", maximumNumberOfIterations: 100));

// 5. 在训练集上训练模型
var model = pipeline.Fit(trainData);

// 6. 在测试集上评估模型性能
var predictions = model.Transform(testData);
var metrics = mlContext.Regression.Evaluate(predictions, labelColumnName: "Score", scoreColumnName: "Score");

// 7. 输出评估指标
Console.WriteLine($"模型评估指标:");
Console.WriteLine($"  R^2: {metrics.RSquared:F2}"); // 决定系数,越接近1越好
Console.WriteLine($"  平均绝对误差: {metrics.MeanAbsoluteError:F2}");
Console.WriteLine($"  均方根误差: {metrics.RootMeanSquaredError:F2}");

// 8. 使用模型进行单次预测
var predictionEngine = mlContext.Model.CreatePredictionEngine<StudentData, StudentPrediction>(model);
var newStudent = new StudentData { StudyHours = 6 };
var predictedScore = predictionEngine.Predict(newStudent);

Console.WriteLine($"\n预测结果:");
Console.WriteLine($"如果学习 {newStudent.StudyHours} 小时,预测成绩为 {predictedScore.PredictedScore:F2}");

4. 运行与结果

运行你的应用程序,你将看到类似下面的输出:

模型评估指标:
  R^2: 0.92
  平均绝对误差: 1.25
  均方根误差: 1.58

预测结果:
如果学习 6 小时,预测成绩为 80.45

恭喜!你已经成功构建并训练了你的第一个 ML.NET 模型。
还有类似的模型可以自己去尝试练习:房价预测,和以上示例相同逻辑,代码非常的简单。

// 1. 定义数据模型:输入特征(用来预测的变量)和输出标签(要预测的结果)
// 房价的影响因素:面积、卧室数量、浴室数量
using Microsoft.ML;
using Microsoft.ML.Data;

public class HouseData
{
    [LoadColumn(0)] // 对应数据文件的第1列(面积)
    public float Size { get; set; }

    [LoadColumn(1)] // 对应数据文件的第2列(卧室数量)
    public float Bedrooms { get; set; }

    [LoadColumn(2)] // 对应数据文件的第3列(浴室数量)
    public float Bathrooms { get; set; }

    [LoadColumn(3)] // 对应数据文件的第4列(房价,标签)
    public float Price { get; set; }
}

// 2. 定义预测结果模型:只包含要预测的标签
public class HousePricePrediction
{
    [ColumnName("Score")] // Score是ML.NET默认的预测结果列名
    public float PredictedPrice { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        // 3. 创建ML.NET环境(类似数据库连接,是所有操作的基础)
        var mlContext = new MLContext();

        // 4. 准备训练数据(实际项目中可以从Excel、数据库读取,这里用模拟数据)
        var trainingData = new List<HouseData>
        {
            new HouseData { Size = 1400, Bedrooms = 3, Bathrooms = 2, Price = 250000 },
            new HouseData { Size = 1600, Bedrooms = 4, Bathrooms = 2.5f, Price = 300000 },
            new HouseData { Size = 1200, Bedrooms = 2, Bathrooms = 1.5f, Price = 200000 },
            new HouseData { Size = 1800, Bedrooms = 4, Bathrooms = 3, Price = 350000 },
            new HouseData { Size = 2000, Bedrooms = 5, Bathrooms = 3.5f, Price = 400000 },
            // 实际训练需要更多数据,这里只是示例
        };

        // 5. 将数据转换成ML.NET能处理的IDataView
        IDataView dataView = mlContext.Data.LoadFromEnumerable(trainingData);

        // 6. 定义训练管道:数据处理→特征工程→模型算法
        var pipeline = mlContext.Transforms.Concatenate("Features", nameof(HouseData.Size), nameof(HouseData.Bedrooms), nameof(HouseData.Bathrooms))
            // 特征归一化:让不同量级的特征(比如面积1000+,卧室数2-5)统一范围,提高模型精度
            .Append(mlContext.Transforms.NormalizeMinMax("Features"))
            // 选择回归算法(房价预测是连续值,用回归),这里用SDCA算法(ML.NET推荐的高效算法)
            .Append(mlContext.Regression.Trainers.Sdca(labelColumnName: nameof(HouseData.Price), featureColumnName: "Features"));

        // 7. 训练模型(核心步骤,相当于让模型“学习”数据规律)
        Console.WriteLine("开始训练模型...");
        var model = pipeline.Fit(dataView);
        Console.WriteLine("模型训练完成!");

        // 8. 用训练好的模型做预测(测试数据:面积1500,3卧室,2浴室)
        var predictionEngine = mlContext.Model.CreatePredictionEngine<HouseData, HousePricePrediction>(model);
        var testHouse = new HouseData { Size = 1500, Bedrooms = 3, Bathrooms = 2 };
        var prediction = predictionEngine.Predict(testHouse);

        // 9. 输出预测结果
        Console.WriteLine($"预测房价:{prediction.PredictedPrice:C}");
    }
}

ML.NET 快速入门与实践教程:开源机器学习框架

看完本文有收获?请转发分享给更多人

相关文章
|
6月前
|
人工智能 程序员 API
OpenClaw现象级爆红,AI智能体的“事实标准”如何改变我们的开发方式?
码农刚子,C#程序员,聚焦.NET生态与AI智能体融合。本文解析现象级开源项目OpenClaw(GitHub星标22.8万+)如何赋能C#开发者:通过API集成、C#技能开发、构建.NET专属智能体三条路径,让强类型语言深度参与AI智能体浪潮。
452 3
|
JavaScript
vue element plus DateTimePicker 日期时间选择器
vue element plus DateTimePicker 日期时间选择器
1163 0
|
前端开发
layui在上传图片在前端处理图片压缩
layui在上传图片在前端处理图片压缩
556 0
【Vite】Vite设置好了Proxy,但接口却404!解决方案来了!
前言 最近在做一个Vue3+Vite+TypeScript的项目,进行一番网上冲浪后,参考了众多🐴友的方案,配置完vite.config.ts准备开始与后端的同学开始联调,发现无论怎么样都是404,然后就开始了一步步的排查!
6857 0
|
6月前
|
前端开发 JavaScript API
.NET 权限系统(RBAC)怎么设计?直接可复用
本文基于RBAC模型,详解.NET Core + Vue权限系统实战:涵盖SQL Server数据库设计、JWT认证与动态权限校验、菜单/按钮级前端控制,提供开箱即用方案,助你快速构建安全、可维护的企业级权限体系。(239字)
514 3
|
10月前
|
开发框架 JavaScript 前端开发
ASP.NET Core Blazor 核心功能三:Blazor与JavaScript互操作——让Web开发更灵活
码农刚子带你深入Blazor与JavaScript互操作,掌握IJSRuntime调用、双向通信及集成Chart.js等实战技巧,提升Web开发灵活性。
323 7
ASP.NET Core Blazor 核心功能三:Blazor与JavaScript互操作——让Web开发更灵活
|
8月前
|
JSON 算法 API
淘宝商品列表 API 使用指南
淘宝商品列表API(taobao.items.search)支持按关键词、价格、销量等条件检索商品,返回商品ID、标题、价格等结构化数据,适用于比价、市场分析。需注册开放平台、获取AppKey/AppSecret并实名认证。接口限100次/秒,建议先测沙箱。请求含基础参数与筛选条件,签名通过MD5加密生成。
|
11月前
|
开发框架 前端开发 .NET
最新ASP.NET Core Blazor简介和快速入门一(基础篇)
大家好,我是码农刚子。本篇文章介绍了ASP.NET Core Blazor的简介和基础语法。Blazor是微软推出的基于.NET的Web框架,支持C#构建交互式前端,无需JavaScript。提供Server、WebAssembly和Hybrid三种托管模式,分别适用于实时通信、离线运行与跨平台原生应用开发,实现全栈C#开发体验。
601 1
最新ASP.NET Core Blazor简介和快速入门一(基础篇)
|
11月前
|
开发框架 .NET C#
ASP.NET Core Blazor 路由配置和导航
大家好,我是码农刚子。本文系统介绍Blazor单页应用的路由机制,涵盖基础配置、路由参数、编程式导航及高级功能。通过@page指令定义路由,支持参数约束、可选参数与通配符捕获,结合NavigationManager实现页面跳转与参数传递,并演示用户管理、产品展示等典型场景,全面掌握Blazor路由从入门到实战的完整方案。
743 6