ML.NET MakePredictionFunction динамический тип? - PullRequest
0 голосов
/ 18 декабря 2018

Я могу динамически обучать и создавать свою регрессионную модель очень хорошо из 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-запросов, поэтому ручная ввод каждого столбца не является подходящим подходом в будущем.

Можно ли как-нибудь применить атрибут во время выполнения?Или каким-то другим способом я могу в общих чертах подойти к этой ситуации?Спасибо!

1 Ответ

0 голосов
/ 18 декабря 2018

Это отличный вопрос.Объекты dynamic не работают во время выполнения, поскольку для ML.NET требуется нечто, называемое SchemaDefinition, для объектов, которые вы передаете, чтобы он знал, где получить ожидаемые столбцы.

Самый простой способчтобы решить вашу проблему, нужно определить объект, содержащий только те столбцы, которые вам нужны во время оценки, помеченные Column атрибутами, и вручную привести динамический объект во время выполнения.Это имеет главное преимущество в том, что, поскольку вы выполняете приведение к объекту скоринга самостоятельно, вы можете самостоятельно обрабатывать пропущенные случаи данных без выброса во время выполнения ML.NET.Хотя ваш SQL-запрос может дать вам большой ассортимент столбцов, вам не понадобится большинство этих столбцов для оценки вашей модели, и поэтому нет необходимости учитывать их в объекте оценки;Вы должны учитывать только те столбцы, которые ожидает модель.

См. этот пример из ML.NET Cookbook для примера того, как забить одну строку.За кулисами ML.NET берет определенный вами класс и использует атрибуты, такие как Column, для создания SchemaDefinition.

...