ML.NET 经典机器学习实战指南:面向结构化表格数据的确定性建模与部署

发布时间:2026/9/17 23:52:02
ML.NET 经典机器学习实战指南:面向结构化表格数据的确定性建模与部署 ML.NET 经典机器学习实战指南面向结构化表格数据的确定性建模与部署【免费下载链接】skillsRepository for skills to assist AI coding agents with .NET and C#项目地址: https://gitcode.com/GitHub_Trending/skills17/skills本指南围绕 skills17/skills 仓库中dotnet-ai插件的technology-selection技能展开深度解析 classic-ml.md 所定义的 ML.NET 经典机器学习分支。该分支适用于分类、回归、聚类、异常检测与推荐等结构化/表格型任务具有确定性、本地运行、无云端依赖等特征。读完本文你将掌握从 NuGet 包选型、MLContext 可复现建模、TrainTestSplit 留出集评估到PredictionEnginePool线程安全部署的完整技术链路并能依据仓库中的决策树与评估用例判断何时应当拒绝 LLM、改用 ML.NET。一、技术定位何时选择 ML.NET 经典机器学习technology-selection技能的核心价值在于先选对技术再动手实现。其 SKILL.md 中的决策树将任务类型与技术方案一一对应其中结构化/表格型任务分类、回归、聚类、异常检测、推荐明确指向ML.NETMicrosoft.ML理由是确定性固定随机种子、无云端依赖、专为此类任务而设计。任务类型技术方案选择理由结构化/表格型分类、回归、聚类、异常检测、推荐ML.NETMicrosoft.ML确定性固定种子、无云端依赖、专用工具NL 理解、生成、摘要、推理单提示 → 响应无工具基于Microsoft.Extensions.AI的 LLMIChatClient语言能力无需编排智能体多步工具调用、Agent 循环、多智能体基于Microsoft.Extensions.AI的Microsoft.Agents.AI需要编排、工具分发与迭代控制GitHub Copilot 扩展 / 自定义开发工作流 AgentGitHub Copilot SDKGitHub.Copilot.SDK集成 Copilot Agent 运行时生产环境运行预训练/自定义模型ONNX RuntimeMicrosoft.ML.OnnxRuntime硬件加速、格式无关推理本地/离线 LLM 推理OllamaSharp隐私敏感、隔离网络、成本受限需要强调的是该技能有一条关键规则不要对 ML.NET 能处理好的任务表格型分类、回归、聚类使用 LLM——LLM 在这些场景下更慢、成本更高且非确定性。这正是classic-ml.md末尾为这些任务拒绝 LLM指令的来源仓库也在 eval.yaml 中设置了Select ML.NET for tabular churn prediction评估用例明确要求 Agent 在客户流失预测等表格型任务上选择 ML.NET且不得使用 LLM、GPT 或生成式 AI 服务并至少给出一个实质性理由如确定性/可复现性、成本、延迟或对结构化数据的适配性。该分支与同一技能下的其他分支形成互补单提示 → 响应的文本任务走 llm.md多步工具调用走 agentic.md语义搜索与 RAG 走 rag.md预训练模型推理走 onnx.md。若任务同时需要结构化预测与 NL 推理则采用混合方案ML.NET 打分 LLM 解释层因为 ML.NET 可复现LLM 提供解释能力。二、包选型经典机器学习需要引入哪些 NuGet 包classic-ml.md给出了三件套的包配置按需裁剪PackageReference IncludeMicrosoft.ML Version4.* / PackageReference IncludeMicrosoft.ML.AutoML Version0.* / !-- 可选模型自动搜索 -- PackageReference IncludeMicrosoft.Extensions.ML Version4.* / !-- ASP.NET Core 中的 PredictionEnginePool --Microsoft.ML核心包包含MLContext、数据加载LoadFromTextFile、变换Transform、训练器Trainer与评估Evaluate等全部经典机器学习 API。Microsoft.ML.AutoML可选用于自动化的模型搜索与超参数选择对应mlContext.Auto()的用法适合初期探索阶段快速锁定合适的训练器与超参但需要额外引入若手动指定训练器则可不装。Microsoft.Extensions.ML提供PredictionEnginePoolTIn,TOut这一线程安全的预测引擎池是 ML.NET 在 ASP.NET Core 中正确部署形态的标配。它通过 DI 注册支持从文件加载模型FromFile并按需扩容预测引擎。作为对照同技能中 LLM 分支使用Microsoft.Extensions.AI系列包ONNX 推理分支使用Microsoft.ML.OnnxRuntimeRAG 分支使用Microsoft.Extensions.VectorData.Abstractions与Microsoft.Extensions.AI.DataIngestion各分支的包边界清晰不会混淆。三、五大护栏保证可复现、可信、线程安全的硬性要求classic-ml.md将以下五条列为该分支必须遵守的 GuardrailsSKILL.md的Step 2亦将其列为 ML.NET 分支要点评估用例的 rubric 也逐条验证可复现种子Reproducible seed始终以固定种子构造MLContext。new MLContext(seed: 42)保证随机初始化、数据洗牌等环节可复现同一代码在多次运行时产出相同结果——这是与 LLM 非确定性输出最本质的区别之一也是选择 ML.NET 的重要理由。评估用例ml-net-classification-on-tabular-data的 grader 专门校验输出中是否包含new MLContext(seed:。留出集评估Held-out evaluation使用TrainTestSplit划分数据在测试集上评估绝不在训练数据上评估。否则模型在训练集上的分数会被严重高估无法反映真实泛化能力。报告真实指标Report real metrics多分类MulticlassMicroAccuracy、MacroAccuracy、LogLoss二分类BinaryAUC、F1回归RegressionRMSE、R²。每个指标都有明确语义MicroAccuracy 按样本加权平均MacroAccuracy 对各类别等权平均LogLoss 衡量概率预测的校准质量AUC 衡量正负类排序能力F1 平衡精确率与召回率RMSE 反映误差量级R² 表示模型解释的方差比例。线程安全服务Thread-safe serving在 ASP.NET Core 中必须使用PredictionEnginePoolTIn,TOut绝不要使用单例PredictionEngine——后者不是线程安全的。SKILL.md的反模式表也明确将ASP.NET Core 中的PredictionEngine单例列为反模式并重定向到PredictionEnginePoolTIn,TOut。优先 AutoML初始训练器与超参选择优先使用mlContext.Auto()AutoML让框架代为搜索再根据结果收敛到确定性的手动管线。四、最小形态从 CSV 到可部署分类模型的完整代码classic-ml.md给出了一个支持工单Ticket分类的端到端最小实现我们在此基础上补充数据定义、逐行注释与文件组织使其真正可复制运行。4.1 数据与输入/输出类型训练数据tickets.csv采用以下表头结构仓库评估夹具 tickets.csv 即为此格式Subject,Description,Priority,Category Cannot login,I am unable to login to my account,1,Technical Billing error,I was charged twice for my subscription,2,Billing Server down,The API server is returning 500 errors,1,Technical对应的输入行类型TicketRow与输出类型TicketPrediction定义如下public class TicketRow { public string Subject { get; set; } ; public string Description { get; set; } ; public float Priority { get; set; } // 1-3 的数值特征 public string Category { get; set; } ; // 标签Billing / Technical / General } public class TicketPrediction { public string PredictedLabel { get; set; } ; // 多分类时还可暴露各标签概率 // public float[] Score { get; set; } }4.2 训练与评估主流程var mlContext new MLContext(seed: 42); // 护栏 1固定种子保证可复现 // 从 CSV 加载数据带表头逗号分隔 var data mlContext.Data.LoadFromTextFileTicketRow(tickets.csv, hasHeader: true, separatorChar: ,); // 护栏 2留出 20% 作为测试集仅在训练集上 Fit var split mlContext.Data.TrainTestSplit(data, testFraction: 0.2); // 管线文本特征化 特征拼接 SDCA 最大熵多分类训练器 标签映射回 var pipeline mlContext.Transforms.Conversion.MapValueToKey(Label, nameof(TicketRow.Category)) .Append(mlContext.Transforms.Text.FeaturizeText(SubjectF, nameof(TicketRow.Subject))) .Append(mlContext.Transforms.Text.FeaturizeText(DescriptionF, nameof(TicketRow.Description))) .Append(mlContext.Transforms.Concatenate(Features, SubjectF, DescriptionF, nameof(TicketRow.Priority))) .Append(mlContext.MulticlassClassification.Trainers.SdcaMaximumEntropy()) .Append(mlContext.Transforms.Conversion.MapKeyToValue(PredictedLabel)); var model pipeline.Fit(split.TrainSet); // 护栏 3在留出测试集上评估记录真实指标 var metrics mlContext.MulticlassClassification.Evaluate(model.Transform(split.TestSet)); Console.WriteLine($MicroAccuracy: {metrics.MicroAccuracy:F3}); Console.WriteLine($MacroAccuracy: {metrics.MacroAccuracy:F3}); Console.WriteLine($LogLoss: {metrics.LogLoss:F3});逐行拆解这条管线MapValueToKey(Label, nameof(TicketRow.Category))将字符串类别映射为数值键作为标签列此处命名为Label源列是Category。FeaturizeText(SubjectF, nameof(TicketRow.Subject))对文本列做 N-gram/TF-IDF 特征化将自然语言转换为数值向量。Concatenate(Features, SubjectF, DescriptionF, nameof(TicketRow.Priority))把两个文本特征与数值特征Priority拼接为模型输入Features列——注意此处允许混合文本特征化结果与原始数值特征。MulticlassClassification.Trainers.SdcaMaximumEntropy()SDCA随机对偶坐标上升最大熵训练器是多分类场景下快速且常用的选择。MapKeyToValue(PredictedLabel)将模型输出的数值键映射回可读的类别字符串。如果你面对的是二分类如客户流失预测训练器应替换为二分类 Trainer例如mlContext.BinaryClassification.Trainers下的实现并使用BinaryClassification.Evaluate获取AUC与F1回归任务则对应Regression系列的 Trainer 与RMSE/R²指标。评估夹具reject-llm-for-tabular-classification场景customers.csv 数据目录即要求基于Age、Income、Region、PurchaseHistory预测Churned标签属于典型的二分类任务。4.3 训练完成后保存模型为了在 Web 应用中按需加载训练结束后通常将模型与数据模式持久化mlContext.Model.Save(model, split.TrainSet.Schema, ticket-model.zip);schema参数保存训练数据的列结构供后续加载时校验输入避免线上与训练时字段不一致。五、ASP.NET Core 部署PredictionEnginePool 的正确姿势模型训练完成后部署阶段的护栏 4 是关键线程安全。// Program.cs通过 DI 注册预测引擎池从已保存的模型文件加载 builder.Services.AddPredictionEnginePoolTicketRow, TicketPrediction() .FromFile(ticket-model.zip); // 业务代码注入并调用 .Predict(input) public class TicketController(TicketService service) : ControllerBase { [HttpPost(predict)] public ActionResultTicketPrediction Predict([FromBody] TicketRow ticket) Ok(service.Predict(ticket)); } public sealed class TicketService(PredictionEnginePoolTicketRow, TicketPrediction pool) { public TicketPrediction Predict(TicketRow input) pool.Predict(input); // 线程安全从池中取出引擎完成预测 }使用PredictionEnginePoolTIn,TOut而非单例PredictionEngine的原因PredictionEngine内部持有状态、不是线程安全的若注册为单例并在多请求并发下共享会出现数据竞争与错误预测引擎池则维护一组引擎实例按需借用且自带模型轮换模型更新时无需重启应用。评估用例ml-net-classification-on-tabular-data的 rubric 明确要求ASP.NET Core 端点使用PredictionEnginePool——而非单例PredictionEngine。PredictionEnginePool还支持FromUri、FromStream等重载模型来源可以灵活切换为本地文件或远程存储配合IOptionsT承载路径配置即可满足AI/ML 服务通过 DI 注册、配置经IOptionsT读取的技能级要求。六、拒绝 LLM结构化预测的边界与理由classic-ml.md在结尾给出强硬指令为这些任务拒绝 LLM。若被要求用 GPT/LLM 做表格型预测应重定向到 ML.NET并给出三条硬核理由更快faster本地推理无网络往返预测延迟通常在毫秒级更便宜cheaper无按次调用的 token 计费训练一次、无限次零边际成本推理确定性deterministic固定种子 无随机性相同输入恒有相同输出而 LLM 即使 temperature 为 0 输出也可能波动见 llm.md 护栏 7 对非确定性的论述。仓库通过两处评估用例固化这一原则ml-net-classification-on-tabular-data的 rubric 要求对结构化数据任务使用 ML.NET——不使用 LLMreject-llm-for-tabular-classification的 rubric 进一步要求 Agent 明确解释技术选型理由确定性/可复现、成本、延迟、结构化数据适配。SKILL.md的反模式表也收录了用 LLM 做表格分类并重定向到 ML.NET同时将Accord.NET已归档列为应拒绝的库。这意味着当你在生产代码中看到表格预测硬套 GPT 时正确的做法是向用户说明成本与确定性风险并给出 ML.NET 的替代实现。七、验证清单如何判断实现是否达标结合classic-ml.md与 SKILL.md 的 Validation 章节一份合格实现的验收标准如下选型遵循决策树——结构化任务未使用 LLMMLContext设置了固定随机种子new MLContext(seed: ...)使用TrainTestSplit划分数据集并在留出测试集上评估按任务类型报告真实指标多分类MicroAccuracy/MacroAccuracy/LogLoss二分类AUC/F1回归RMSE/R²ASP.NET Core 端点使用PredictionEnginePoolTIn,TOut未使用单例PredictionEngineAI/ML 服务通过 DI 注册配置经IOptionsT读取密钥来自安全来源user-secrets / env / Key Vault实现后完成构建并运行既有测试。这套清单与评估用例的 rubric 一一对应可直接作为代码评审或自动化评估的检查依据。八、延伸阅读技能总纲与决策树SKILL.md同分支参考文档classic-ml.md对照分支LLM 集成 llm.md、Agent 编排 agentic.md、RAG rag.md、ONNX 推理 onnx.md、本地 LLM ollama.md、Copilot 扩展 copilot.md评估用例与夹具technology-selection eval.yaml、TicketClassifier 夹具【免费下载链接】skillsRepository for skills to assist AI coding agents with .NET and C#项目地址: https://gitcode.com/GitHub_Trending/skills17/skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考