【问题标题】:ML.NET MakePredictionFunction dynamic type?ML.NET MakePredictionFunction 动态类型?
【发布时间】: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


【解决方案1】:

这是一个很好的问题。 dynamic 对象在运行时不起作用,因为 ML.NET 需要一个名为 SchemaDefinition 的东西来存储您传入的对象,以便它知道从哪里获取它期望的列。

解决您的问题的最简单方法是定义一个对象,该对象仅包含您在评分时需要的列,使用Column 属性进行注释,并在运行时手动转换您的动态对象。这样做的主要优点是,由于您自己对评分对象进行强制转换,因此您可以自己处理丢失的数据情况,而无需 ML.NET 运行时抛出。虽然您的 SQL 查询可能会为您提供各种各样的列,但您不需要这些列中的大部分来为您的模型评分,因此不需要在评分对象中考虑它们;您只需考虑模型期望的列。

请参阅ML.NET Cookbook 中的this sample,了解如何对单行进行评分的示例。在幕后,ML.NET 使用您定义的类,并使用像 Column 这样的属性来构造 SchemaDefinition

【讨论】:

    猜你喜欢
    • 2020-09-02
    • 2021-08-31
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    相关资源
    最近更新 更多