-
Notifications
You must be signed in to change notification settings - Fork 88
enh: ensemlbe operations update #1385
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
All PEP8 errors has been fixed, thanks ❤️ Comment last updated at Fri, 27 Jun 2025 20:02:04 |
regression datasets (from https://www.jmlr.org/papers/volume25/22-0493/22-0493.pdf) upd: small version ---
- name: abalone
openml_task_id: 359944
- name: Allstate_Claims_Severity
openml_task_id: 233212
- name: black_friday
openml_task_id: 359937
- name: boston
openml_task_id: 359950
- name: Brazilian_houses
openml_task_id: 359938
- name: colleges
openml_task_id: 359942
- name: house_prices_nominal
openml_task_id: 359951
- name: house_sales
openml_task_id: 359949
- name: Mercedes_Benz_Greener_Manufacturing
openml_task_id: 233215
- name: MIP-2016-regression
openml_task_id: 360945
- name: Moneyball
openml_task_id: 167210
- name: pol
openml_task_id: 359946
|
Dataset for blending test |
"imbalanced" | ||
] | ||
}, | ||
"forward": { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Может назвать joint или merge?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Да, думаю стоит
Regression small set compare:
Датасет
Странновато, что с выключенными тюнером и композером ансамбль из 4 моделей обучается быстрее. Попробую пройтись отладчиком и посмотреть в чем там причина. Думаю можно в этом пиаре попробовать обновить начальные приближения и для регрессии (возможно с блендингом и прокидыванием данных). |
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## master #1385 +/- ##
==========================================
- Coverage 80.77% 80.02% -0.75%
==========================================
Files 148 151 +3
Lines 10755 10946 +191
==========================================
+ Hits 8687 8760 +73
- Misses 2068 2186 +118 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
Сравнение ансамблей на бенчмарке 1h8c
Стекинг через линейную регрессию с разными регуляризаторами:
В основном блендинг показывает себя эффективнее. При этом его реализация пока что черновая, можно попробовать добиться более хороших показателей, если настраивать количество итераций, прунинг и выбор алгоритма оптимизации весов. upd upd: upd upd upd: |
/fix-pep8 |
Сравнение обычных бустингов с бэггингами, в которых эстиматорами являются бустинги:
В целом, результаты бэггингов сопоставимы с ансамблем из бустингов. Дальше попробую запустить на бенчмарке ансамбль из этих бэггингов через линейную регрессию и через средневзвешенное. upd: сравнение для случайного леса
|
optuna n_trials = 100
|
/fix-pep8 |
Как вам текущая реализация блендинга? Пока убрал его из начальных приближений и из доступа для композера, чтобы покрывать больше краевых случаев с уже обкатанным стекингом через линейную регрессию. Но он работает и им можно пользоваться. Добавил обработку в graph_verification, так что эволюция должна работать корректно. И по поводу бэггинга? Решил использовать наиболее подходящие на мой взгляд захардкоженные модели. В планах было сделать универсальный узел, который будет принимать модель и обучать её на подвыборках, но, наверное, для этого нужно делать константный репозиторий по которому можно будет подтягивать модели для обучения. Как грамотно использовать модели не через константный репозиторий, а прокидывать в пайплайне у меня пока идей нет. И как-будто в бэггинге нуждаются не все модели. |
'cb_bag': CatBoostBaggingClassification, | ||
'cbreg_bag': CatBoostBaggingRegression, | ||
'xgb_bag': XGBoostBaggingClassification, | ||
'xgbreg_bag': XGBoostBaggingRegression, | ||
'lgbm_bag': LGBMBaggingClassification, | ||
'lgbmreg_bag': LGBMBaggingRegression |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: есть смысл семантически вынести все, что является bagging
атомарными моделями, в BaggingStrategy
или переименовать BoostingStrategy
в EnsembleStrategy
upd: оказыватся, EnsembleStrategy
уже есть. тогда, видимо, первый вариант будет норм, если еще и расплодить ...Strategy
из (Boosting...
, Bagging...
, Blending...
, Stacking...
)
if 'is_extra_deps_installed' not in globals(): | ||
is_extra_deps_installed = True | ||
if is_extra_deps_installed: | ||
logging.log(100, | ||
"Topological features operation requires extra dependencies for time series forecasting, " | ||
"which are not installed. It can infuence the performance. " | ||
"Please install it by 'pip install fedot[extra]'") | ||
is_extra_deps_installed = False |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
правильно ли я понял, что это изменение для того, чтобы в одном рантайме не засорять лог советами установить fedot[extra]
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
да
|
||
def __init__(self, params: Optional[OperationParameters] = None): | ||
super().__init__(params) | ||
self.seed = 42 # constant seed for optuna |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: даже если это внутренний seed для TPESampler
, хочется иметь возможность его передавать в конструкторе в виде параметра
self.seed = 42 # constant seed for optuna | |
self.seed = self.params.get('seed', 42) # constant seed for optuna |
def __init__(self, params: Optional[OperationParameters] = None): | ||
super().__init__(params) | ||
self.model_params = {k: v for k, v in self.params.to_dict().items() if k not in self.__operation_params} | ||
self.seed = 42 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Здесь seed захардкожен?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
да, потому что он влияет только на оптимизацию весов моделей. мне показалось, что сид здесь лучше сделать постоянным. по совету выше добавил возможность передавать его через params
upd: прошу прощения, перепутал классы, здесь это лишний параметр
/fix-pep8 |
Вроде вышло сделать бэггинг унифицированным узлом, который принимает любую модель и обучает её на подвыборках. Из ограничений:
Из проблем: модель обучается дважды, на предыдущем шаге и в узле бэггинга. Пока думаю как можно убрать обучения предыдущей модели, при этом сохранив возможность получать её инстанс из PipelineNode. Есть вариант обходить граф перед обучением и создавать тэг для моделей, идущих перед бэггингом, но что делать после этого пока идей нет. Без тюнинга гиперпараметров иногда получается серьезно бустануть метрику (здесь accuracy на задаче с каггла): |
Текущая реализация кэша тут не поможет? |
Раньше Проблема в следующем: Даже если модель закеширована на предыдущем шаге, её всё равно нужно загрузить и переобучить внутри бэггинга. Это приводит к двойному обучению: cначала на предыдущем шаге, затем на каждой подвыборке в бэггинге. Время обучения увеличивается почти вдвое, хотя можно было бы передать необученный инстанс модели и обучать его только на подвыборках. |
Убрал имплементацию бэггинга Blending with
Mean for each task:
Blending with
Mean for each task:
|
51ecb5f
to
5d5a018
Compare
/fix-pep8 |
/fix-pep8 |
This is a 🙋 feature or enhancement.
Summary
todo's:
done:
Context
#1375