aimclub / FEDOT

Automated modeling and machine learning framework FEDOT
https://fedot.readthedocs.io
BSD 3-Clause "New" or "Revised" License
643 stars 88 forks source link

Can't perform manual cross-validation of composed pipeline #1080

Closed geniusserg closed 1 year ago

geniusserg commented 1 year ago

Hello! In my project I try to create regression models with Fedot and make its cross-validation.

  1. I compose pipeline on input data (X contains 47 features, y - one value)
  2. Then I divide this data on 5 folds
  3. And fit composed pipeline on 4 folds and validate on one fold

This does not works as preprocessing error happens:

X has 2 features, but SimpleImputer is expecting 1 features as input.

But if I fit pipeline on the whole dataset without dividing on folds, everything works.

See attached notebook for more details: fedot.zip

geniusserg commented 1 year ago

Link on the repository of project https://github.com/geniusserg/CovidPredict

valer1435 commented 1 year ago

1) Данные не одинаковые, потому что в первом случае вы подаете весь датасет, во втором случае только часть. Может возникнуть такая ситуация, что кардинальность данных в фолде и во всех данных может отличаться. 2) Недавно было сделано такое изменение - что данные всегда предобрабатываются, даже если пайплайн уже обучен. Соотвественно федот обучает свои препроцессоры на новых данных, но модель юзает ту, которая подходила под старые.

Вы можете посмотреть, как реализовано обучение на фолдах внутри федота - после каждого фолда делается unfit (https://github.com/aimclub/FEDOT/blob/master/fedot/core/optimisers/objective/data_objective_eval.py)()

Без него пайплайн не будет обучаться на новых данных, а просто возвратит себя же обученного

Так что unfit необходим в том числе и логически - без этого вы обучите федота на одном фолде, а на следующих будете просто предсказывать моделью, обученной на 1 фолде