我最近对C#中的机器学习产生了兴趣。我从微软网站下载了示例代码,并想测试它。
代码:
using System;using Microsoft.ML;using Microsoft.ML.Data;class Program{ public class HouseData { public float Size { get; set; } public float Price { get; set; } } public class Prediction { [ColumnName("Score")] public float Price { get; set; } } static void Main(string[] args) { MLContext mlContext = new MLContext(); // 1. 导入或创建训练数据 HouseData[] houseData = { new HouseData() { Size = 100, Price = 10 }, new HouseData() { Size = 200, Price = 20 }, new HouseData() { Size = 300, Price = 30 }, new HouseData() { Size = 400, Price = 40 }, new HouseData() { Size = 500, Price = 50 }, new HouseData() { Size = 600, Price = 60 }, new HouseData() { Size = 700, Price = 70 }, new HouseData() { Size = 800, Price = 80 } }; IDataView trainingData = mlContext.Data.LoadFromEnumerable(houseData); // 2. 指定数据准备和模型训练管道 var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" }) .Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Price", maximumNumberOfIterations: 100)); // 3. 训练模型 var model = pipeline.Fit(trainingData); // 4. 进行预测 var size = new HouseData() { Size = 400 }; var price = mlContext.Model.CreatePredictionEngine<HouseData, Prediction>(model).Predict(size); Console.WriteLine($"预测大小为 {size.Size} 的价格为 {price.Price}"); }}
我修改了训练数据(增加了一些记录),并尝试检查大小为400时的价格值。程序返回了一些异常值,例如:
第一次运行: -5,815702第二次运行: 30,172789第三次运行: 24,27233
在我看来,程序应该返回40这个数字才合理。为什么结果完全不同,我犯了什么错误?
回答:
关于不同结果的原因:
请查看这里添加的关于seed
的文档。
还有关于具体的SDCA选项,请查看这里:
为了获得可复现的结果,建议将’Shuffle’设置为False,将’NumThreads’设置为1
ML.Net中的许多操作都是非确定性的。你看到这种情况是因为你在每次程序运行时都在训练模型,而训练本身由于上述因素是非确定性的。
因此,如果你需要以确定性输出重新训练模型,你可以在MLContext
构造函数中设置seed
参数,将Shuffle
设置为false
,将NumThreads
设置为1
。
通常,对于像回归这样的监督学习技术,训练将与预测分开进行,将训练好的模型存储在状态中,以供后续多次预测使用。
关于你期望的40值:
看起来你期望的是线性回归的结果。SdcaRegressionTrainer
与线性回归不同——这一点在你看到的结果中反映了出来。
请查看文档以获取关于SdcaRegressionTrainer
的更多详细信息。