Конвейер выбора элемента: X имеет другую форму, чем при установке - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь создать конвейер, который выбирает 250 лучших функций из набора, а затем вписывает в них случайный лесной регрессор.Затем я хочу использовать это для прогнозирования свежих данных X_fresh.Для этого я сначала выбираю 250 лучших функций из свежих данных, используя строку X_fresh=X_fresh[:,selector.get_support(indices=True)].Однако после запуска полного кода это приводит к ошибке «X имеет другую форму, чем при подгонке».

Кажется, что когда я подгоняю конвейер, он автоматически не преобразует значения в X_train, чтобы включить только 250 лучших функций.

Как я могу это исправить?Полный код приведен ниже:

from imblearn.pipeline import Pipeline

selector=SelectKBest(f_regression)
pipeline=Pipeline(steps=[('selector', selector),('regressor', RandomForestRegressor())])

estimator=pipeline.set_params(selector__k=250,regressor__n_estimators=175).fit(X_train, y_train)

X_fresh=X_fresh[:,selector.get_support(indices=True)]

#Use it to predict the target values of the test data set
y_pred=estimator.predict(X_fresh)

1 Ответ

0 голосов
/ 08 октября 2018

Вы выполняете преобразование в X_fresh, которое вы не выполняете в X_train.Ваш конвейер ожидает, что входные данные из X_fresh будут иметь ту же форму, что и X_train.Выполняя это преобразование selector перед конвейером, вы изменяете форму X_fresh, чтобы она больше не соответствовала X_train.

Поскольку selector уже является частью конвейера, этот кодненужное:

X_fresh=X_fresh[:,selector.get_support(indices=True)

При вызове y_pred=estimator.predict(X_fresh) шаг selector будет выполняться как часть конвейера, поэтому нет необходимости вызывать этот шаг независимо.Это одно из преимуществ использования конвейера с самого начала.Когда вы вызываете estimator, убедитесь, что X_fresh совпадает с формой X_train, поскольку именно этого и ожидал обученный конвейер.

Конвейер работает путем объединения шагов модели вместе.В вашем конвейере у вас есть шаг выбора объекта selector и шаг регрессии regressor.Когда вы вызываете метод fit() в вашем конвейере, входные данные, X_train сначала преобразуются в selector, чтобы получить 250 лучших функций, а затем преобразованные данные передаются на шаг regressor для обучения регрессионной модели..

Когда вы вызываете predict() в своем конвейере, новые данные, которые вы вводите, будут выполнять те же самые шаги, поэтому нет необходимости выполнять какой-либо шаг из конвейера независимо.

Доподгоняя ваш конвейер, вы должны получить X_train.shape, чтобы определить, сколько столбцов в X_train.После того, как вы укажете estimator, вы должны убедиться, что X_fresh имеет те же столбцы, что и X_train.Затем, когда вы вызываете прогнозирование на estimator, конвейер автоматически выполнит выбор функции и выдаст прогнозы.

...