在R中保存LightGBM模型并在C#中加载的格式兼容问题
解决R训练模型与C#加载的格式兼容问题
方案1:使用微软官方microsoftml包导出ML.NET兼容的Zip模型
这个方案最直接,microsoftml是微软专为R与ML.NET互操作设计的包,导出的Zip模型可直接被C#的ML.NET加载。
R端代码(训练并导出模型)
# 安装依赖包 install.packages("microsoftml") library(microsoftml) # 示例训练数据 train_data <- data.frame( feature1 = c(1.2, 3.1, 5.4, 2.7, 4.3), target = c(2.5, 6.3, 11.0, 5.5, 8.7) ) # 训练线性回归模型(可替换为rxLogisticRegression等其他支持模型) trained_model <- rxLinReg(target ~ feature1, data = train_data) # 导出为ML.NET兼容的Zip格式 rxSaveModel(trained_model, "mlnet_compatible_model.zip", overwrite = TRUE)
C#端代码(加载模型并预测)
using Microsoft.ML; using Microsoft.ML.Data; // 定义模型输入输出类 public class ModelInput { [LoadColumn(0)] public float feature1 { get; set; } } public class ModelOutput { [ColumnName("Score")] public float PredictedTarget { get; set; } } class Program { static void Main(string[] args) { var mlContext = new MLContext(); // 加载R导出的Zip模型 var loadedModel = mlContext.Model.Load("mlnet_compatible_model.zip", out var inputSchema); // 创建预测引擎 var predictor = mlContext.Model.CreatePredictionEngine<ModelInput, ModelOutput>(loadedModel); // 测试预测 var testInput = new ModelInput { feature1 = 6.0f }; var predictionResult = predictor.Predict(testInput); System.Console.WriteLine($"预测结果:{predictionResult.PredictedTarget}"); } }
方案2:将R模型转换为ONNX格式(适配非microsoftml模型)
如果你的模型是用caret、xgboost等第三方R库训练的,可将模型转换为ONNX通用格式,再用C#的ONNX Runtime或ML.NET加载。
R端代码(转换为ONNX)
以XGBoost模型为例:
install.packages(c("xgboost", "onnx")) library(xgboost) library(onnx) # 准备训练数据 train_matrix <- as.matrix(data.frame(feature1 = c(1.2, 3.1, 5.4, 2.7, 4.3))) train_label <- c(2.5, 6.3, 11.0, 5.5, 8.7) dtrain <- xgb.DMatrix(train_matrix, label = train_label) # 训练XGBoost模型 xgb_model <- xgb.train(data = dtrain, nrounds = 15, objective = "reg:squarederror") # 转换为ONNX格式(input_shape需匹配输入特征维度) save_model_to_onnx(xgb_model, "model.onnx", input_shape = list(c(1L, 1L)))
C#端代码(用ONNX Runtime加载预测)
using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; class Program { static void Main(string[] args) { // 初始化ONNX推理会话 using var session = new InferenceSession("model.onnx"); // 构造输入张量(维度需与ONNX模型定义一致) var inputTensor = new DenseTensor<float>(new float[] {6.0f}, new int[] {1, 1}); var inputData = new List<NamedOnnxValue> { NamedOnnxValue.CreateFromTensor("input", inputTensor) }; // 执行预测 using var outputResults = session.Run(inputData); var predictedValue = outputResults.First().AsTensor<float>()[0]; System.Console.WriteLine($"预测结果:{predictedValue}"); } }
内容的提问来源于stack exchange,提问作者Peter Stephensen
相关产品推荐
相关产品推荐

