【问题标题】:C# ML predict weird valueC# ML 预测奇怪的值
【发布时间】:2020-07-02 07:47:13
【问题描述】:

我最近对 ​​C# 中的机器学习产生了兴趣。我从 Microsoft 网站下载了示例代码,我想对其进行测试。

代码:

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. Import or create training data
        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. Specify data preparation and model training pipeline
        var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })
            .Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Price", 
       maximumNumberOfIterations: 100));

        // 3. Train model
        var model = pipeline.Fit(trainingData);

        // 4. Make a prediction
        var size = new HouseData() { Size = 400 };
        var price = mlContext.Model.CreatePredictionEngine<HouseData, Prediction>(model).Predict(size);

        Console.WriteLine($"Predicted price for size: {size.Size} is {price.Price}");
    }
}

我修改训练数据(添加更多记录)并尝试在大小为 400 时检查价格值。程序返回奇怪的值,例如:

First run: -5,815702
Second run: 30,172789
Third run: 24,27233

在我看来,程序应该返回数字40是合乎逻辑的。我怎么会犯结果完全不同的错误?

【问题讨论】:

  • 如果您需要确定性输出,请尝试设置seednew MLContext(seed: 0)
  • 请阅读ml标签的描述。

标签: c# machine-learning ml.net


【解决方案1】:

关于不同的结果:

请参阅添加的文档here 关于seed

还有 here 关于特定 SDCA 选项:

为了获得可重现的结果,建议将“Shuffle”设置为 False,将“NumThreads”设置为 1

ML.Net 中的许多操作都是不确定的。您看到这一点是因为您在每次运行程序时都在训练模型,并且由于上面突出显示的因素,训练本身是不确定的。

因此,如果您需要重新训练具有确定性输出的模型,您可以在MLContext 构造函数中设置seed 参数,将Shuffle 设置为false 和@987654329 @到1

通常对于回归等监督学习技术,训练将与预测分开执行,将训练后的模型存储在状态中,以便随后用于多个预测。

关于您的预期值 40:

您似乎期待线性回归的结果。 SdcaRegressionTrainer 与线性回归不同 - 这反映在您看到的结果中。

有关SdcaRegressionTrainer 的更多详细信息,请参阅docs

【讨论】:

  • 我尝试使用seed 并多次运行程序,它返回值aprox 31。关闭,但还不是
  • @Adam 我认为“奇怪”指的是不同的结果。我已经更新了关于预期结果的答案。
猜你喜欢
  • 2017-11-28
  • 2016-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
  • 2016-09-28
  • 2016-01-19
相关资源
最近更新 更多