Aspiring Data Science
373 subscribers
425 photos
11 videos
10 files
1.87K links
Заметки экономиста о программировании, прогнозировании и принятии решений, научном методе познания.
Контакт: @fingoldo

I call myself a data scientist because I know just enough math, economics & programming to be dangerous.
Download Telegram
#mlgems #pipelines #functiontransformer #preprocessing

Интересная находка. Если у Вас есть долго выполняющийся препроцессинг, который Вы тем не менее хотите использовать с несколькими 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