#mlgems #pipelines #functiontransformer #preprocessing
Интересная находка. Если у Вас есть долго выполняющийся препроцессинг, который Вы тем не менее хотите использовать с несколькими ML модельками, есть рецепт, как оптимизировать время расчётов и избежать повторного бессмысленного фиттинга, но при этом сохранить преимущества конвейера (Pipeline).
Для этого нужно
1) вынести препроцессинг в отдельный субконвейер с заданным параметром memory
2) добавить к субконвейеру identity-транcформер, просто передающий входы дальше по цепочке. для этого можно использовать FunctionTransformer без указания func. зачем это надо: согласно доке, последний элемент конвейера НЕ КЭШИРУЕТСЯ, поэтому добавляем последним такой dummy-трансформер.
P.S. для ленивых - можете заменить Pipeline на make_pipeline, тогда не надо будет указывать явно имена шагов.
Интересная находка. Если у Вас есть долго выполняющийся препроцессинг, который Вы тем не менее хотите использовать с несколькими ML модельками, есть рецепт, как оптимизировать время расчётов и избежать повторного бессмысленного фиттинга, но при этом сохранить преимущества конвейера (Pipeline).
Для этого нужно
1) вынести препроцессинг в отдельный субконвейер с заданным параметром memory
2) добавить к субконвейеру identity-транcформер, просто передающий входы дальше по цепочке. для этого можно использовать FunctionTransformer без указания func. зачем это надо: согласно доке, последний элемент конвейера НЕ КЭШИРУЕТСЯ, поэтому добавляем последним такой dummy-трансформер.
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import FunctionTransformer
preprocessor=Pipeline([('prep',MyExpensivePreprocessor()),('identity', FunctionTransformer())],memory=r"R:\Temp")
for model in (model1,model2,model3):
pipe=Pipeline([('prep',preprocessor),('est',model)])
pipe.fit(X,y)
...
P.S. для ленивых - можете заменить Pipeline на make_pipeline, тогда не надо будет указывать явно имена шагов.
✍2