【发布时间】:2018-12-18 16:50:03
【问题描述】:
我能够从string[] 的列名很好地动态训练和创建我的回归模型。但是,当我尝试传入具有与字典键对属性相同的参数名称的动态对象时,它会引发错误:
System.ArgumentOutOfRangeException: 'Could not find input column '<MyColumn>'' 其中<MyColumn> 是模型要查找的第一个参数。
private static void TestSinglePrediction(MLContext mlContext, dynamic ratingDataSample, int actual)
{
ITransformer loadedModel;
using (var stream = new FileStream(_modelPath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
loadedModel = mlContext.Model.Load(stream);
}
var predictionFunction = loadedModel.MakePredictionFunction<dynamic, RatingPrediction>(mlContext);
var prediction = predictionFunction.Predict(ratingDataSample);
Console.WriteLine($"**********************************************************************");
Console.WriteLine($"Predicted rating: {prediction.Rating:0.####}, actual rating: {actual}");
Console.WriteLine($"**********************************************************************");
}
我怀疑这是因为动态对象不包含我通常传入的标准类对象所具有的[Column] 属性。
但是,我最终将拥有数百个通过转置 SQL 查询自动生成的列,因此手动键入每一列在未来不是可行的方法。
有什么方法可以在运行时应用该属性吗?或者任何其他方式我可以一般地处理这种情况?谢谢!
【问题讨论】:
-
我在 ML.NET 上提交了一个问题,以允许这种运行时类型的预测:github.com/dotnet/machinelearning/issues/1907。我不认为我们可以通过
dynamic使其工作:这将是一种不同的机制,实现起来稍微困难 -
如果您使用 Roslyn 在运行时创建类,就可以做到这一点。有关此问题的解决方案,请参阅我对另一个问题的回答:stackoverflow.com/questions/66893993/…
标签: c# machine-learning ml.net