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是合乎逻辑的。我怎么会犯错误,结果完全不同?
关于不同的结果:
请参阅有关 seed
的 here 文档。
还有关于特定 SDCA 选项的 here:
For reproducible results, it is recommended that one sets 'Shuffle' to False and 'NumThreads' to 1
ML.Net 中的许多操作是不确定的。您看到这个是因为您在每个程序上训练模型 运行 并且训练本身由于上面强调的因素是不确定的。
因此,如果您需要重新训练具有确定性输出的模型,您可以在MLContext
构造函数中设置seed
参数,Shuffle
到 false
和 NumThreads
到 1
.
通常对于诸如回归之类的监督学习技术,训练将与预测分开执行,将训练后的模型存储在状态中,以便随后用于多个预测。
相对于你的期望值40:
您似乎在期待线性回归的结果。 SdcaRegressionTrainer
与线性回归不同 - 这反映在您看到的结果中。
有关 SdcaRegressionTrainer
的更多详细信息,请参阅 docs。
我最近对 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是合乎逻辑的。我怎么会犯错误,结果完全不同?
关于不同的结果:
请参阅有关 seed
的 here 文档。
还有关于特定 SDCA 选项的 here:
For reproducible results, it is recommended that one sets 'Shuffle' to False and 'NumThreads' to 1
ML.Net 中的许多操作是不确定的。您看到这个是因为您在每个程序上训练模型 运行 并且训练本身由于上面强调的因素是不确定的。
因此,如果您需要重新训练具有确定性输出的模型,您可以在MLContext
构造函数中设置seed
参数,Shuffle
到 false
和 NumThreads
到 1
.
通常对于诸如回归之类的监督学习技术,训练将与预测分开执行,将训练后的模型存储在状态中,以便随后用于多个预测。
相对于你的期望值40:
您似乎在期待线性回归的结果。 SdcaRegressionTrainer
与线性回归不同 - 这反映在您看到的结果中。
有关 SdcaRegressionTrainer
的更多详细信息,请参阅 docs。