C# ML 预测异常值

我最近对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的更多详细信息。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注