aimclub / fedot Goto Github PK
View Code? Open in Web Editor NEWAutomated modeling and machine learning framework FEDOT
Home Page: https://fedot.readthedocs.io
License: BSD 3-Clause "New" or "Revised" License
Automated modeling and machine learning framework FEDOT
Home Page: https://fedot.readthedocs.io
License: BSD 3-Clause "New" or "Revised" License
Проверка корректности композирующих алгоритмов на задаче воспроизведения заранее известных цепочек
По результатам обсуждений
+Нарисовать диаграмму для документации.
Сейчас композер выдаёт излишне сложные цепочки, если жестко не ограничить глубину дерева.
Это можно попробовать исправить вот так: в отличие от большинства задач ГП, у нас дорогой является лишь задача обучения модели. Сделать предсказание относительно дешево.
Поэтому, для каждого уже обученного дерева моделей мы можем бесплатно посчитать фитнес также для каждого из его поддеревьев (т.к. заново обучать их не требуется).
Т.е. можно в композер ввести оператор "регуляризации", который будет сводить дерево к простейшему поддереву (и или заменять оригинал, или вкидывать его в популяцию в одном или нескольких экземплярах).
Модели: только ML
Операции: только ансамблирование
Нужно реализовать запуск FEDOT для задач из penn-ml-benchmarks.
Примеры можно посмотреть в папках cases и tests.
Потом будет выложено на гитхаб в качестве доп. документации
Сейчас при каждом составлении цепочки все ноды пересоздаются и поэтому обучаются заново (кэш теряется).
Из-за этого на композирование уходит много времени. Нужно реализовать preserving нод, которые не затронуты мутацией или кроссовером.
Проверки для chain на :
Можно вызывать такой метод каждый раз при добавлении ноды в chain.
Сейчас много дублирующихся методов для создания датасетов, цепочек, etc.
Воспроизводится на penn-ml
Взять несколько простых моделей (например, лин. регресссий), вручную создать цепочку нод и реализовать "раскручивание" моделей при вызове последней из них.
Т.е. математически что-то вроде этого должно получиться:
y = a1(a2(a3*x+b3)+b2)+b1
Расширенное описание:
Сейчас у нас есть модели в отдельных нодах и их можно выполнять (как это сделано, например, в тесте test_eval_strategy_logreg)
Но выполнение отдельных моделей не особо полезно.
Нужна ещё и функциональность выполнения цепочек моделей, когда следующая модель принимает на вход результат предыдущей.
Тогда при вывозе метода apply в последней в цепочке ноде должны выполняться все предшествующие её ноды , и только потом - вызванная.
Где a и b - коэфициенты линейных регрессионных моделей
Сами цепочки будет составлять композирующий алгоритм, но это отдельная таска - пока их можно собрать вручную из самый простых моделей (например, лин. регрессий).
Данные можно взять любые, не обязательно получившаяся модель должна быть эффективной - главное, чтобы при вывозе apply в ноде 4 выполнялся подсчет в node1, node2, node3, потом обучалась и выполнялась модель в node 4.
Ну и учитывать что уровней такой иерархии может быть больше двух.
+Описать требования к формату (для документации).
Чтобы дать возможность спрогнозировать время расчета цепочки
Можно ориентироваться на те, что упомянуты в
https://github.com/EpistasisLab/tpot/blob/master/tpot/config/regressor.py
Это нужно для того, чтобы не менять число поколений и индивидов в скоринговом примере, а передавать просто число минут, после которого алгоритм вырубится по таймеру. Опцию передачу поколений и размера популяции можно сохранить, но сделать необязательно. Если время -1 - то время не учитывается.
Пример реализации можно посмотреть в tpot(код связанный с EpistasisLab/tpot#723)
Сейчас в https://github.com/nccr-itmo/FEDOT/blob/master/core/composer/visualisation.py есть вариант с помощью networkx, но он:
Необходимо вместо него реализовать нативный вариантат отрисовки.
Вот тут есть оч. старая реализация кастомной отрисовки моделей, но это совсем примитивный вариант.
https://github.com/nccr-itmo/FEDOT/blob/custom_visualise/core/composer/tree_drawing.py
Что нужно сделать:
0) Подготовать данные SSH, которые использовались в
https://niuitmo-my.sharepoint.com/:w:/g/personal/240590_niuitmo_ru/EdtbfZ7BHclCuzz1sg0yN2MBDN23F08KbVT3lAau6EgKGg?e=UgPVGo
Добавить твою реализацию LSTM в evaluation.py (и соответсвующие enum-ы - см. существующие модели). Инструкция есть тут:
https://github.com/ITMO-NSS-team/FEDOT.Algs/wiki/How-to-embed-custom-model-into-the-Fedot-pipeline
Попробовать запустить прогнозирование по аналогии с ARIMA в metocean_forecasting_problem.py
[тут нужно добавить регрессионные модели и оператор разности между рядами, сделаю сам]
Запустить итоговый модельный сетап.
Если LSTM обучается долго - возможно есть смысл сохранять обученную модель на диск.
Описание предлагаемой реализации:
В FEDOT.Algs мы реализуем именно алгоритмы оптимизации деревьев (символьных, gp, ast - можем как угодно их называть. Соответственно, для удобства нужен интерфейс типа GPTree (в котором есть все нужные методы для работы с узлами).
В ядре остается композеры и его реализации, в частности, GPComposer. Их единственная ответственность - композировать цепочки(copose_chain).
Внутри GPComposer::compose_chain импортируется GPOptimizer. Для того, чтобы его использовать, мы сначала конвертируем Chain в GPTree, и оптимизируем его. Результат конвертируется обратно в Chain. В Jav-е есть идеально подходящая штука для таких вещей - анонимные классы. Т.е. мы могли бы объявить анонимный класс, в котором реализовать методы класса GPTree: add_node, root_node и т.д. (частично делегируя вызовы методов GPTree
методам Chain). В питоне, к сожалению, я знаю, как это сделать дешево и по аналогии.
Да, при таком подходе ядро явно завязывается на FEDOT.Algs, но, имхо, это нормально, т.к. алгоритмы сами по себе - вещь более абстрактная, чем сборка цепочек из моделей ML. Зато сами алгоритмы оптимизации цепочек теперь можно использовать, совершенно не привязываясь к композеру и т.д.
С помощью Readthedocs или чего-то аналогичного
Осталось только добавить XGBoost и KNN.
Яна уже реализовала KNN в ветке gp-composer - можно попробовать взять оттуда.
Можно по аналогии с тем, как это сделано в https://www.researchgate.net/publication/338883598_An_Adaptive_and_Near_Parameter-free_Evolutionary_Computation_Approach_Towards_True_Automation_in_AutoML
можно что-то более интересное придумать.
Нужно сгенерить несколько датасетов, на которых можно выявить,
В датасетах можно делать разные комбинации:
Скорее всего, сейчас эти тесты будут падать.
В первую очередь интересна мутация, обеспечивающая удаление моделей.
Над подходящими кроссоверами надо подумать.
На основе имеющегося алгоритма GP
Код EPDE - в FEDOT.Algs
https://github.com/J3FALL/THEODOR/blob/master/core/composer/gp_composer/gp_composer.py#L29 тут разве не
super(GPComposer, self).__init__()
?
Сейчас при наличии в датасете текстовых колонок обработка данных ломается. Нужно учесть такую возможность.
Доработки и рефакторинг после показа:
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.