0

我能够从string[]列名中动态训练和创建我的回归模型。但是,当我尝试传入具有与 Dictionary Key Pair 属性相同的参数名称的动态对象时,它会引发错误:

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 查询自动生成的列,因此手动键入每一列对于未来来说不是一种可行的方法。

有什么办法可以在运行时应用该属性吗?或者任何其他方式我可以一般地处理这种情况?谢谢!

4

1 回答 1

1

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

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

有关如何对单行评分的示例,请参阅 ML.NET Cookbook 中的此示例在幕后,使用你定义的类,并使用属性来构造.ML.NETColumnSchemaDefinition

于 2018-12-18T18:07:22.750 回答