#featureselection #masters #mlgems
Нашёл в книге Тима Мастерса "Data Mining Algorithms in C++" такую любопытную модификацию Forward Selection:
Forward Selection Preserving Subsets
"There is a straightforward extension of forward stepwise selection that can often produce a significant improvement in performance at little cost. We simply preserve the best few candidates at each step, rather than preserving just the single best. For example, we may find that X4, X7, and X9 are the three best single variables. (Three is an arbitrary choice made by the developer, considering the trade-off between quality and compute time.) We then test X4 paired with each remaining candidate, X7 paired with each, and finally X9 paired with each. Of these many pairs tested, we identify the best three pairs. These pairs will each be tested with the remaining candidates as trios, and so forth. The beauty of this algorithm is that we gain a lot with relatively little cost. The chance of missing an important combination is greatly reduced, while compute time goes up linearly, not exponentially. I highly recommend this approach."
Нашёл в книге Тима Мастерса "Data Mining Algorithms in C++" такую любопытную модификацию Forward Selection:
Forward Selection Preserving Subsets
"There is a straightforward extension of forward stepwise selection that can often produce a significant improvement in performance at little cost. We simply preserve the best few candidates at each step, rather than preserving just the single best. For example, we may find that X4, X7, and X9 are the three best single variables. (Three is an arbitrary choice made by the developer, considering the trade-off between quality and compute time.) We then test X4 paired with each remaining candidate, X7 paired with each, and finally X9 paired with each. Of these many pairs tested, we identify the best three pairs. These pairs will each be tested with the remaining candidates as trios, and so forth. The beauty of this algorithm is that we gain a lot with relatively little cost. The chance of missing an important combination is greatly reduced, while compute time goes up linearly, not exponentially. I highly recommend this approach."
👍2
#featureselection #masters #mlgems #chisquare #cramerv
The chi-square test need not be restricted to categorical variables. It is legitimate to partition the range of numeric variables into bins and treat these bins as if they were categories. Of course, this results in some loss of information because variation within each bin is ignored. But if the data is noisy or if one wants to detect relationship patterns of any form without preconceptions, a chi-square formulation may be appropriate.
Chi-squared itself has little intuitive meaning in terms of its values. It is highly dependent on the number of cases and the number of bins for each variable, so any numeric value of chi-squared is essentially uninterpretable. This can be remedied by a simple monotonic transformation to produce a quantity called Cramer’s V.
The chi-square test need not be restricted to categorical variables. It is legitimate to partition the range of numeric variables into bins and treat these bins as if they were categories. Of course, this results in some loss of information because variation within each bin is ignored. But if the data is noisy or if one wants to detect relationship patterns of any form without preconceptions, a chi-square formulation may be appropriate.
Chi-squared itself has little intuitive meaning in terms of its values. It is highly dependent on the number of cases and the number of bins for each variable, so any numeric value of chi-squared is essentially uninterpretable. This can be remedied by a simple monotonic transformation to produce a quantity called Cramer’s V.
#sklearn #mlgems
Лучшие практики sklearn, для новичков и среднего уровня.
https://www.youtube.com/watch?v=WkqM0ndr42c
Лучшие практики sklearn, для новичков и среднего уровня.
https://www.youtube.com/watch?v=WkqM0ndr42c
YouTube
My top 50 scikit-learn tips
If you already know the basics of scikit-learn, but you want to be more efficient and get up-to-date with the latest features, then THIS is the video for you.
My name is Kevin Markham, and I've been teaching Machine Learning in Python with scikit-learn for…
My name is Kevin Markham, and I've been teaching Machine Learning in Python with scikit-learn for…
#ann #karpathy #mlgems
Рецепт работы с нейронками от Андрея Карпатий:
1) Learn the data
2) Create baselines
3) Overfit
4) Regularize
5) Tune
6) Dominate
Удивили вот эти рекомендации:
verify loss @ init. Verify that your loss starts at the correct loss value. E.g. if you initialize your final layer correctly you should measure -log(1/n_classes) on a softmax at initialization. The same default values can be derived for L2 regression, Huber losses, etc.
init well. Initialize the final layer weights correctly. E.g. if you are regressing some values that have a mean of 50 then initialize the final bias to 50. If you have an imbalanced dataset of a ratio 1:10 of positives:negatives, set the bias on your logits such that your network predicts probability of 0.1 at initialization. Setting these correctly will speed up convergence and eliminate “hockey stick” loss curves where in the first few iteration your network is basically just learning the bias.
На них даже ссылаются в учебном примере tensorflow, где в задаче бинарной классификации нейронке с сигмоидой в последнем слое задают начальное смещение равное логарифму доли положительного класса. Я попробовал то же самое на своей задаче, но у меня в последнем softmax, и формулка не сработала. При конвертации в sigmoid лосс нетренерованной модели и правда стал нулём, но обучение это совсем не улучшило. У кого какой с этим опыт?
Ну и на сладенькое.
"Suffering is a perfectly natural part of getting a neural network to work well, but it can be mitigated by being thorough, defensive, paranoid, and obsessed with visualizations of basically every possible thing. The qualities that in my experience correlate most strongly to success in deep learning are patience and attention to detail.
Hyper-parameter optimization. There is a large number of fancy bayesian hyper-parameter optimization toolboxes around and a few of my friends have also reported success with them, but my personal experience is that the state of the art approach to exploring a nice and wide space of models and hyperparameters is to use an intern :). Just kidding.
Ensembles. Model ensembles are a pretty much guaranteed way to gain 2% of accuracy on anything. If you can’t afford the computation at test time look into distilling your ensemble into a network using dark knowledge.
Leave it training. I’ve often seen people tempted to stop the model training when the validation loss seems to be leveling off. In my experience networks keep training for unintuitively long time. One time I accidentally left a model training during the winter break and when I got back in January it was SOTA (“state of the art”)."
http://karpathy.github.io/2019/04/25/recipe/#2-set-up-the-end-to-end-trainingevaluation-skeleton--get-dumb-baselines
Рецепт работы с нейронками от Андрея Карпатий:
1) Learn the data
2) Create baselines
3) Overfit
4) Regularize
5) Tune
6) Dominate
Удивили вот эти рекомендации:
verify loss @ init. Verify that your loss starts at the correct loss value. E.g. if you initialize your final layer correctly you should measure -log(1/n_classes) on a softmax at initialization. The same default values can be derived for L2 regression, Huber losses, etc.
init well. Initialize the final layer weights correctly. E.g. if you are regressing some values that have a mean of 50 then initialize the final bias to 50. If you have an imbalanced dataset of a ratio 1:10 of positives:negatives, set the bias on your logits such that your network predicts probability of 0.1 at initialization. Setting these correctly will speed up convergence and eliminate “hockey stick” loss curves where in the first few iteration your network is basically just learning the bias.
На них даже ссылаются в учебном примере tensorflow, где в задаче бинарной классификации нейронке с сигмоидой в последнем слое задают начальное смещение равное логарифму доли положительного класса. Я попробовал то же самое на своей задаче, но у меня в последнем softmax, и формулка не сработала. При конвертации в sigmoid лосс нетренерованной модели и правда стал нулём, но обучение это совсем не улучшило. У кого какой с этим опыт?
Ну и на сладенькое.
"Suffering is a perfectly natural part of getting a neural network to work well, but it can be mitigated by being thorough, defensive, paranoid, and obsessed with visualizations of basically every possible thing. The qualities that in my experience correlate most strongly to success in deep learning are patience and attention to detail.
Hyper-parameter optimization. There is a large number of fancy bayesian hyper-parameter optimization toolboxes around and a few of my friends have also reported success with them, but my personal experience is that the state of the art approach to exploring a nice and wide space of models and hyperparameters is to use an intern :). Just kidding.
Ensembles. Model ensembles are a pretty much guaranteed way to gain 2% of accuracy on anything. If you can’t afford the computation at test time look into distilling your ensemble into a network using dark knowledge.
Leave it training. I’ve often seen people tempted to stop the model training when the validation loss seems to be leveling off. In my experience networks keep training for unintuitively long time. One time I accidentally left a model training during the winter break and when I got back in January it was SOTA (“state of the art”)."
http://karpathy.github.io/2019/04/25/recipe/#2-set-up-the-end-to-end-trainingevaluation-skeleton--get-dumb-baselines
TensorFlow
Classification on imbalanced data | TensorFlow Core
✍2
#ml #randomforest #pzad #dyakonov #syntheticrf #tricks #mlgems #oof
Понравился совет, как определить n_estimators для лесов, и аргументация, почему его не надо тюнить с HPT.
Оказывается, подрезание деревьев снижает калибровку.
Крутой трюк с подбором порогов для выравнивания распределений в "целочисленной регрессии" (у С. Семёнова это вообще вылилось в подзадачу ML). Кстати, а почему нету лесов, которые могут выдавать медиану в листьях вместо среднего?
OOF-прогнозы - тоже интересная техника, особенно для генерации новых признаков.
https://www.youtube.com/watch?v=sAcjGjMHduc&list=PLaRUeIuewv8CMFox0oEjlyePUhUmo-x0h&
Понравился совет, как определить n_estimators для лесов, и аргументация, почему его не надо тюнить с HPT.
Оказывается, подрезание деревьев снижает калибровку.
Крутой трюк с подбором порогов для выравнивания распределений в "целочисленной регрессии" (у С. Семёнова это вообще вылилось в подзадачу ML). Кстати, а почему нету лесов, которые могут выдавать медиану в листьях вместо среднего?
OOF-прогнозы - тоже интересная техника, особенно для генерации новых признаков.
https://www.youtube.com/watch?v=sAcjGjMHduc&list=PLaRUeIuewv8CMFox0oEjlyePUhUmo-x0h&
YouTube
ПЗАД2020. Лекция 24. Случайный лес
курс "Прикладные задачи анализа данных", ВМК МГУ, Дьяконов Александр (https://dyakonov.org/ag/)
страница курса: https://github.com/Dyakonov/PZAD/blob/master/README.md
страница курса: https://github.com/Dyakonov/PZAD/blob/master/README.md
#mlgems #sklearn #pipelines
Столкнулся с ситуацией, когда есть конвейер sklearn/imblearn с препроцессингом (удаление, нормализация некоторых столбцов), в конце бустинг, поддерживающий задание отдельного eval_set ( catboost, xgboost). К eval_set конвейер, конечно же, не применяется, т.к. pipeline про eval_set знает только то, что это ещё один из параметров для модели в конце списка. Как быть? Тестирую пока решение с промежуточным конвейером, только пытаюсь сделать его более эффективным.
Столкнулся с ситуацией, когда есть конвейер sklearn/imblearn с препроцессингом (удаление, нормализация некоторых столбцов), в конце бустинг, поддерживающий задание отдельного eval_set ( catboost, xgboost). К eval_set конвейер, конечно же, не применяется, т.к. pipeline про eval_set знает только то, что это ещё один из параметров для модели в конце списка. Как быть? Тестирую пока решение с промежуточным конвейером, только пытаюсь сделать его более эффективным.
Stack Overflow
Sklearn pass fit() parameters to xgboost in pipeline
Similar to How to pass a parameter to only one part of a pipeline object in scikit learn? I want to pass parameters to only one part of a pipeline. Usually, it should work fine like:
estimator =
estimator =
#boostings #mlgems
В процессе сравнения методов FS я словил когнитивный диссонанс. Уже энное количество лет я думал, что градиентные бустинги над деревьями - это прямо панацея для табличных данных, и всегда по дефолту использовал их.
Ну да, от деревянных методов не приходится ожидать хорошей экстраполяции (за пределы обучающей выборки), но я их раньше тестировал, интерполируя синтетические данные на сложных нелинейных трансцендентных функциях, связи отлично ловились, и я привык считать бустинги априори лучшим решением.
Только недавно я стал исследовать возможность и эффекты добавления альтернативных классов моделей в ансамбль.
Плюс, в моих DS проектах обычно не хватало времени и/или бюджета на тюнинг гиперпараметров, и я так с потолка оценивал эффект от HPT в +- 10% - nice to have, но не критично.
Всем, кто в опросе выше выбрал 1-й вариант, я советую запустить вот такой простой пример:
и попытаться понять, что происходит.
Очень большим открытием для меня стало, что бустинги не могут хорошо промоделировать даже сумму 3 случайных величин, особенно если одна их них сильно в другой шкале. Задача, с которой на ура справляется линейная регрессия!
Мне подсказали увеличить катбустовый (гипер)параметр border_count, но даже с максимальным значением RMSE всё равно высока. Ну хотя бы снижается втрое.
Какие выводы можно сделать из данного примера:
1) всегда проверяйте несколько альтернативных классов моделей, обязательно включая линейные
2) в некоторых случаях HPT даёт прирост не в 10-15, а в 300-500% (также справедливо для категориек в xgboost. ну плохо он умеет с ними обращаться, плохо). делайте HPT.
3) lightgbm с линейной регрессией в листьях (вместо константы) решает задачу LGBMRegressor (linear_tree=True)
4) в общем случае бустинги требуют в качестве препроцессора не только PolynomialFeatures для моделирования произведений, но и, похоже, "AdditiveFeatures", дающего суммы/линейные комбинации сырых признаков.
5) плохонький и простенький посчитанный численный эксперимент лучше любого предвзятого убеждения.
6) декомпозиция рулит
В процессе сравнения методов FS я словил когнитивный диссонанс. Уже энное количество лет я думал, что градиентные бустинги над деревьями - это прямо панацея для табличных данных, и всегда по дефолту использовал их.
Ну да, от деревянных методов не приходится ожидать хорошей экстраполяции (за пределы обучающей выборки), но я их раньше тестировал, интерполируя синтетические данные на сложных нелинейных трансцендентных функциях, связи отлично ловились, и я привык считать бустинги априори лучшим решением.
Только недавно я стал исследовать возможность и эффекты добавления альтернативных классов моделей в ансамбль.
Плюс, в моих DS проектах обычно не хватало времени и/или бюджета на тюнинг гиперпараметров, и я так с потолка оценивал эффект от HPT в +- 10% - nice to have, но не критично.
Всем, кто в опросе выше выбрал 1-й вариант, я советую запустить вот такой простой пример:
import numpy as np, pandas as pd
from lightgbm import LGBMRegressor
from catboost import CatBoostRegressor
from sklearn.metrics import root_mean_squared_error
X=np.random.normal(0,9,size=(10_000,3)) # generate 3 random features with normal distribution
X[:,0]=X[:,0]*1000 # make one feature of a bigger magnitude
y=X.sum(axis=1) # target is just an exact sum of our 3 features
model=CatBoostRegressor(verbose=0,eval_fraction=0.1)
model.fit(X,y,plot=True)
print(f"train RMSE={root_mean_squared_error(y,model.predict(X))}")
train RMSE=311.7677815427915
и попытаться понять, что происходит.
Очень большим открытием для меня стало, что бустинги не могут хорошо промоделировать даже сумму 3 случайных величин, особенно если одна их них сильно в другой шкале. Задача, с которой на ура справляется линейная регрессия!
Мне подсказали увеличить катбустовый (гипер)параметр border_count, но даже с максимальным значением RMSE всё равно высока. Ну хотя бы снижается втрое.
Какие выводы можно сделать из данного примера:
1) всегда проверяйте несколько альтернативных классов моделей, обязательно включая линейные
2) в некоторых случаях HPT даёт прирост не в 10-15, а в 300-500% (также справедливо для категориек в xgboost. ну плохо он умеет с ними обращаться, плохо). делайте HPT.
3) lightgbm с линейной регрессией в листьях (вместо константы) решает задачу LGBMRegressor (linear_tree=True)
4) в общем случае бустинги требуют в качестве препроцессора не только PolynomialFeatures для моделирования произведений, но и, похоже, "AdditiveFeatures", дающего суммы/линейные комбинации сырых признаков.
5) плохонький и простенький посчитанный численный эксперимент лучше любого предвзятого убеждения.
6) декомпозиция рулит
👍2❤1🔥1
#boostings #mlgems
Подумал, жаль, что даже в лучших в современных библиотеках машинного обучения нет параметра timeout. В xgboost, catboost, lightgbm есть максимальное количество деревьев n_estimators, но вряд ли кому есть дело до точного количества деревьев в решении. Что на самом деле важно, так это максимальное время обучения модели, правда? Так почему бы не дать возможность его непосредственно задать параметром timeout?
Запостил feature requests. Мне, правда, указывают, что можно для этих целей приспособить коллбэк и отлавливать исключение, но в xgboost неясно, сохранится ли лучшая модель, если используется защита от оверфита. Да и гораздо удобнее, если такой простой параметр будет во всех либах без необходимости конструировать и тестировать свои коллбэки.
Если кто согласен с полезностью такой фичи, буду рад поддержке в гитхабовских ветках.
Подумал, жаль, что даже в лучших в современных библиотеках машинного обучения нет параметра timeout. В xgboost, catboost, lightgbm есть максимальное количество деревьев n_estimators, но вряд ли кому есть дело до точного количества деревьев в решении. Что на самом деле важно, так это максимальное время обучения модели, правда? Так почему бы не дать возможность его непосредственно задать параметром timeout?
Запостил feature requests. Мне, правда, указывают, что можно для этих целей приспособить коллбэк и отлавливать исключение, но в xgboost неясно, сохранится ли лучшая модель, если используется защита от оверфита. Да и гораздо удобнее, если такой простой параметр будет во всех либах без необходимости конструировать и тестировать свои коллбэки.
Если кто согласен с полезностью такой фичи, буду рад поддержке в гитхабовских ветках.
GitHub
Feature Request: add timeout parameter to the .fit() method · Issue #10684 · dmlc/xgboost
Adding the timeout parameter to the .fit() method, that should force the library to return best known solution found so far as soon as provided number of seconds since the start of training are pas...
❤1👍1
#sklearn #mlgems
У Винсента всегда классные выступления. Кратко рассматривает кэширование конвейера (Pipeline(...,memory=...)), роутинг весов, дообучение для потоковых данных (partial_fit), модуль semi_supervised, Но вы этот раз всё очень кратко и галопом по Европам.
https://www.youtube.com/watch?v=es_8_iT-oQk
У Винсента всегда классные выступления. Кратко рассматривает кэширование конвейера (Pipeline(...,memory=...)), роутинг весов, дообучение для потоковых данных (partial_fit), модуль semi_supervised, Но вы этот раз всё очень кратко и галопом по Европам.
https://www.youtube.com/watch?v=es_8_iT-oQk
YouTube
Vincent D. Warmerdam - Scikit-Learn can do THAT?!
Many of us know scikit-learn for it's ability to construct pipelines that can do .fit().predict(). It's an amazing feature for sure. But once you dive into the codebase ... you realise that there is just so much more.
This talk will be an attempt at demonstrating…
This talk will be an attempt at demonstrating…
#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