本项目使用ML.NET构建一个预测性维护系统,通过机器学习模型预测设备故障风险。
C#dotnet add package Microsoft.ML

`1. 初始化模型参数
此数据集包含模拟数据,表示对各种工业设备(包括涡轮机、压缩机和泵)的实时监控。数据集中的每一行都对应于一个捕获关键参数(如温度、压力、振动和湿度)的唯一观测值。该数据集还包括有关设备类型、位置以及设备是否被分类为故障的信息。

C#using Microsoft.ML.Data;
namespace App14
{
public class EquipmentData
{
[LoadColumn(0)]
public float Temperature { get; set; }
[LoadColumn(1)]
public float Pressure { get; set; }
[LoadColumn(2)]
public float Vibration { get; set; }
[LoadColumn(3)]
public float Humidity { get; set; }
[LoadColumn(4)]
public string Equipment { get; set; }
[LoadColumn(5)]
public string Location { get; set; }
[LoadColumn(6)]
public float Faulty { get; set; }
}
}
C#using Microsoft.ML.Data;
namespace App14
{
// 预测模型
public class Prediction
{
[ColumnName("PredictedLabel")]
public bool IsFaulty { get; set; }
public float Probability { get; set; }
}
}
C#using Microsoft.ML;
using System.Reflection;
namespace App14
{
internal class Program
{
static void Main(string[] args)
{
var mlContext = new MLContext(seed: 0);
string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "equipment_anomaly_data.csv");
// 创建 MLContext
var context = new MLContext();
// 读取 CSV 文件
IDataView dataView = context.Data.LoadFromTextFile<EquipmentData>(_dataPath, separatorChar: ',', hasHeader: true);
// 数据预处理
var pipeline = mlContext.Transforms.Conversion.MapValue("Faulty",
new Dictionary<float, bool> {
{ 0.0f, false },
{ 1.0f, true }
})
.Append(mlContext.Transforms.Categorical.OneHotEncoding("Equipment"))
.Append(mlContext.Transforms.Categorical.OneHotEncoding("Location"))
.Append(mlContext.Transforms.NormalizeMinMax("NormalizedTemperature", "Temperature"))
.Append(mlContext.Transforms.NormalizeMinMax("NormalizedPressure", "Pressure"))
.Append(mlContext.Transforms.NormalizeMinMax("NormalizedVibration", "Vibration"))
.Append(mlContext.Transforms.NormalizeMinMax("NormalizedHumidity", "Humidity"))
.Append(mlContext.Transforms.Concatenate("Features",
"Temperature", "Pressure", "Vibration", "Humidity",
"Equipment", "Location"));// 关键步骤:创建特征列
// 定义学习算法
var trainer = mlContext.BinaryClassification.Trainers
.SdcaLogisticRegression(labelColumnName: "Faulty", maximumNumberOfIterations: 100);
// 创建训练管道
var trainingPipeline = pipeline.Append(trainer);
// 训练模型
var model = trainingPipeline.Fit(dataView);
// 进行预测
var predictions = model.Transform(dataView);
var metrics = mlContext.BinaryClassification.Evaluate(predictions, labelColumnName: "Faulty");
// 输出评估指标
Console.WriteLine($"准确率: {metrics.Accuracy}");
Console.WriteLine($"AUC: {metrics.AreaUnderRocCurve}");
Console.WriteLine($"F1 Score: {metrics.F1Score}");
// 预测示例
var sampleData = new EquipmentData()
{
Temperature = 75,
Pressure = 30,
Vibration = 1,
Humidity = 55,
Equipment = "Compressor",
Location = "Chicago"
};
var predEngine = mlContext.Model.CreatePredictionEngine<EquipmentData, Prediction>(model);
var predictionResult = predEngine.Predict(sampleData);
Console.WriteLine($"预测设备故障: {predictionResult.IsFaulty}");
}
}
}

C#// 数据预处理管道详细解析
var pipeline = mlContext.Transforms.Conversion.MapValue("Faulty",
new Dictionary<float, bool> {
// 将数值型的故障标签转换为布尔类型
// 0.0f 映射为 false(正常)
// 1.0f 映射为 true(故障)
{ 0.0f, false },
{ 1.0f, true }
})
// 对类别型特征进行one-hot编码
// 将分类变量转换为机器学习算法可以处理的数值特征
.Append(mlContext.Transforms.Categorical.OneHotEncoding("Equipment"))
.Append(mlContext.Transforms.Categorical.OneHotEncoding("Location"))
// 对数值型特征进行最小-最大归一化
// 将特征缩放到 [0,1] 区间,消除量纲差异,避免某些特征主导学习过程
.Append(mlContext.Transforms.NormalizeMinMax("NormalizedTemperature", "Temperature"))
.Append(mlContext.Transforms.NormalizeMinMax("NormalizedPressure", "Pressure"))
.Append(mlContext.Transforms.NormalizeMinMax("NormalizedVibration", "Vibration"))
.Append(mlContext.Transforms.NormalizeMinMax("NormalizedHumidity", "Humidity"))
// 将所有特征合并到一个特征向量中
// 机器学习算法通常需要一个统一的特征列进行训练
.Append(mlContext.Transforms.Concatenate("Features",
"Temperature", "Pressure", "Vibration", "Humidity",
"Equipment", "Location"));
MapValue("Faulty")
NormalizeMinMax
X_normalized = (X - X_min) / (X_max - X_min)Concatenate("Features")
这个示例展示了如何使用ML.NET构建一个简单的预测性维护模型。你可以根据实际数据集的特征和需求,调整模型和参数以提高预测性能。如果你有任何问题或需要进一步的帮助,请随时问我!
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!