Блокнот Jupyter (iPython) заслуженно известен как хороший инструмент для создания прототипов кода и интерактивного выполнения всех видов машинного обучения. Но когда я им пользуюсь, неизбежно сталкиваюсь со следующим:
- записная книжка быстро становится слишком сложной и беспорядочной, чтобы ее можно было поддерживать и улучшать как записную книжку, и мне приходится делать из нее сценарии Python;
- когда дело доходит до производственного кода (например, того, который нужно запускать заново каждый день), блокнот снова не лучший формат.
Предположим, я разработал целый конвейер машинного обучения на jupyter, который включает в себя выборку необработанных данных из различных источников, очистку данных, разработку функций и модели обучения. Теперь, как лучше всего делать из него сценарии с эффективным и читаемым кодом? До сих пор я боролся с этим несколькими способами:
Просто преобразуйте .ipynb в .py и, с небольшими изменениями, жестко запрограммируйте весь конвейер из записной книжки в один скрипт Python.
- '+': quick
- '-': грязный, негибкий, неудобный в обслуживании
Создайте один сценарий с множеством функций (примерно по одной функции для каждой одной или двух ячеек), пытаясь объединить этапы конвейера с отдельными функциями, и назовите их соответствующим образом. Затем укажите все параметры и глобальные константы через
argparse
.- '+': more flexible usage; more readable code (if you properly transformed the pipeline logic to functions)
- '-': часто конвейер НЕ разделяется на логически завершенные части, которые могут стать функциями без каких-либо причуд в коде. Все эти функции обычно необходимо вызывать только один раз в сценарии, а не вызывать много раз внутри циклов, карт и т. Д. Кроме того, каждая функция обычно принимает выходные данные всех функций, вызванных ранее, поэтому нужно передавать много аргументов каждой функция.
То же, что и пункт (2), но теперь все функции обертываются внутри класса. Теперь все глобальные константы, а также выходные данные каждого метода могут быть сохранены как атрибуты класса.
- '+': you needn't to pass many arguments to each method -- all the previous outputs already stored as attributes
- '-': общая логика задачи все еще не зафиксирована - это конвейер данных и машинного обучения, а не только класс. Единственная цель для класса - создать, последовательно вызвать все методы, один за другим, а затем удалить. Вдобавок к этому классы довольно длинные для реализации.
Преобразуйте блокнот в модуль Python с помощью нескольких скриптов. Я не пробовал это делать, но подозреваю, что это самый долгий способ решения проблемы.
Я полагаю, что эта общая настройка очень распространена среди специалистов по данным, но, что удивительно, я не могу найти поблизости никаких полезных советов.
Народ, поделитесь своими идеями и опытом. Вы когда-нибудь сталкивались с этой проблемой? Как вы с этим справились?
argparse
) и т. Д. Как лучше всего обернуть «конвейер данных» в код логика? - person kurtosis   schedule 26.08.2015