#featureselection #diogenes
в модуле filters Диогена уже 3k строчек кода. хотя вроде идеи основные такие простые и элегантные.
в модуле filters Диогена уже 3k строчек кода. хотя вроде идеи основные такие простые и элегантные.
#featureengineering #featureselection #diogenes
2024-03-02 05:39:17,484 - INFO - screen_predictors-line:1524 - Starting work with full_npermutations=10, min_nonzero_confidence=0.99000, max_failed=1
2024-03-02 05:39:49,214 - INFO - fit-line:2750 - MRMR selected 4 out of 5 features: [{'name': 'a', 'indices': (0,), 'gain': 0.33220730396336595, 'confidence': 1.0}, {'name': 'b', 'indices': (1,), 'gain': 0.5405325314273686, 'confidence': 1.0}, {'name': 'c', 'indices': (2,), 'gain': 0.20641517193369197, 'confidence': 1.0}, {'name': 'd', 'indices': (3,), 'gain': 0.07414164383695354, 'confidence': 1.0}]
2024-03-02 05:40:34,762 - INFO - fit-line:2983 - mul(log(c),sin(d)) is recommended to use as a new feature!
2024-03-02 05:42:12,619 - INFO - fit-line:2983 - mul(squared(a),reciproc(b)) is recommended to use as a new feature!
time: 3min 7s (started: 2024-03-02 05:39:05 +03:00)
Как тебе такое, Франциска Хорн? )
n =100_000
a = np.random.rand(n)
b = np.random.rand(n)
c = np.random.rand(n)
d = np.random.rand(n)
e = np.random.rand(n)
f = np.random.rand(n)
y=a**2/b+f/5+np.log(c)*np.sin(d)
df = pd.DataFrame(
{
"a": a,
"b": b,
"c": c,
"d": d,
"e": e,
}
)
from mlframe.feature_selection.filters import MRMR
fs=MRMR(full_npermutations=10,baseline_npermutations=20,verbose=1,n_workers=1,parallel_kwargs=dict(temp_folder=r"R:\Temp"),)
fs.fit(X=df,y=y)
2024-03-02 05:39:17,484 - INFO - screen_predictors-line:1524 - Starting work with full_npermutations=10, min_nonzero_confidence=0.99000, max_failed=1
2024-03-02 05:39:49,214 - INFO - fit-line:2750 - MRMR selected 4 out of 5 features: [{'name': 'a', 'indices': (0,), 'gain': 0.33220730396336595, 'confidence': 1.0}, {'name': 'b', 'indices': (1,), 'gain': 0.5405325314273686, 'confidence': 1.0}, {'name': 'c', 'indices': (2,), 'gain': 0.20641517193369197, 'confidence': 1.0}, {'name': 'd', 'indices': (3,), 'gain': 0.07414164383695354, 'confidence': 1.0}]
2024-03-02 05:40:34,762 - INFO - fit-line:2983 - mul(log(c),sin(d)) is recommended to use as a new feature!
2024-03-02 05:42:12,619 - INFO - fit-line:2983 - mul(squared(a),reciproc(b)) is recommended to use as a new feature!
time: 3min 7s (started: 2024-03-02 05:39:05 +03:00)
Как тебе такое, Франциска Хорн? )
🔥3
#featureengineering #featureselection #autofeat
time: 5min 23s (started: 2024-03-02 06:07:07 +03:00)
Эмм.. А можно мне другой отборщик признаков? )
from autofeat import AutoFeatRegressor
model = AutoFeatRegressor(transformations = ('1/', 'exp', 'log', 'sin', 'sqrt', '^2', '^3'),featsel_runs=15)
new_df = model.fit_transform(df, y)
time: 5min 23s (started: 2024-03-02 06:07:07 +03:00)
Эмм.. А можно мне другой отборщик признаков? )
#featureengineering #featureselection #diogenes
Хорошие новости!
Как уже поняли читатели моего блога, в библиотеке отбора признаков Диоген появился также и модуль инженерии/конструирования новых признаков, но не бездумного, как в autofeat, а направленного, на основании теоретико-информационных метрик (в основном, взаимной информации MI комбинаций факторов с таргетом).
Основной мотивацией была попытка выделить рациональное зерно из набивших оскомину унылых рекомендаций и бубнежа вида "также иногда помогает логарифмирование, экспоненциирование, извлечение корней, попарное перемножение или деление исходных факторов". Эти рекомендации регулярно встречаются в курсах по FE и презентациях кэгглеров, но непонятно, как к этому вообще подступаться, кроме разве что каких-то случайных выпадов. Ну вот есть у меня 10k оригинальных признаков, мне взаимные отношения или произведения у каких именно из 50M пар проверять?
А так как метод MRMR в Диогене как раз и определяет достаточно хорошее в смысле предиктивности и уникальности подмножество признаков, некоторая проверка комбинаций становится уже реальной. Ещё больше пространство поиска сужает эвристика, что MI от "хорошей" на предмет тесной нелинейной связи пары признаков должна быть выше суммы индивидуальных MI факторов пары.
Это уже позволяет брать любые известные классы функций и для пары признаков a,b пытаться подбирать (в рамках бюджета) F3(F1(a),F2(b)) дающие максимальную MI с таргетом. В некоторых простых случаях этот метод срабатывает на ура, результаты я показывал выше. Но, если истинная зависимость сильно искажает вход ДО передачи в нелинейную функцию, метод становится практически бессилен и связь не обнаруживается.
Алексей @introspec предложил очень классную идею: почему бы не заменить подбор функций, сходимость которого дело скорее удачи, подбором коэффициентов ортогональных многочленов (например, Эрмитовых), теоретически умеющих аппроксимировать любую функциональную зависимость на отрезке? Взяв степень пониже, и коэффициенты поближе к 0, можно обеспечить своего рода регуляризацию.
Я попробовал пару дней тому заменить случайный поиск в пространстве функций на почти настолько же случайный поиск в пространстве коэффициентов Эрмитовых полиномов, но поставил вариацию на паузу из-за того, что не находились достаточно хорошие решения.
Теперь, собственно, к новостям )
Потестил свой модуль с разными исходными зависимостями, немного прояснил чувствительность и границы применимости метода. Пофиксил баги.
И... Заменил случайный перебор Эрмитовых полиномов на направленную оптимизацию с помощью Optuna )
Решения явно стали находиться получше за разумное время, иногда по качеству не уступают "нативным", когда зависимость известна. Нужно больше тестов. И, самое главное, предстоит выяснить, дают ли такие необычные преобразования реальные преимущества в ML метриках, или же ведут к оверфиту.
Хорошие новости!
Как уже поняли читатели моего блога, в библиотеке отбора признаков Диоген появился также и модуль инженерии/конструирования новых признаков, но не бездумного, как в autofeat, а направленного, на основании теоретико-информационных метрик (в основном, взаимной информации MI комбинаций факторов с таргетом).
Основной мотивацией была попытка выделить рациональное зерно из набивших оскомину унылых рекомендаций и бубнежа вида "также иногда помогает логарифмирование, экспоненциирование, извлечение корней, попарное перемножение или деление исходных факторов". Эти рекомендации регулярно встречаются в курсах по FE и презентациях кэгглеров, но непонятно, как к этому вообще подступаться, кроме разве что каких-то случайных выпадов. Ну вот есть у меня 10k оригинальных признаков, мне взаимные отношения или произведения у каких именно из 50M пар проверять?
А так как метод MRMR в Диогене как раз и определяет достаточно хорошее в смысле предиктивности и уникальности подмножество признаков, некоторая проверка комбинаций становится уже реальной. Ещё больше пространство поиска сужает эвристика, что MI от "хорошей" на предмет тесной нелинейной связи пары признаков должна быть выше суммы индивидуальных MI факторов пары.
Это уже позволяет брать любые известные классы функций и для пары признаков a,b пытаться подбирать (в рамках бюджета) F3(F1(a),F2(b)) дающие максимальную MI с таргетом. В некоторых простых случаях этот метод срабатывает на ура, результаты я показывал выше. Но, если истинная зависимость сильно искажает вход ДО передачи в нелинейную функцию, метод становится практически бессилен и связь не обнаруживается.
Алексей @introspec предложил очень классную идею: почему бы не заменить подбор функций, сходимость которого дело скорее удачи, подбором коэффициентов ортогональных многочленов (например, Эрмитовых), теоретически умеющих аппроксимировать любую функциональную зависимость на отрезке? Взяв степень пониже, и коэффициенты поближе к 0, можно обеспечить своего рода регуляризацию.
Я попробовал пару дней тому заменить случайный поиск в пространстве функций на почти настолько же случайный поиск в пространстве коэффициентов Эрмитовых полиномов, но поставил вариацию на паузу из-за того, что не находились достаточно хорошие решения.
Теперь, собственно, к новостям )
Потестил свой модуль с разными исходными зависимостями, немного прояснил чувствительность и границы применимости метода. Пофиксил баги.
И... Заменил случайный перебор Эрмитовых полиномов на направленную оптимизацию с помощью Optuna )
Решения явно стали находиться получше за разумное время, иногда по качеству не уступают "нативным", когда зависимость известна. Нужно больше тестов. И, самое главное, предстоит выяснить, дают ли такие необычные преобразования реальные преимущества в ML метриках, или же ведут к оверфиту.
👍2🔥1
#featureselection #diogenes #rfecv
Вот так работает обратное удаление признаков в Диогене, кстати, в реальном проекте уже.
Вот так работает обратное удаление признаков в Диогене, кстати, в реальном проекте уже.
#featureselection #kuhn
Читаю по рекомендации товарища книжку по ML. В главе по FS есть задание, мимо которого не смог пройти ) Надо будет потестить на нём Диогена. А возьмётся кто-то из читателей потестить на этом примере алгоритмы sklearn/mlxtend?
Читаю по рекомендации товарища книжку по ML. В главе по FS есть задание, мимо которого не смог пройти ) Надо будет потестить на нём Диогена. А возьмётся кто-то из читателей потестить на этом примере алгоритмы sklearn/mlxtend?
👍1
#news #automl #plans
ML/DS-планы на 2024-й.
Как-то незаметно прошло уже почти полгода! Поймал себя на том, что двигаюсь к своей мини-automl системе. Скажете, почему не возьмёшь готовую? Ответ обычный, хочешь чтоб было сделано хорошо - сделай сам (если у тебя есть экспертиза и классные идеи).
В рамках этой automl системы будут:
1) 2 отборщика признаков из Diogenes, MRMR и RFECV.
MRMR уже получил навык создания комбинаций признаков (feature engineering), его надо ускорить (запараллелить) и лучше потестировать подмодуль с ортогональными полиномами (там будет полезен хороший оптимизатор, сейчас стоит оптуна и работает через пень-колоду)
2) мой будущий классный MBHO оптимизатор HPT. мне уже удалось побить оптуну, гиперопт, скопт в задачах одномерной оптимизации (для решения проблемы feature selection, см бенчи по тегам #featureselection #hpt #optuna #hyperopt #skopt), пора его расширить на многомерный случай
3) модуль ансамблирования ENS. будет простое усреднение (много оттенков) и стэкинг. из ноу-хау тут будут instance-based confidence, numaggs over level 0 predictions, identity level 1 baseline, аугментация табличных данных. Для расширения ENS планируется написать универсальную обёртку для ранней остановки. С этой идеей ношусь уже несколько лет, да никак не сделаю. Смысл обёртки в том, чтобы дать функционал early stopping/overfitting detection тем моделькам, которые сами нативно его не поддерживают - путём partial_fit или дихотомического поиска по n_iterations.
Отборщики признаков получат апгрейд и во время своей работы будут собирать ценную информацию для модулей HPT (MRMR считает базовые статистики признаков, силу связей с таргетами и между собой; RFECV создаёт пары гиперпараметры-ml метрики для последующего обучения MBHO) и ENS (будут замерять, насколько прогнозы моделек с определёнными признаками и гиперпараметрами декоррелированы и спосбны помочь ансамблю).
Также планируется большое обновление Diogenes, после которого избыточные признаки опционально будут не удаляться из набора, а сливаться в единый "кластер" c primary (если это будет повышать стабильность). Идея взята из лекций Эрни Чана. Это может быть полезно, когда 1 скрытый драйвер влияет на множество факторов в датасете. Текущая реализация MRMR выбирает 1 фактор с самой сильной MI на таргет, остальные выкидывает, что приводит к потере информации если влияние драйвера на факторы неоднородно по инстансам или времени.
Ещё MRMR получит шаг удаления признака (чтобы сильный признак мог всё же уступать более удачной комбинации) и параллельные списки, когда на каждом шаге не просто берётся лучший кандидат, а N лучших кандидатов формируют "параллельную реальность" (идея взята у Тима Мастерса).
Хочу также изучить гибриды между MRMR и RFECV (например, все признаки отброшенные MRMR прогонять через RFECV).
ML/DS-планы на 2024-й.
Как-то незаметно прошло уже почти полгода! Поймал себя на том, что двигаюсь к своей мини-automl системе. Скажете, почему не возьмёшь готовую? Ответ обычный, хочешь чтоб было сделано хорошо - сделай сам (если у тебя есть экспертиза и классные идеи).
В рамках этой automl системы будут:
1) 2 отборщика признаков из Diogenes, MRMR и RFECV.
MRMR уже получил навык создания комбинаций признаков (feature engineering), его надо ускорить (запараллелить) и лучше потестировать подмодуль с ортогональными полиномами (там будет полезен хороший оптимизатор, сейчас стоит оптуна и работает через пень-колоду)
2) мой будущий классный MBHO оптимизатор HPT. мне уже удалось побить оптуну, гиперопт, скопт в задачах одномерной оптимизации (для решения проблемы feature selection, см бенчи по тегам #featureselection #hpt #optuna #hyperopt #skopt), пора его расширить на многомерный случай
3) модуль ансамблирования ENS. будет простое усреднение (много оттенков) и стэкинг. из ноу-хау тут будут instance-based confidence, numaggs over level 0 predictions, identity level 1 baseline, аугментация табличных данных. Для расширения ENS планируется написать универсальную обёртку для ранней остановки. С этой идеей ношусь уже несколько лет, да никак не сделаю. Смысл обёртки в том, чтобы дать функционал early stopping/overfitting detection тем моделькам, которые сами нативно его не поддерживают - путём partial_fit или дихотомического поиска по n_iterations.
Отборщики признаков получат апгрейд и во время своей работы будут собирать ценную информацию для модулей HPT (MRMR считает базовые статистики признаков, силу связей с таргетами и между собой; RFECV создаёт пары гиперпараметры-ml метрики для последующего обучения MBHO) и ENS (будут замерять, насколько прогнозы моделек с определёнными признаками и гиперпараметрами декоррелированы и спосбны помочь ансамблю).
Также планируется большое обновление Diogenes, после которого избыточные признаки опционально будут не удаляться из набора, а сливаться в единый "кластер" c primary (если это будет повышать стабильность). Идея взята из лекций Эрни Чана. Это может быть полезно, когда 1 скрытый драйвер влияет на множество факторов в датасете. Текущая реализация MRMR выбирает 1 фактор с самой сильной MI на таргет, остальные выкидывает, что приводит к потере информации если влияние драйвера на факторы неоднородно по инстансам или времени.
Ещё MRMR получит шаг удаления признака (чтобы сильный признак мог всё же уступать более удачной комбинации) и параллельные списки, когда на каждом шаге не просто берётся лучший кандидат, а N лучших кандидатов формируют "параллельную реальность" (идея взята у Тима Мастерса).
Хочу также изучить гибриды между MRMR и RFECV (например, все признаки отброшенные MRMR прогонять через RFECV).
🔥7
#featureselection
Классная идея применения коэффициентов Шэпли для отбора признаков!
Задача FS вообще NP-сложная и сводится к выбору оптимального значения бинарного вектора длины n_features (n_features это количество признаков-кандидатов в исходной выборке). Строго говоря, для её точного решения нужно оценить OOS-метрики моделей, обученных на всех возможных сочетаниях признаков от 1 до n_features (2^n_features комбинаций).
Автор же показывает, как, используя свойство аддитивности индивидуальных shap values признаков, можно заменить дорогое обучение модели и выдачу прогноза на комбинации признаков на... просто суммирование shap values этих признаков в большой модели (обученной один раз на всех признаках).
Понятно, что это будет лишь аппроксимацией прогнозов реальной модели, честно (и долго) обученной именно на нужной комбинации признаков, но автор на множестве датасетов оценил точность этой аппроксимации, и её ранжирующие свойства оказались высоки.
PS. Тут надо провести дописследование. Как бы не вытащить себя самих за волосы из болота, как известный барон )
А вообще, конечно, сразу приходят в голову возможные улучшения для этого подхода:
1) обучать вместо одной N больших моделей (с разными HPT и вообще разными алгоритмами
2) обучать вместо одной большой модели на всех признаках M моделей на случайной части 1/M от всех признаков. Потом при оценке комбинаций, полностью попадающих в бакет i=1..M, брать не общую модель, а более конкретную i (ну или взвешенное среднее).
3) комбинация 1 и 2
4) а точно ли не нужно никакое масштабирование частичных сумм значений Шэпли?
Если эта идея рабочая, она позволит расширить область применения полного перебора (а это самый точный метод FS) с 5 (32 честные комбинации) до примерно 40 факторов (1.1 трлн аппроксимированных комбинаций).
Ну и, практически говоря, это поможет и в частичном переборе. Например, получили мы какой-то перспективный список предикторов - от эксперта, RFECV, или как-то ещё. Ну и берём 20-30-40 лучших признаков из списка, насколько потянет железо, и применяем полный аппроксимированный перебор уже к этому сокращённому списку. Профит? Профит.
Посоветовался с чат гпт, после нескольких пинков она даже сама распознала, что
Using SHAP values to approximate the predictions of models trained on specific subsets of features is an innovative approach. The idea is to use the contributions of individual features (as captured by SHAP values) to estimate the predictions of a model that would have been trained on a subset of those features.
Предложила использовать среднее сумм shap values предикторов-кандидатов для коррекции base value, и Interaction-aware SHAP Values.
Через год что, эти чёртовы языковые модели нас полностью превзойдут уже и в научной креативности? )
https://towardsdatascience.com/approximate-predictions-make-feature-selection-radically-faster-0f9664877687
Классная идея применения коэффициентов Шэпли для отбора признаков!
Задача FS вообще NP-сложная и сводится к выбору оптимального значения бинарного вектора длины n_features (n_features это количество признаков-кандидатов в исходной выборке). Строго говоря, для её точного решения нужно оценить OOS-метрики моделей, обученных на всех возможных сочетаниях признаков от 1 до n_features (2^n_features комбинаций).
Автор же показывает, как, используя свойство аддитивности индивидуальных shap values признаков, можно заменить дорогое обучение модели и выдачу прогноза на комбинации признаков на... просто суммирование shap values этих признаков в большой модели (обученной один раз на всех признаках).
Понятно, что это будет лишь аппроксимацией прогнозов реальной модели, честно (и долго) обученной именно на нужной комбинации признаков, но автор на множестве датасетов оценил точность этой аппроксимации, и её ранжирующие свойства оказались высоки.
PS. Тут надо провести дописследование. Как бы не вытащить себя самих за волосы из болота, как известный барон )
А вообще, конечно, сразу приходят в голову возможные улучшения для этого подхода:
1) обучать вместо одной N больших моделей (с разными HPT и вообще разными алгоритмами
2) обучать вместо одной большой модели на всех признаках M моделей на случайной части 1/M от всех признаков. Потом при оценке комбинаций, полностью попадающих в бакет i=1..M, брать не общую модель, а более конкретную i (ну или взвешенное среднее).
3) комбинация 1 и 2
4) а точно ли не нужно никакое масштабирование частичных сумм значений Шэпли?
Если эта идея рабочая, она позволит расширить область применения полного перебора (а это самый точный метод FS) с 5 (32 честные комбинации) до примерно 40 факторов (1.1 трлн аппроксимированных комбинаций).
Ну и, практически говоря, это поможет и в частичном переборе. Например, получили мы какой-то перспективный список предикторов - от эксперта, RFECV, или как-то ещё. Ну и берём 20-30-40 лучших признаков из списка, насколько потянет железо, и применяем полный аппроксимированный перебор уже к этому сокращённому списку. Профит? Профит.
Посоветовался с чат гпт, после нескольких пинков она даже сама распознала, что
Using SHAP values to approximate the predictions of models trained on specific subsets of features is an innovative approach. The idea is to use the contributions of individual features (as captured by SHAP values) to estimate the predictions of a model that would have been trained on a subset of those features.
Предложила использовать среднее сумм shap values предикторов-кандидатов для коррекции base value, и Interaction-aware SHAP Values.
Через год что, эти чёртовы языковые модели нас полностью превзойдут уже и в научной креативности? )
https://towardsdatascience.com/approximate-predictions-make-feature-selection-radically-faster-0f9664877687
Medium
“Approximate-Predictions” Make Feature Selection Radically Faster
Feature selection is so slow because it requires the creation of many models. Find out how to make it blazingly faster thanks to…
🔥2
#featureselection
Подобрался к более детальной проверке идеи из этого поста. Результаты поистине изумительные.
Как мы и знали раньше (из оригинального исследования автора, + моей проверки), корреляция "аппроксимированных предсказаний" и "честных предсказаний", хотя иногда и поднимается выше 90% (если количество признаков-кандидатов близко к полному количеству признаков), в среднем звёзд с неба не хватает.
Я взял датасет poker из pycaret, т.к. там достаточно наблюдений (100k), и дополнительно к к-ту корреляции посчитал RMSE честных и аппроксимированных предсказаний. Выяснился печальный факт, что RMSE просто среднего таргета по выборке (dummy) зачастую побеждает авторский способ оценки (naive).
Я расстроился, но, помня красивые графики автора, всё-таки посчитал реальные ошибки ground truth vs naive predictions, а уже от них NDCG в разрезе наборов признаков-кандидатов.
И был просто шокирован.
ndcg(naive_opt_fin_rmse)=0.99995 по 50 наборам признаков-кандидатов с числом признаков от 1 до 9 (всего в датасете их 10).
То есть, из Shap-значений нельзя вытащить прям точные аппроксимации честных прогнозов (слишком высокая RMSE). Но и не надо: даже эти аппроксимации позволяют с высокой точностью ранжировать наборы признаков-кандидатов (удивительно высокий NDCG).
Почему? Загадка. Видимо, движения "в нужном направлении" достаточно для точного ранжирования, и это важнее, чем абсолютная величина совпадения прогнозов. Здесь, похоже, действуют какие-то тонкие математические эффекты, которых я не понимаю. Но эта идея реально работает.
На датасете poker "честное переобучение" модельки занимает у меня 8 секунд, а оценка авторским методом 0,005 секунд. Ускорение в 1500+ раз при 0.99995 условной точности ранжирования.
"Условной", потому что на больших списках ndcg становится "логарифмически нечувствительным" к хорошему ранжированию. Например, случайное ранжирование в этой же задаче (с теми же релевантностями) на списке размером 50 выдаёт NDCG=0.987.
Если же отказаться от абсолютной шкалы целевой ML-метрики, и в качестве релевантностей использовать целые числа [1,2,..,N], NDCG случайного ранжирования становится в среднем 0,827, а NDCG авторского ранжирования 0,968. Ну то есть, это прекрасный значимый результат.
Подобрался к более детальной проверке идеи из этого поста. Результаты поистине изумительные.
Как мы и знали раньше (из оригинального исследования автора, + моей проверки), корреляция "аппроксимированных предсказаний" и "честных предсказаний", хотя иногда и поднимается выше 90% (если количество признаков-кандидатов близко к полному количеству признаков), в среднем звёзд с неба не хватает.
Я взял датасет poker из pycaret, т.к. там достаточно наблюдений (100k), и дополнительно к к-ту корреляции посчитал RMSE честных и аппроксимированных предсказаний. Выяснился печальный факт, что RMSE просто среднего таргета по выборке (dummy) зачастую побеждает авторский способ оценки (naive).
Я расстроился, но, помня красивые графики автора, всё-таки посчитал реальные ошибки ground truth vs naive predictions, а уже от них NDCG в разрезе наборов признаков-кандидатов.
И был просто шокирован.
ndcg(naive_opt_fin_rmse)=0.99995 по 50 наборам признаков-кандидатов с числом признаков от 1 до 9 (всего в датасете их 10).
То есть, из Shap-значений нельзя вытащить прям точные аппроксимации честных прогнозов (слишком высокая RMSE). Но и не надо: даже эти аппроксимации позволяют с высокой точностью ранжировать наборы признаков-кандидатов (удивительно высокий NDCG).
Почему? Загадка. Видимо, движения "в нужном направлении" достаточно для точного ранжирования, и это важнее, чем абсолютная величина совпадения прогнозов. Здесь, похоже, действуют какие-то тонкие математические эффекты, которых я не понимаю. Но эта идея реально работает.
На датасете poker "честное переобучение" модельки занимает у меня 8 секунд, а оценка авторским методом 0,005 секунд. Ускорение в 1500+ раз при 0.99995 условной точности ранжирования.
"Условной", потому что на больших списках ndcg становится "логарифмически нечувствительным" к хорошему ранжированию. Например, случайное ранжирование в этой же задаче (с теми же релевантностями) на списке размером 50 выдаёт NDCG=0.987.
Если же отказаться от абсолютной шкалы целевой ML-метрики, и в качестве релевантностей использовать целые числа [1,2,..,N], NDCG случайного ранжирования становится в среднем 0,827, а NDCG авторского ранжирования 0,968. Ну то есть, это прекрасный значимый результат.
Telegram
Aspiring Data Science
#featureselection
Классная идея применения коэффициентов Шэпли для отбора признаков!
Задача FS вообще NP-сложная и сводится к выбору оптимального значения бинарного вектора длины n_features (n_features это количество признаков-кандидатов в исходной выборке).…
Классная идея применения коэффициентов Шэпли для отбора признаков!
Задача FS вообще NP-сложная и сводится к выбору оптимального значения бинарного вектора длины n_features (n_features это количество признаков-кандидатов в исходной выборке).…
🔥4
#featureselection
В дополнение к посту. Потестировал много вариантов улучшения исходной идеи:
1) усреднение значений Шэпли нескольких типов (с разными feature_perturbation)
2) усреднение значений Шэпли нескольких разных моделей
3) использование парных интеракций (shap_interaction_values)
4) мета-модель ML: зная индексы выбранных в комбинацию признаков и оставшихся признаков, а также честные предсказания моделек, давайте попробуем создать как мета-признаки ряд простых числовых агрегатов от шепли-значений (суммы, средние, отклонения, мин/макс и тп). ну и уже от этого мета-модель, вдруг она будет точнее чем исходная простая идея просуммировать значения Шепли выбранных в комбинацию признаков?
Находки/открытия:
1) не существует работающей реализации Shap на GPU (GPUTreeExplainer из пакета shap нерабочий, и всем похер. По идее он должен ставиться с xgboost (без shap), но он всё равно не юзает gpu, я проверял.)
2) KernelExplainer непроходимо медленен, забудьте про его использование. Речь о сотнях часов даже на небольшом датасете.
3) некоторые модели (lightgbm) считают интеракции в один поток и очень медленно (~40 минут на 100k x 20 датасете)
4) некоторые бустинги (Catboost) раздувают expected_value так, что они не просто не сходятся точно к среднему прогнозу, а превышают его вдвое. При этом внутренняя проверка shap на аддитивность проходит! ХЗ как это возможно. У других бустингов тоже такое наблюдалось, но хотя бы с гораздо меньшей амплитудой. В режиме feature_perturbation="tree_path_dependent" такого никогда не наблюдал.
5) Режим feature_perturbation="interventional" требует теневого датасета и считает значения Шэпли на порядки дольше, но ничего не даёт к точности.
6) xgboost (и только он) поддерживает доп параметр approximate=True, который отрабатывает быстрее, но реально роняет качество. его использовать не надо.
7) документация shap по-прежнему дырявая (параметры объясняльщика, которые ничего не делают, например), а на гитхабе никто по-прежнему не отвечает и не отрабатывает сигналы и проблемы юзеров. не понимаю, как они при этом релизят новые версии, скорее всего, это в основном переписывания исходного говнокода Скотта Ландберга.
Ну и самое главное, по поводу аппроксимации честных прогнозов шэпли-значениями.
1) все виды бустингов и все виды объясняльщиков для нашей задачи имеют примерно одинаковое качество (если не использовалось approximate=True)
2) усреднения ничего особо не меняют.
3) метамодель существенно улучшает линейную (да и другие) корреляцию, но особо не меняет метрики ранжирования комбинаций (которые и так на удивление хороши).
4) при небольшой по размеру группе кандидатов на удивление ранжирующие свойства сильно не падают.
В дополнение к посту. Потестировал много вариантов улучшения исходной идеи:
1) усреднение значений Шэпли нескольких типов (с разными feature_perturbation)
2) усреднение значений Шэпли нескольких разных моделей
3) использование парных интеракций (shap_interaction_values)
4) мета-модель ML: зная индексы выбранных в комбинацию признаков и оставшихся признаков, а также честные предсказания моделек, давайте попробуем создать как мета-признаки ряд простых числовых агрегатов от шепли-значений (суммы, средние, отклонения, мин/макс и тп). ну и уже от этого мета-модель, вдруг она будет точнее чем исходная простая идея просуммировать значения Шепли выбранных в комбинацию признаков?
Находки/открытия:
1) не существует работающей реализации Shap на GPU (GPUTreeExplainer из пакета shap нерабочий, и всем похер. По идее он должен ставиться с xgboost (без shap), но он всё равно не юзает gpu, я проверял.)
2) KernelExplainer непроходимо медленен, забудьте про его использование. Речь о сотнях часов даже на небольшом датасете.
3) некоторые модели (lightgbm) считают интеракции в один поток и очень медленно (~40 минут на 100k x 20 датасете)
4) некоторые бустинги (Catboost) раздувают expected_value так, что они не просто не сходятся точно к среднему прогнозу, а превышают его вдвое. При этом внутренняя проверка shap на аддитивность проходит! ХЗ как это возможно. У других бустингов тоже такое наблюдалось, но хотя бы с гораздо меньшей амплитудой. В режиме feature_perturbation="tree_path_dependent" такого никогда не наблюдал.
5) Режим feature_perturbation="interventional" требует теневого датасета и считает значения Шэпли на порядки дольше, но ничего не даёт к точности.
6) xgboost (и только он) поддерживает доп параметр approximate=True, который отрабатывает быстрее, но реально роняет качество. его использовать не надо.
7) документация shap по-прежнему дырявая (параметры объясняльщика, которые ничего не делают, например), а на гитхабе никто по-прежнему не отвечает и не отрабатывает сигналы и проблемы юзеров. не понимаю, как они при этом релизят новые версии, скорее всего, это в основном переписывания исходного говнокода Скотта Ландберга.
Ну и самое главное, по поводу аппроксимации честных прогнозов шэпли-значениями.
1) все виды бустингов и все виды объясняльщиков для нашей задачи имеют примерно одинаковое качество (если не использовалось approximate=True)
2) усреднения ничего особо не меняют.
3) метамодель существенно улучшает линейную (да и другие) корреляцию, но особо не меняет метрики ранжирования комбинаций (которые и так на удивление хороши).
4) при небольшой по размеру группе кандидатов на удивление ранжирующие свойства сильно не падают.
Telegram
Aspiring Data Science
#featureselection
Подобрался к более детальной проверке идеи из этого поста. Результаты поистине изумительные.
Как мы и знали раньше (из оригинального исследования автора, + моей проверки), корреляция "аппроксимированных предсказаний" и "честных предсказаний"…
Подобрался к более детальной проверке идеи из этого поста. Результаты поистине изумительные.
Как мы и знали раньше (из оригинального исследования автора, + моей проверки), корреляция "аппроксимированных предсказаний" и "честных предсказаний"…
🔥3
#featureselection
Вот внесэмпловые метрики XGBRegressor feature_perturbation=tree_path_dependent, approximate=False из предыдущего поста.
meta=мета-моделька, naive это просто сумма шэпли-значений как у автора идеи, adjusted это naive минус сумма шэпли-значений признаков не вошедших в комбинацию.
Считалось на датасете poker (10 исходных признаков + 5 фейковых случайных + 5 коррелированных с исходными). Помимо 2 видов ndgc (rel/abs), грубыми, но выразительными метриками были top_recall@k. Например, чтобы посчитать recall@10, брались 10 лучших (согласно честными прогнозам) на test комбинаций, и проверялось, сколько из них оказались в 10 лучших по версии того или иного метода.
В целом, для данной задачи нет смысла морочиться с мета-моделью, надо просто брать наивный оригинальный метод автора, и feature_perturbation="tree_path_dependent".
Вот внесэмпловые метрики XGBRegressor feature_perturbation=tree_path_dependent, approximate=False из предыдущего поста.
meta=мета-моделька, naive это просто сумма шэпли-значений как у автора идеи, adjusted это naive минус сумма шэпли-значений признаков не вошедших в комбинацию.
Считалось на датасете poker (10 исходных признаков + 5 фейковых случайных + 5 коррелированных с исходными). Помимо 2 видов ndgc (rel/abs), грубыми, но выразительными метриками были top_recall@k. Например, чтобы посчитать recall@10, брались 10 лучших (согласно честными прогнозам) на test комбинаций, и проверялось, сколько из них оказались в 10 лучших по версии того или иного метода.
В целом, для данной задачи нет смысла морочиться с мета-моделью, надо просто брать наивный оригинальный метод автора, и feature_perturbation="tree_path_dependent".
👍1
#featureselection #shap
Ну и теперь к практической реализации отборщика признаков на основе этой прекрасной идеи. Как это вообще сделать?
Обучать одну большую модель на всех признаках надо обязательно. Это, по счастливому совпадению, 1-й шаг всех RFE-* методов.
Далее получаем "простые" кэфы Шэпли самым быстрым (но не приближённым) методом. По желанию усредняем на CV.
И тут открывается простор для фантазии:
Полный брутфорс:
Генерим все 2^n_features сочетаний признаков, сортируем индексы признаков в сочетаниях.
суммируем шэпли-значения 1й комбинации. далее удаляем суммы убывших, прибавляем суммы прибывших в комбинацию признаков. раз в N итераций ресет суммы, чтобы сбросить накопленную ошибку суммирования.
Генетик:
Вектор 1/0 длины n_features генов - это особь популяции, её фитнесс оценивать мы умеем (суммируя его шэпли-значения и считая от них и ground truth нашу ml-метрику).
применяем направленный поиск путём скрещивания, мутаций, и прочего элитизма. Запускаем эволюцию, играем в Создателя, смеёмся страшным голосом mwa-ha-ha.
Любая другая эвристика, типа имитации отжига:
Начинаем со случайного вектора, делаем небольшие изменения, продвигаемся с вероятностью пропорциональной улучшениям, порог принятия снижается со временем.
Мультистарт. А если начинать с кандидатов ранжированных по FI?
Градиентный поиск:
Ну да, это ж бинарный вектор, нет непрерывности, как по нему дифференцировать? Есть идея применить "признаки Шрёдингера"! ))
А именно, размазать их бинарность с помощью весового коэффициента. Они могут как бы входить, а как бы и нет в комбинацию с определённым весом. А чтобы вес в итоге ограничивался промежутком [0,1], к нему можно применить сигмоиду. Тем самым autograd-оптимизатор по идее сможет найти экстремумы ML-метрики, плавно включив/исключив признаки из комбинации.
А если итоговая ML-метрика недифференцируема (типа ROC, PR AUC)? Ну тогда ведь можно взять Brier score или какую-то подходящую прокси.
Уже есть набросок кода для pytorch, попробую затестить.
Не знаю, что сработает лучше, есть надежды на градик.
В любом случае, надо дать методу оптимизации поработать (в рамках бюджета времени), и получить от него топ-N лучших кандидатов. А их уже "честно" проверить (в оставшееся время) на insample CV и вернуть самую лучшую/устойчивую комбинацию признаков.
Надо ещё помнить, что точность метода может падать при уменьшении количества кандидатов в группе по сравнению с размерностью матрицы значений Шэпли, но это обсудим позже.
Ну и теперь к практической реализации отборщика признаков на основе этой прекрасной идеи. Как это вообще сделать?
Обучать одну большую модель на всех признаках надо обязательно. Это, по счастливому совпадению, 1-й шаг всех RFE-* методов.
Далее получаем "простые" кэфы Шэпли самым быстрым (но не приближённым) методом. По желанию усредняем на CV.
И тут открывается простор для фантазии:
Полный брутфорс:
Генерим все 2^n_features сочетаний признаков, сортируем индексы признаков в сочетаниях.
суммируем шэпли-значения 1й комбинации. далее удаляем суммы убывших, прибавляем суммы прибывших в комбинацию признаков. раз в N итераций ресет суммы, чтобы сбросить накопленную ошибку суммирования.
Генетик:
Вектор 1/0 длины n_features генов - это особь популяции, её фитнесс оценивать мы умеем (суммируя его шэпли-значения и считая от них и ground truth нашу ml-метрику).
применяем направленный поиск путём скрещивания, мутаций, и прочего элитизма. Запускаем эволюцию, играем в Создателя, смеёмся страшным голосом mwa-ha-ha.
Любая другая эвристика, типа имитации отжига:
Начинаем со случайного вектора, делаем небольшие изменения, продвигаемся с вероятностью пропорциональной улучшениям, порог принятия снижается со временем.
Мультистарт. А если начинать с кандидатов ранжированных по FI?
Градиентный поиск:
Ну да, это ж бинарный вектор, нет непрерывности, как по нему дифференцировать? Есть идея применить "признаки Шрёдингера"! ))
А именно, размазать их бинарность с помощью весового коэффициента. Они могут как бы входить, а как бы и нет в комбинацию с определённым весом. А чтобы вес в итоге ограничивался промежутком [0,1], к нему можно применить сигмоиду. Тем самым autograd-оптимизатор по идее сможет найти экстремумы ML-метрики, плавно включив/исключив признаки из комбинации.
А если итоговая ML-метрика недифференцируема (типа ROC, PR AUC)? Ну тогда ведь можно взять Brier score или какую-то подходящую прокси.
Уже есть набросок кода для pytorch, попробую затестить.
Не знаю, что сработает лучше, есть надежды на градик.
В любом случае, надо дать методу оптимизации поработать (в рамках бюджета времени), и получить от него топ-N лучших кандидатов. А их уже "честно" проверить (в оставшееся время) на insample CV и вернуть самую лучшую/устойчивую комбинацию признаков.
Надо ещё помнить, что точность метода может падать при уменьшении количества кандидатов в группе по сравнению с размерностью матрицы значений Шэпли, но это обсудим позже.
#news #hpt #hpo #mbho #transferlearning #pmbho
Начинаю работу над одним из самых амбициозных своих ML проектов - оптимизатором гиперпараметров, основанном на моделях (PMBHO, Persistent Model Based Heuristic Optimizer).
Это следующий шаг в цепочке GridSearch->RandomSearch->HalvingRandomSearch->BayesianSearch.
BayesianSearch используется в оптимизаторах вроде optuna и hyperopt, которые вроде как считаются сейчас state of the art. На самом деле от Байесовского подхода там немного, по сути это скорее оптимизация "одноруких бандитов" поверх простенькой суррогатной модели, как правило, ГП - гауссова процесса (т.к. он позволяет учитывать неопределённость).
Недостатки BayesianSearch:
1) ГП откровенно слабоват как модель, часто бывает трудно подобрать подходящее ядро
2) не всё гладко с категорийками
3) никак не учитывается природа и структура данных - признаков и таргета
4) никак не учитываются знания, полученные при работе с другими датасетами
5) это уже недостаток конкретных реализаций - современные библиотеки подбора гиперпараметров обычно ни хрена не знают, какие собственно гиперпараметры есть у каких классов моделей. обычно юзеры сами задают поисковые пространства для 5-10 HP (при том что у современных бустингов их десятки)
6) библиотеки никак не отрабатывают конфликты гиперпараметров - юзерам предлагается разруливать всё вручную, из-за чего все и забивают на большинство HP и ограничиваются 5-6 самыми неконфликтными.
7) почти все известные мне оптимизаторы за оптимальный набор HP считают ту единственную точку в пространстве поиска, что достигает экстремума по нужной ML-метрике на CV. При этом никак не учитывается устойчивость в близких областях, что приводит к катастрофам на OOS (Out-of-Sample).
В результате десятки тысяч дата-сайентистов по всему миру для каждого нового проекта молотят сотни тысяч комбинаций гиперпараметров "каждый раз как в первый раз". There... There must be a better way! )
Гипотеза: есть мнение, что по некоторым базовым статистикам признаков и таргета (и их связей) уже можно определить перспективные наборы гиперпараметров.
А обучив несколько неглубоких моделек с фиксированными HP (назовём их "золотой стандарт") и изучив производные от их атрибутов (важностей признаков, кривых обучения и валидации по набору ML метрик), можно существенно повысить точность рекомендаций практически в реальном времени.
Решение: свой оптимизатор, основанный на принципе exploration-exploitation и на ранжировании кандидатов с помощью мета-модели, натренированной на разных датасетах и богатом наборе мета-данных. Периодически по мере проверки кандидатов на конкретной задаче можно основную модель подстраивать/файнтюнить (брать основной датасет с обычными весами+подмешивать актуальный датасет с большими весами). Оптимизатор интеллектуальный и будет учитывать значения и гладкость МЛ-метрик в ближайших окрестностях точек-кандидатов, знать, какие гиперпараметры есть у конкретного класса моделей и иметь таблицы конфликтов (например, будет знать, какие гиперпараметры недоступны на GPU).
В теории такой оптимизатор может быть эффективнее решений типа оптуны в разы. А может и не быть. При этом подход требует проведения огромного количества вычислений и экспериментов при подготовке мета-датасета, не говоря уже о программерской работе. Но, считаю, цель стоит усилий и риска.
Напомню, что у меня уже есть одномерный MBHO оптимизатор (сделанный для задачи #featureselection), и по результатам тестов мне удалось побить и оптуну, и гиперотпт, и эскаопт.
На самом деле, моя цель еще более амбициозная - в идеале я бы хотел для заданного датасета (сырые признаки+таргет+МЛ задача) быстро определять не только оптимальные классы МЛ моделей и их гиперпараметры, но и оптимальный препроцессинг (нейлинейные преобразования, PolynomialFeatures, сплайны, обработка категориальных входов, ядра, шкалирование, понижение размерности ) и трансформацию таргета (для задач регрессии). Пока неясно, можно ли эти 2 задачи эффективно увязать вместе.
Временные ряды в этой постановке - отдельная боль.
Как всегда, буду рад советам и конструктивной критике.
Начинаю работу над одним из самых амбициозных своих ML проектов - оптимизатором гиперпараметров, основанном на моделях (PMBHO, Persistent Model Based Heuristic Optimizer).
Это следующий шаг в цепочке GridSearch->RandomSearch->HalvingRandomSearch->BayesianSearch.
BayesianSearch используется в оптимизаторах вроде optuna и hyperopt, которые вроде как считаются сейчас state of the art. На самом деле от Байесовского подхода там немного, по сути это скорее оптимизация "одноруких бандитов" поверх простенькой суррогатной модели, как правило, ГП - гауссова процесса (т.к. он позволяет учитывать неопределённость).
Недостатки BayesianSearch:
1) ГП откровенно слабоват как модель, часто бывает трудно подобрать подходящее ядро
2) не всё гладко с категорийками
3) никак не учитывается природа и структура данных - признаков и таргета
4) никак не учитываются знания, полученные при работе с другими датасетами
5) это уже недостаток конкретных реализаций - современные библиотеки подбора гиперпараметров обычно ни хрена не знают, какие собственно гиперпараметры есть у каких классов моделей. обычно юзеры сами задают поисковые пространства для 5-10 HP (при том что у современных бустингов их десятки)
6) библиотеки никак не отрабатывают конфликты гиперпараметров - юзерам предлагается разруливать всё вручную, из-за чего все и забивают на большинство HP и ограничиваются 5-6 самыми неконфликтными.
7) почти все известные мне оптимизаторы за оптимальный набор HP считают ту единственную точку в пространстве поиска, что достигает экстремума по нужной ML-метрике на CV. При этом никак не учитывается устойчивость в близких областях, что приводит к катастрофам на OOS (Out-of-Sample).
В результате десятки тысяч дата-сайентистов по всему миру для каждого нового проекта молотят сотни тысяч комбинаций гиперпараметров "каждый раз как в первый раз". There... There must be a better way! )
Гипотеза: есть мнение, что по некоторым базовым статистикам признаков и таргета (и их связей) уже можно определить перспективные наборы гиперпараметров.
А обучив несколько неглубоких моделек с фиксированными HP (назовём их "золотой стандарт") и изучив производные от их атрибутов (важностей признаков, кривых обучения и валидации по набору ML метрик), можно существенно повысить точность рекомендаций практически в реальном времени.
Решение: свой оптимизатор, основанный на принципе exploration-exploitation и на ранжировании кандидатов с помощью мета-модели, натренированной на разных датасетах и богатом наборе мета-данных. Периодически по мере проверки кандидатов на конкретной задаче можно основную модель подстраивать/файнтюнить (брать основной датасет с обычными весами+подмешивать актуальный датасет с большими весами). Оптимизатор интеллектуальный и будет учитывать значения и гладкость МЛ-метрик в ближайших окрестностях точек-кандидатов, знать, какие гиперпараметры есть у конкретного класса моделей и иметь таблицы конфликтов (например, будет знать, какие гиперпараметры недоступны на GPU).
В теории такой оптимизатор может быть эффективнее решений типа оптуны в разы. А может и не быть. При этом подход требует проведения огромного количества вычислений и экспериментов при подготовке мета-датасета, не говоря уже о программерской работе. Но, считаю, цель стоит усилий и риска.
Напомню, что у меня уже есть одномерный MBHO оптимизатор (сделанный для задачи #featureselection), и по результатам тестов мне удалось побить и оптуну, и гиперотпт, и эскаопт.
На самом деле, моя цель еще более амбициозная - в идеале я бы хотел для заданного датасета (сырые признаки+таргет+МЛ задача) быстро определять не только оптимальные классы МЛ моделей и их гиперпараметры, но и оптимальный препроцессинг (нейлинейные преобразования, PolynomialFeatures, сплайны, обработка категориальных входов, ядра, шкалирование, понижение размерности ) и трансформацию таргета (для задач регрессии). Пока неясно, можно ли эти 2 задачи эффективно увязать вместе.
Временные ряды в этой постановке - отдельная боль.
Как всегда, буду рад советам и конструктивной критике.
⚡3🔥3
#featureselection #featureextraction
Простенькое, но приятное интро в FS/FX.
https://www.youtube.com/watch?v=rxiORUw-nKs&
Простенькое, но приятное интро в FS/FX.
https://www.youtube.com/watch?v=rxiORUw-nKs&
YouTube
Основы машинного обучения, лекция 16 — отбор признаков
Курс "Основы машинного обучения", майнор "Интеллектуальный анализ данных", НИУ ВШЭ
Лектор — Евгений Соколов
Страничка курса: http://wiki.cs.hse.ru/Основы_машинного_обучения
Все видео курса: https://www.youtube.com/playlist?list=PLEwK9wdS5g0rco8Fan1hA…
Лектор — Евгений Соколов
Страничка курса: http://wiki.cs.hse.ru/Основы_машинного_обучения
Все видео курса: https://www.youtube.com/playlist?list=PLEwK9wdS5g0rco8Fan1hA…
#featureselection #redundancy #indicators #trading #hurst
https://www.youtube.com/watch?v=x_JcExwuu60
https://www.youtube.com/watch?v=x_JcExwuu60
YouTube
David Aronson of Hood River on data mining & Hurst signals - at The Trading Show Chicago 2013
David Aronson, President of Hood River Research, gave a presentation at The Trading Show Chicago 2013 on the topic, 'Rapid identification of non-redundant predictors with data mining bias correction and its application to extreme Hurst signals.'
The Trading…
The Trading…
#trading #stationarity #chan #bagging #featureselection #stepwise
Мастерс, кстати, тоже утверждает, что в финансовые модели вообще нельзя брать нестационарные факторы.
По моему опыту, всё-таки в некоторой мере можно. Но, видимо, лучше их преобразовать )
https://www.youtube.com/watch?v=OxNcA6RO_ZE
Мастерс, кстати, тоже утверждает, что в финансовые модели вообще нельзя брать нестационарные факторы.
По моему опыту, всё-таки в некоторой мере можно. Но, видимо, лучше их преобразовать )
https://www.youtube.com/watch?v=OxNcA6RO_ZE
YouTube
Enhancing Statistical Significance of Backtests by Dr. Ernest Chan at QuantCon 2017
Insufficient historical data is a major hurdle in building a trading model free from data snooping bias. Dr. Chan's talk will discuss several techniques, some borrowed from machine learning, that can alleviate overfitting and enhance the statistical significance…
#featureselection #chan
Я напомню про вот эту классную лекцию по отбору признаков и оценке их важности. Эрни тут даёт неправильное определение bias & variance (нет, это не in-sample vs out-of-sample ошибки, но я понимаю его идею).
Что же касается важности, они действительно для одной и той же модели значительно меняется при разных случайных сидах ) Так что имейте в виду и усредняйте оценки.
https://www.youtube.com/watch?v=2-5HYJ0HhyQ
Я напомню про вот эту классную лекцию по отбору признаков и оценке их важности. Эрни тут даёт неправильное определение bias & variance (нет, это не in-sample vs out-of-sample ошибки, но я понимаю его идею).
Что же касается важности, они действительно для одной и той же модели значительно меняется при разных случайных сидах ) Так что имейте в виду и усредняйте оценки.
https://www.youtube.com/watch?v=2-5HYJ0HhyQ
YouTube
E P Chan: Improving Trading Strategies with Machine Learning, Feature Selection 20210318
The overfitting quandary in Machine Learning.has been resolved using Random Forest Classifiers. For Financial Machine Learning, Lopez de Prado came up with Meta Labeling and Dr Chan and others are applying it in his Tail Reaper Fund, and offering a service.…
#ensembling #featureselection #papers #todo
Ensemble Selection from Libraries of Models
Rich Caruana, Alexandru Niculescu-Mizil, Geoff Crew, Alex Ksikes
Простой метод ансамблирования 20-летней давности, возможно, незаслуженно обделённый вниманием. (Именно его авторы auto-sklearn отмаечают как превосходящий по качеству стэкинг.)
"We present a method for constructing ensembles from libraries of thousands of models. Model libraries are generated using different learning algorithms and parameter settings.
Forward stepwise selection is used to add to the ensemble the models that maximize its performance.
Ensemble selection allows ensembles to be optimized to performance metric such as accuracy, cross entropy, mean precision, or ROC Area. Experiments with seven test problems and ten metrics demonstrate the benefit of ensemble selection."
Что удивительно, есть прямая параллель между выбором "артистов" в ансамбль и ... просто выбором признаков в одиночную модель. Только, в отличие от последнего, качество ансамбля подсчитать можно очень быстро (это же усреднение предсказаний), не надо (пере)обучать потенциально медленную модель.
В статье использован жадный алгоритм выбора, когда на каждом шаге к ансамблю добавляется самый "перформящий" (совместно с уже выбранными) на валидации кандидат.
Находкой авторов, видимо, стоит считать выбор кандидатов с возвращением, когда вхождение модели в ансамбль может рассматриваться неоднократно, причём на разных этапах (эквивалент веса):
"Selection with replacement flattens the curve so much that a test set is not needed to determine when to stop adding models to the ensemble. The hillclimbing set can be used to stop hillclimbing. This means ensemble selection does not need more test sets than the base-level models would have used to select model parameters. Ensemble selection uses the validation set to do both parameter and model selection."
Что ещё очень интересно, для борьбы с оверфитом валидационного множества они вводят 50%-ный бэггинг моделей, но повторяют всю процедуру построения ансамбля 20 раз, так что итоговое решение - это среднее 20 ансамблей 🤪
Глядя на таблицу результатов, кажется, что стэкинг они реализовали неправильно, ну не может он быть таким плохим. Вот как они это объясняют:
"Stacking (Wolpert, 1992) with logistic regression performs poorly because regression overfits dramatically when there are 2000 highly correlated input models and only 1k points in the validation set."
Видимо, отсюда и проблемы, ведь стэкинг лучше делать на CV, а не на одном множестве.
Ко всей методологии сравнения у меня есть 1 большая претензия: похоже, что все тестовые множества были сгенерированы 1 раз. Ну не серьёзно. Я понимаю, что и так объём вычислений был большой, но... (
Тем не менее, главные результаты статьи в том, что ансамблирование байесовским усреднением моделей, и особенно прямым отбором моделей значительно лучше даже индивидуально самых лучших моделей.
Я постараюсь повторить это исследование в рамках создания своего тюнера Diogenes, с бОльшим количеством HP-шек на модель, более современными моделями, метриками включающими и "резкость" и калибрацию, бОльшим количеством альтернативных методов ансамблирования.
Интересно, а если полностью затюнить ансамбль сначала на одну, потом на другую метрику, получится ли улучшить обе, как обсуждалось ранее?
Попросил "размышляющие" версии AI проанализировать интересные аспекты и слабости статьи. Deepseek R1 справилась куда лучше OpenAI O3-mini. Gemini 2.0 жёстко галлюцинировала.
https://www.cs.cornell.edu/~alexn/papers/shotgun.icml04.revised.rev2.pdf
Ensemble Selection from Libraries of Models
Rich Caruana, Alexandru Niculescu-Mizil, Geoff Crew, Alex Ksikes
Простой метод ансамблирования 20-летней давности, возможно, незаслуженно обделённый вниманием. (Именно его авторы auto-sklearn отмаечают как превосходящий по качеству стэкинг.)
"We present a method for constructing ensembles from libraries of thousands of models. Model libraries are generated using different learning algorithms and parameter settings.
Forward stepwise selection is used to add to the ensemble the models that maximize its performance.
Ensemble selection allows ensembles to be optimized to performance metric such as accuracy, cross entropy, mean precision, or ROC Area. Experiments with seven test problems and ten metrics demonstrate the benefit of ensemble selection."
Что удивительно, есть прямая параллель между выбором "артистов" в ансамбль и ... просто выбором признаков в одиночную модель. Только, в отличие от последнего, качество ансамбля подсчитать можно очень быстро (это же усреднение предсказаний), не надо (пере)обучать потенциально медленную модель.
В статье использован жадный алгоритм выбора, когда на каждом шаге к ансамблю добавляется самый "перформящий" (совместно с уже выбранными) на валидации кандидат.
Находкой авторов, видимо, стоит считать выбор кандидатов с возвращением, когда вхождение модели в ансамбль может рассматриваться неоднократно, причём на разных этапах (эквивалент веса):
"Selection with replacement flattens the curve so much that a test set is not needed to determine when to stop adding models to the ensemble. The hillclimbing set can be used to stop hillclimbing. This means ensemble selection does not need more test sets than the base-level models would have used to select model parameters. Ensemble selection uses the validation set to do both parameter and model selection."
Что ещё очень интересно, для борьбы с оверфитом валидационного множества они вводят 50%-ный бэггинг моделей, но повторяют всю процедуру построения ансамбля 20 раз, так что итоговое решение - это среднее 20 ансамблей 🤪
Глядя на таблицу результатов, кажется, что стэкинг они реализовали неправильно, ну не может он быть таким плохим. Вот как они это объясняют:
"Stacking (Wolpert, 1992) with logistic regression performs poorly because regression overfits dramatically when there are 2000 highly correlated input models and only 1k points in the validation set."
Видимо, отсюда и проблемы, ведь стэкинг лучше делать на CV, а не на одном множестве.
Ко всей методологии сравнения у меня есть 1 большая претензия: похоже, что все тестовые множества были сгенерированы 1 раз. Ну не серьёзно. Я понимаю, что и так объём вычислений был большой, но... (
Тем не менее, главные результаты статьи в том, что ансамблирование байесовским усреднением моделей, и особенно прямым отбором моделей значительно лучше даже индивидуально самых лучших моделей.
Я постараюсь повторить это исследование в рамках создания своего тюнера Diogenes, с бОльшим количеством HP-шек на модель, более современными моделями, метриками включающими и "резкость" и калибрацию, бОльшим количеством альтернативных методов ансамблирования.
Интересно, а если полностью затюнить ансамбль сначала на одну, потом на другую метрику, получится ли улучшить обе, как обсуждалось ранее?
Попросил "размышляющие" версии AI проанализировать интересные аспекты и слабости статьи. Deepseek R1 справилась куда лучше OpenAI O3-mini. Gemini 2.0 жёстко галлюцинировала.
https://www.cs.cornell.edu/~alexn/papers/shotgun.icml04.revised.rev2.pdf
#featureengineering #pysr #symbolicregression
На самом деле, подход символьной регрессии перекликается с моей идеей использования информационно-теоретических метрик.
Читаю сейчас статью pysr, у них интересный подход с генетиком над признаками, отобранными бустингом.
Очень хочу сравнить их результаты со своими на том же игрушечном примере.
Для естественных наук приложение прямое, для машинного обучения, естественно, приложение может быть в создании новых хороших признаков.
Ps. ДА! pysr отлично справился с моим примером!
после ~6 минут работы
На самом деле, подход символьной регрессии перекликается с моей идеей использования информационно-теоретических метрик.
Читаю сейчас статью pysr, у них интересный подход с генетиком над признаками, отобранными бустингом.
Очень хочу сравнить их результаты со своими на том же игрушечном примере.
Для естественных наук приложение прямое, для машинного обучения, естественно, приложение может быть в создании новых хороших признаков.
Ps. ДА! pysr отлично справился с моим примером!
import numpy as np, pandas as pd
n =100_000
a = np.random.rand(n)
b = np.random.rand(n)
c = np.random.rand(n)
d = np.random.rand(n)
e = np.random.rand(n)
f = np.random.rand(n)
y=a**2/b+f/5+np.log(c)*np.sin(d)
df = pd.DataFrame(
{
"a": a,
"b": b,
"c": c,
"d": d,
"e": e,
}
)
from pysr import PySRRegressor
model = PySRRegressor(
maxsize=20,
niterations=40, # < Increase me for better results
binary_operators=["+", "*"],
unary_operators=[
"cos",
"exp",
"log",
"sin",
"inv(x) = 1/x",
# ^ Custom operator (julia syntax)
],
extra_sympy_mappings={"inv": lambda x: 1 / x},
# ^ Define operator for SymPy as well
elementwise_loss="loss(prediction, target) = (prediction - target)^2",
# ^ Custom loss function (julia syntax)
)
model.fit(df, y)
model.get_best()
после ~6 минут работы
complexity 14
loss 0.003329
score 0.947915
sympy_format a**2/b + log(c)*sin(d) + 0.09998281
Telegram
Aspiring Data Science
#featureengineering #featureselection #diogenes
n =100_000
a = np.random.rand(n)
b = np.random.rand(n)
c = np.random.rand(n)
d = np.random.rand(n)
e = np.random.rand(n)
f = np.random.rand(n)
y=a**2/b+f/5+np.log(c)*np.sin(d)
df = pd.DataFrame(
{
…
n =100_000
a = np.random.rand(n)
b = np.random.rand(n)
c = np.random.rand(n)
d = np.random.rand(n)
e = np.random.rand(n)
f = np.random.rand(n)
y=a**2/b+f/5+np.log(c)*np.sin(d)
df = pd.DataFrame(
{
…
👍2
#featureselection #shap #shapselect
Типа несколько новый подход к отбору признаков.
То же RFCE, на авторы почему-то скромно выделяют свой подход прямо в отдельный класс.
Фишка в том, что по shap-значениям признаков на таргет строится отдельная регрессия. Признаки с незначимымы или отрицательными коэф-тами этой регрессии удаляются. Мне пока неясно, какие это даёт преимущества по сравнению просто с расчётом среднего и отклонений шап-значений признаков по всем примерам.
"Экспериментальная проверка", которую эти мощные учёные проводят в конце статьи, по глубине, достоверности и ширине охвата сравнима со школьным экспериментом по пуканью на зажигалку - один датасет, одна модель, один сид.
Но, может, я чего-то не понимаю, и это крутая идея?
https://www.youtube.com/watch?v=pmqvyrIyB_8
Типа несколько новый подход к отбору признаков.
То же RFCE, на авторы почему-то скромно выделяют свой подход прямо в отдельный класс.
Фишка в том, что по shap-значениям признаков на таргет строится отдельная регрессия. Признаки с незначимымы или отрицательными коэф-тами этой регрессии удаляются. Мне пока неясно, какие это даёт преимущества по сравнению просто с расчётом среднего и отклонений шап-значений признаков по всем примерам.
"Экспериментальная проверка", которую эти мощные учёные проводят в конце статьи, по глубине, достоверности и ширине охвата сравнима со школьным экспериментом по пуканью на зажигалку - один датасет, одна модель, один сид.
Но, может, я чего-то не понимаю, и это крутая идея?
https://www.youtube.com/watch?v=pmqvyrIyB_8