Можно ли удалить или вставить шаг в объект sklearn.pipeline.Pipeline
?
Я пытаюсь выполнить поиск по сетке с одним шагом в объекте конвейера или без него. И интересно, могу ли я вставить или удалить шаг в конвейере. В исходном коде Pipeline
я видел, что есть объект self.steps
, содержащий все шаги. Мы можем получить шаги по named_steps()
. Прежде чем изменять его, я хочу убедиться, что я не вызываю неожиданных эффектов.
Вот пример кода:
from sklearn.pipeline import Pipeline
from sklearn.svm import SVC
from sklearn.decomposition import PCA
estimators = [('reduce_dim', PCA()), ('svm', SVC())]
clf = Pipeline(estimators)
clf
Возможно ли, чтобы мы сделали что-то вроде steps = clf.named_steps()
, а затем вставили или удалили этот список? Вызывает ли это нежелательный эффект на объекте clf?
4 ответа
Я вижу, что все упомянули только шаг удаления. Если вы хотите также вставить шаг в конвейер:
pipe.steps.append(['step name',transformer()])
pipe.steps
работает так же, как списки, поэтому вы также можете вставить элемент в определенное место:
pipe.steps.insert(1,['estimator',transformer()]) #insert as second step
На основе элементарного тестирования вы можете безопасно удалить шаг из конвейера scikit-learn так же, как и любой элемент списка, с помощью простого
clf_pipeline.steps.pop(n)
Где n - позиция отдельного оценщика, которого вы пытаетесь удалить.
Да, это возможно, но вы должны выполнить те же требования, которые требует Pipeline при инициализации, то есть вы не можете вставить предиктор ни на одном шаге, кроме последнего, вы должны вызывать fit
после обновления Pipeline.steps, потому что после такого обновления все шаги ( возможно, они были изучены в предыдущих fit
вызовах), будут признаны недействительными, также последний шаг Pipeline должен всегда реализовывать метод fit
, все предыдущие шаги должны реализовывать fit_transform
.
Так что да, это будет работать в текущей кодовой базе, но я думаю, что это не очень хорошее решение для вашей задачи, оно делает ваш код более зависимым от текущей реализации Pipeline, я думаю, что удобнее создавать новый Pipeline с измененными шагами, потому что Pipeline будет по крайней мере, проверьте все ваши шаги при инициализации, также создание нового конвейера не будет существенно отличаться по скорости от модификации шагов существующего конвейера, но, как я только что сказал, создание нового конвейера после каждой модификации шагов безопаснее в случае, когда кто-то существенно изменит реализацию Pipeline.
Просто включив, потому что я чувствую, что другие ответы ответили на вопрос о добавлении шагов в конвейер очень хорошо, , но не совсем рассказали, как удалить шаг из конвейера.
Остерегайтесь с моим подходом, хотя. Нарезка списков в этом случае немного странная.
from sklearn.pipeline import Pipeline
from sklearn.svm import SVC
from sklearn.decomposition import PCA
from sklearn.preprocessing import PolynomialFeatures
estimators = [('reduce_dim', PCA()), ('poly', PolynomialFeatures()), ('svm', SVC())]
clf = Pipeline(estimators)
Если вы хотите создать конвейер всего за несколько шагов PCA / Polynomial, вы можете просто нарезать шаг списка по индексам и передать его в Pipeline.
clf1 = Pipeline(clf.steps[0:2])
Хотите просто использовать шаги 2/3? Остерегайтесь, эти кусочки не всегда имеют смысл
clf2 = Pipeline(clf.steps[1:3])
Хотите просто использовать шаги 1/3? Я не могу использовать этот подход
clf3 = Pipeline(clf.steps[0] + clf.steps[2]) # errors
Похожие вопросы
Связанные вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.