Динамическое построение цепочки конвейеров

#c# #ml.net

#c# #ml.net

Вопрос:

Используя код, взятый из этого примера.

Этот код работает:

 var pipeline = mlContext.Transforms.CopyColumns(outputColumnName: "Label", inputColumnName: "FareAmount")
            .Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "VendorIdEncoded", inputColumnName: "VendorId"))
            .Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "RateCodeEncoded", inputColumnName: "RateCode"))
            .Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "PaymentTypeEncoded", inputColumnName: "PaymentType"))
            .Append(mlContext.Transforms.Concatenate("Features", "VendorIdEncoded", "RateCodeEncoded", "PassengerCount", "TripTime", "TripDistance", "PaymentTypeEncoded"))
            .Append(mlContext.Regression.Trainers.FastTree());
  

Но я хотел бы динамически добавлять во время выполнения вот так:

 var pipeline = mlContext.Transforms.CopyColumns(outputColumnName: "Label", inputColumnName: "FareAmount");
pipeline.Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "VendorIdEncoded", inputColumnName: "VendorId"));
pipeline.Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "RateCodeEncoded", inputColumnName: "RateCode"));
pipeline.Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "PaymentTypeEncoded", inputColumnName: "PaymentType"));
pipeline.Append(mlContext.Transforms.Concatenate("Features", "VendorIdEncoded", "RateCodeEncoded", "PassengerCount", "TripTime", "TripDistance", "PaymentTypeEncoded"));
pipeline.Append(mlContext.Regression.Trainers.FastTree());
  

Ни одна из команд после первой не дает эффекта. Как я могу динамически добавлять цепочки?

При попытке:

 var pipeline = mlContext.Transforms.CopyColumns(outputColumnName: "Label", inputColumnName: "FareAmount");
pipeline = pipeline.Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "VendorIdEncoded", inputColumnName: "VendorId"));
pipeline = pipeline.Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "RateCodeEncoded", inputColumnName: "RateCode"));
pipeline = pipeline.Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "PaymentTypeEncoded", inputColumnName: "PaymentType"));
pipeline = pipeline.Append(mlContext.Transforms.Concatenate("Features", "VendorIdEncoded", "RateCodeEncoded", "PassengerCount", "TripTime", "TripDistance", "PaymentTypeEncoded"));
pipeline = pipeline.Append(mlContext.Regression.Trainers.FastTree());
  

Я получаю «Не удается неявно преобразовать тип ‘Microsoft.ML.Data.EstimatorChain’ в ‘Microsoft.ML.Transformes.Ошибки ColumnCopyingEstimator'»
введите описание изображения здесь

При попытке

 var pipeline = mlContext.Transforms.CopyColumns(outputColumnName: "Label", inputColumnName: "FareAmount");
var pipeline2 = pipeline.Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "VendorIdEncoded", inputColumnName: "VendorId"));
pipeline2 = pipeline.Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "RateCodeEncoded", inputColumnName: "RateCode"));
pipeline2 = pipeline.Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "PaymentTypeEncoded", inputColumnName: "PaymentType"));
var pipeline3 = pipeline2.Append(mlContext.Transforms.Concatenate("Features", "VendorIdEncoded", "RateCodeEncoded", "PassengerCount", "TripTime", "TripDistance", "PaymentTypeEncoded"));
var pipeline4 = pipeline3.Append(mlContext.Regression.Trainers.FastTree());
var model = pipeline4.Fit(dataView);
  

Но затем в последней строке я получаю «System.Исключение ArgumentOutOfRangeException: ‘Не удалось найти входной столбец ‘VendorIdEncoded’
Имя параметра: ошибка inputSchema'»

Комментарии:

1. Возможно, это просто предположение, это потому, что вам нужно использовать pipeline = pipeline.Append(...

2. Привет @CamiloTerevinto, пожалуйста, посмотрите изображение, которое я добавил к вопросу

3. Итак, вам нужно выяснить базовый тип для этих двух вызовов… Что, если использовать ITransformer pipeline = ... ?

4. Привет @CamiloTerevinto, не могли бы вы, пожалуйста, проверить дополнительные вещи, которые я пробовал (добавлены к вопросу), и посмотреть, сможете ли вы что-нибудь придумать?

Ответ №1:

Как объяснил @Camilo Terevinto в разделе комментариев, вам нужно получить результаты в pipeline :

 var pipeline = mlContext.Transforms.CopyColumns(outputColumnName: "Label", inputColumnName: "FareAmount");
var pipeline2 = pipeline.Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "VendorIdEncoded", inputColumnName: "VendorId"));
pipeline2 = pipeline.Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "RateCodeEncoded", inputColumnName: "RateCode"));
pipeline2 = pipeline.Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "PaymentTypeEncoded", inputColumnName: "PaymentType"));
pipeline2 = pipeline.Append(mlContext.Transforms.Concatenate("Features", "VendorIdEncoded", "RateCodeEncoded", "PassengerCount", "TripTime", "TripDistance", "PaymentTypeEncoded"));
pipeline2 = pipeline.Append(mlContext.Regression.Trainers.FastTree());
  

Окончательный ответ таков

 var pipeline = mlContext.Transforms.CopyColumns(outputColumnName: "Label", inputColumnName: "FareAmount");
var pipeline2 = pipeline.Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "VendorIdEncoded", inputColumnName: "VendorId"));
pipeline2 = pipeline2.Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "RateCodeEncoded", inputColumnName: "RateCode"));
pipeline2 = pipeline2.Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "PaymentTypeEncoded", inputColumnName: "PaymentType"));
var pipeline3 = pipeline2.Append(mlContext.Transforms.Concatenate("Features", "VendorIdEncoded", "RateCodeEncoded", "PassengerCount", "TripTime", "TripDistance", "PaymentTypeEncoded"));
var pipeline4 = pipeline3.Append(mlContext.Regression.Trainers.FastTree());
var model = pipeline4.Fit(dataView);
  

Комментарии:

1. Спасибо, но этот код не работает. Начиная со второй строки, во всех строках появляется красная волнистая линия с ошибкой: Не удается неявно преобразовать тип ‘Microsoft.ML.Data.EstimatorChain<Microsoft.ML.Transformes. OneHotEncodingTransformer>’to ‘Microsoft.ML.Transformes. ColumnCopyingEstimator’. Я добавил изображение к своему вопросу

2. Это действительно лучше. Итак, теперь отображаются только последние две строки Cannot implicitly convert type... я попытался продолжить ваше решение, используя pipeline3 и pipeline4 и следующую строку var model = pipeline4.Fit(dataView); , но я получил ошибку: : 'Could not find input column 'VendorIdEncoded' Parameter name: inputSchema'

3. @adinas странно, особенно с учетом того, что первоначальный код сработал для вас.

4. @adinas это строка, которой не было в коде, которым вы изначально поделились здесь. Было ли это раньше? Сработало ли это? Как это выглядело изначально, если да?

5. Лайош Арпад, чтобы устранить проблему, мне нужно было обновить строки 3 и 4 до pipeline2 = pipeline2.Append. Я отредактировал ваш ответ и принял. Спасибо за вашу помощь