C# ML 预测奇怪的值

C# ML predict weird value

我最近对 ​​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 时检查价格值。程序 return 奇怪的值,示例:

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

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

关于不同的结果:

请参阅有关 seedhere 文档。

还有关于特定 SDCA 选项的 here

For reproducible results, it is recommended that one sets 'Shuffle' to False and 'NumThreads' to 1

ML.Net 中的许多操作是不确定的。您看到这个是因为您在每个程序上训练模型 运行 并且训练本身由于上面强调的因素是不确定的。

因此,如果您需要重新训练具有确定性输出的模型,您可以在MLContext构造函数中设置seed参数,ShufflefalseNumThreads1.

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

相对于你的期望值40:

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

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