logo

第 19 章:开发一个机器学习应用

作者
Modified on
Reading time
4 分钟阅读:..评论:..

机器学习基础

在开始我们的实际开发之前,首先要了解一些机器学习的基本概念。机器学习是一种通过数据来训练模型,从而使计算机能够在没有明确编程的情况下进行预测或决策的技术。

机器学习的基本流程

  1. 数据收集:获取用于训练模型的数据。
  2. 数据准备:清理和预处理数据,使其适合用于模型训练。
  3. 模型选择:选择适合的机器学习算法。
  4. 模型训练:使用训练数据来训练模型。
  5. 模型评估:评估模型的性能。
  6. 模型部署:将模型应用到实际场景中。

数据准备和预处理

数据是机器学习的基础。我们需要对数据进行预处理,以确保其质量和适用性。常见的数据预处理步骤包括数据清洗、特征选择和特征工程。

数据清洗

数据清洗是去除数据中的噪音和不完整信息的过程。常见的数据清洗操作包括:

  • 处理缺失值
  • 移除重复数据
  • 处理异常值
// 示例代码:处理缺失值 DataTable data = new DataTable(); // 填充数据 // ... // 处理缺失值 foreach (DataRow row in data.Rows) { foreach (DataColumn column in data.Columns) { if (row.IsNull(column)) { row[column] = GetDefaultValueForColumn(column); } } }

特征选择和特征工程

特征选择是选择对模型训练有用的特征,特征工程是对特征进行转换以提升模型性能。常见的特征工程操作包括归一化、标准化、编码等。

// 示例代码:归一化 foreach (DataColumn column in data.Columns) { if (column.DataType == typeof(double)) { double min = (double)data.Compute($"MIN([{column.ColumnName}])", string.Empty); double max = (double)data.Compute($"MAX([{column.ColumnName}])", string.Empty); foreach (DataRow row in data.Rows) { row[column] = ((double)row[column] - min) / (max - min); } } }

模型训练和评估

在数据准备好之后,我们可以选择一个合适的机器学习算法来训练模型。C# 中有多种机器学习库,如 ML.NET,可以简化模型训练和评估的过程。

使用 ML.NET 进行模型训练

ML.NET 是一个开源的跨平台机器学习框架,适用于 .NET 应用程序。下面是一个简单的示例,展示如何使用 ML.NET 进行模型训练。

using Microsoft.ML; using Microsoft.ML.Data; // 定义数据模型 public class HousingData { [LoadColumn(0)] public float Size { get; set; } [LoadColumn(1)] public float Price { get; set; } } public class HousingPrediction { [ColumnName("Score")] public float Price { get; set; } } // 创建 MLContext var mlContext = new MLContext(); // 加载数据 IDataView dataView = mlContext.Data.LoadFromTextFile<HousingData>("housing.csv", separatorChar: ',', hasHeader: true); // 数据拆分 var trainTestSplit = mlContext.Data.TrainTestSplit(dataView, testFraction: 0.2); var trainingData = trainTestSplit.TrainSet; var testData = trainTestSplit.TestSet; // 定义数据处理和训练管道 var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" }) .Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Price", maximumNumberOfIterations: 100)); // 训练模型 var model = pipeline.Fit(trainingData); // 评估模型 var predictions = model.Transform(testData); var metrics = mlContext.Regression.Evaluate(predictions, labelColumnName: "Price"); Console.WriteLine($"R²: {metrics.RSquared}"); Console.WriteLine($"MAE: {metrics.MeanAbsoluteError}");

模型评估

模型评估是衡量模型性能的重要步骤。常见的评估指标包括均方误差(MSE)、平均绝对误差(MAE)和决定系数(R²)。

模型的使用和部署

一旦我们对模型的性能感到满意,就可以将其部署到实际应用中。模型部署可以是将模型嵌入到现有应用程序中,或者通过 API 提供模型预测服务。

使用模型进行预测

// 加载模型 var loadedModel = mlContext.Model.Load("model.zip", out var modelInputSchema); // 创建预测引擎 var predictionEngine = mlContext.Model.CreatePredictionEngine<HousingData, HousingPrediction>(loadedModel); // 使用模型进行预测 var newData = new HousingData { Size = 2.5f }; var prediction = predictionEngine.Predict(newData); Console.WriteLine($"Predicted Price: {prediction.Price}");

模型部署

模型部署涉及将模型集成到生产环境中。常见的方法包括:

  1. 嵌入到应用程序:将模型嵌入到现有的桌面或 Web 应用程序中。
  2. 通过 API 提供服务:创建一个 Web API 来提供模型预测服务。
// 示例代码:通过 ASP.NET Core 创建模型预测 API [ApiController] [Route("api/[controller]")] public class PredictionsController : ControllerBase { private readonly PredictionEngine<HousingData, HousingPrediction> _predictionEngine; public PredictionsController(PredictionEngine<HousingData, HousingPrediction> predictionEngine) { _predictionEngine = predictionEngine; } [HttpPost] public ActionResult<HousingPrediction> Predict(HousingData data) { var prediction = _predictionEngine.Predict(data); return Ok(prediction); } }

通过这些步骤,我们可以在 C# 中开发并部署一个完整的机器学习应用。从数据准备、模型训练到模型部署,每一步都至关重要,确保模型的准确性和实用性。