#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. Я отредактировал ваш ответ и принял. Спасибо за вашу помощь