#preprocessing #cleaning #anomalydetection
Не в первый раз ловлю себя на том, что данные, которые не получается хорошо промоделировать, хочется выкинуть из датасета, и переобучиться. Нормально ли это?
Не в первый раз ловлю себя на том, что данные, которые не получается хорошо промоделировать, хочется выкинуть из датасета, и переобучиться. Нормально ли это?
Anonymous Poll
30%
Да, т.к. часто входные данные зашумлены, а обучение на шуме портит метрики для "нормальной" части
0%
Специально так всегда делаю
10%
Нет! Удаление таких точек прячет факт, что на таргет влияют другие
30%
Специально так никогда не делаю
10%
Никогда об этом не приходилось задумываться
40%
Выбираю метод в зависимости от датасета и доверия к качеству меток
0%
У меня встроенный детектор аномалий и fit_resample
#masters #scaling #preprocessing #robustscaler #timeseries
Перечитываю Мастерса, у него очень интересный подход к нормироваке и шкалированию временных рядов. Вместо общепринятых среднего и скв. отклонения в формуле (val-mean)/std, он использует медиану и межквартильное расстояние iqr. Идея очень резонная в плане устойчивости к выбросам. Я вот что подумал, в sklearn, конечно, есть RobustScaler, который делает вроде бы то же самое, но фишка в том, что Мастерс нормирующие показатели вычисляет не по всему train set, как RobustScaler, а по скользящему окну из последних T наблюдений. Надо бы попробовать модифицировать RobustScaler с учётом этой идеи.
Перечитываю Мастерса, у него очень интересный подход к нормироваке и шкалированию временных рядов. Вместо общепринятых среднего и скв. отклонения в формуле (val-mean)/std, он использует медиану и межквартильное расстояние iqr. Идея очень резонная в плане устойчивости к выбросам. Я вот что подумал, в sklearn, конечно, есть RobustScaler, который делает вроде бы то же самое, но фишка в том, что Мастерс нормирующие показатели вычисляет не по всему train set, как RobustScaler, а по скользящему окну из последних T наблюдений. Надо бы попробовать модифицировать RobustScaler с учётом этой идеи.
👍1
#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