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

Как вы знаете, наука о данных, а точнее машинное обучение, сейчас очень в моде, так что угадайте, что? Я решил записаться на MOOC, чтобы свободно разбираться в науке о данных. Но когда вы начинаете с сильного опыта разработки, это совсем не так, как если бы это был один из ваших основных опытов в программировании. Вот почему.

Модель приобретения навыков Дрейфуса

Модель Дрейфуса утверждает, что учащиеся проходят различные этапы в определении того, как они воспринимают ситуацию, на каких элементах они сосредотачиваются, насколько они вовлечены в результат и как они решают проблему. Для простоты я сосредоточусь на трех лицах, которые разработчик может показать в соответствии с моделью: новичок (он же новичок), опытный (он же компетентный) и эксперт (он же мастер).

  • Новички применяют известные им рецепты независимо от контекста (без ситуационной осведомленности). Они ищут простые правила, чтобы экспериментировать в безопасной среде. Новички часто сосредотачиваются на самых простых задачах, отказываясь от более сложных.
  • Профессионалы могут выбирать рецепты в зависимости от контекста. Они сосредотачиваются на экспериментах с правилами в различных условиях, что требует среды, обеспечивающей немедленную обратную связь. Они могут предпочесть избегать использования сторонних инструментов чаще, чем это того стоит.
  • Специалисты создают новые рецепты для нужд, зная, что все зависит от контекста. Они интуитивно понимают ситуацию и то, что возможно, а что сложно. Чтобы снизить риск, они часто начинают с самых сложных задач или с той, которая дает наихудший результат.

В двух словах: другой этап означает другие потребности. Хотя программирование можно рассматривать как инструмент науки о данных, а не как науку о данных как таковую, оно может быть тем, что вас больше всего занимает в повседневной практике (за исключением случаев, когда вы теоретик). Как следствие, изучение науки о данных в качестве предполагаемого новичка, когда вы овладеете практическим искусством программирования, будет не столь эффективным. Вам лучше сосредоточиться на вещах, которых не происходит.

Питон - король

Судя по всему, все специалисты по обработке данных во всем мире используют Python, поэтому вы можете подумать, что вам сначала нужно изучить программирование на Python. Нет ничего менее верного. На самом деле вам не нужно быть экспертом по Python. Просто знайте основы, и вы уже почти получите это по аналогии с другими языками: импортируйте модуль, распечатайте некоторые форматированные данные, создайте функции, если вы хотите следовать принципу СУХОЙ, разобраться с циклами или ветвлениями. Вам редко придется иметь дело с объектно-ориентированным программированием или шаблонами проектирования.

Если вы опытный разработчик и хотите овладеть наукой о данных, углубленное изучение Python, вероятно, будет пустой тратой времени.

Если Python - король, королевский двор - это то, что я бы рекомендовал сосредоточить на , т. Е. экосистеме науки о данных, а точнее:

  • Запуск Jupyter в виде большинства учебных пособий, практических занятий или упражнений предоставляется в виде записных книжек.
  • Использование NumPy для базовой статистики, такой как вычисление среднего, медианы, минимума / максимума, стандартного отклонения, дисперсии и значений квантилей.
  • Использование панд для создания наборов данных из значений в памяти, сети или файлов (например, CSV) и отображения гистограмм / коробчатых диаграмм.
  • Использование Matplotlib для отображения основных графиков разброса или кривых и круговых диаграмм категориальных данных и использование seaborn для расширенных отображений, таких как парные графики или тепловые карты (например, корреляционная матрица, матрица неточностей).
  • Использование SciPy для расширенной статистики, такой как игра с функциями плотности вероятности, z-значениями и отображение графиков Q-Q.
  • Использование статистических моделей и scikit-learn для моделирования (регрессия, классификация и т. Д.).

Одна из самых важных вещей, которую нужно быстро понять, если вы хотите стать профессионалом в экосистеме, - это как передавать данные между всеми инструментами для анализа данных. Вкратце, я бы сказал, что pandas предоставляет вам сводный формат, называемый фреймы данных. По сути, фрейм данных является эквивалентом электронной таблицы (т. Е. Именованных столбцов с возможно разными типами данных), но с суперспособностями (т. Е. Продуманным выбором и ключевыми механизмами). NumPy, Matplotlib и SciPy - это низкоуровневые инструменты, принимающие собственные массивы в качестве входных данных и / или прозрачно инкапсулирующие их. В большинстве случаев для использования этих инструментов достаточно извлечь серии из фреймов данных. Наборы инструментов моделирования являются более высокоуровневыми и обычно напрямую управляют фреймами данных как входными. Вы также можете ознакомиться с некоторыми инструментами, которые напрямую управляют фреймами данных как входными, например Altair или Joypy, для визуализации.

Если вы опытный разработчик и хотите овладеть наукой о данных, возможно, стоит научиться эффективно работать с фреймами данных pandas.

Вы можете сэкономить время, используя инструменты на основе графического интерфейса пользователя для просмотра и анализа содержимого фрейма данных в первую очередь. Вы также можете сэкономить много вычислительной мощности, сохраняя необработанные или обработанные кадры данных с помощью инструментов ввода-вывода pandas. Действительно, большинство записных книжек работают, читая файлы данных CSV, которые крайне неэффективны для сохранения данных, хотя есть определенно намного больше возможностей.

Anaconda часто используется для того, чтобы начать работу с данными, поскольку она поставляется с множеством пакетов для анализа данных и позволяет управлять различными средами, чтобы уменьшить количество проблем при работе с различными версиями. Однако Anaconda - довольно большая программа с более чем 200 пакетами, поэтому при обновлении иногда приходится ждать часами. Более сведущие в управлении пакетами (ад зависимостей), чем новички, вы, вероятно, должны предпочесть Miniconda, небольшую загрузочную версию Anaconda, которая включает только самые полезные компоненты.

Нормальное распределение - королева

Поскольку кажется, что все специалисты по данным используют нормальные распределения, вы можете подумать, что сначала вам нужно узнать, что такое гауссовский. Нет ничего более правдивого. Действительно, центральная предельная теорема утверждает, что для достаточно большого размера выборки (статистики обычно рекомендуют 30) выборочное распределение среднего для переменной следует нормальному распределению независимо от его распределения в генеральной совокупности. Как следствие, многие статистические методы, включая корреляцию, регрессию, t-тест, обнаружение выбросов и дисперсионный анализ, предполагают, что интересующие значения распределены нормально. Позаботьтесь о том, чтобы, в зависимости от метода, это не всегда означает, что данные распределены нормально, а скорее означает среднее значение или остаточную ошибку данных.

Однако отсутствие подтверждения того, что входные данные соответствуют допущениям статистических методов, используемых для их анализа, является одной из наиболее распространенных ошибок, обнаруживаемых в исследованиях.

Учтите, что, как новичку, вам не всегда советуют проверять нормальность с помощью визуального осмотра (например, гистограммы и графика QQ) и / или тестов значимости (например, тест Шапиро-Уилка) перед применением методов на ваши данные (контекстная осведомленность). По крайней мере, вы можете всегда смотреть на данные, прежде чем интерпретировать результаты.

Машинное обучение - это фактически обобщение на новые ситуации. Шаблоны, которые существуют только в определенном наборе данных, бессмысленны, и вы ищете шаблоны, которые существуют и за его пределами. Распределения - это именно такие шаблоны, и если вы изучаете средние значения, что довольно часто, нормальное распределение - королева.

Разрыв в производстве реален

Как и в любой другой исследовательской деятельности, большая часть науки о данных посвящена экспериментам: разработка моделей, оптимизация гиперпараметров, тестирование моделей и т.д. избегать технических проблем и сосредоточиться на концепциях.

Однако, как опытный разработчик, вы, естественно, осведомлены о производственных ограничениях и разрыве между исследовательским и готовым к производству фрагментом кода. С одной стороны, принятие облака в качестве основной инфраструктуры для приложений представляет собой вызов для ноутбуков, который размывает рассуждения об архитектуре клиент-сервер при локальном запуске на вашем ноутбуке. С другой стороны, реальные данные могут быть огромными, а модели - слишком ресурсоемкими для вашего ноутбука. Производственная среда может предложить больше возможностей для изучения ваших данных и улучшения ваших навыков. И последнее, но не менее важное: поскольку исследование чрезвычайно подвержено ошибкам, вы сможете легко восстанавливать более старые версии своей работы и, возможно, работать одновременно в команде.

Как следствие, вам следует как можно скорее принять следующий подход, чтобы резко сократить разрыв между разведкой и добычей.

1. Настройте рабочий процесс разработки

GitHub стал де-факто стандартом систем управления версиями для разработки, но наука о данных демонстрирует определенные проблемы, которые нельзя решить напрямую. Во-первых, структура программного проекта на самом деле не актуальна; что-то вроде Cookiecutter Data Science, вероятно, лучший выбор или, по крайней мере, источник вдохновения. Во-вторых, вам нужно управлять большими файлами данных и записными книжками, которые на самом деле не подходят для Git (операции сравнения / слияния не будут доступны для чтения человеком). Будем надеяться, что Data Version Control (DVC) может управлять версиями и хранением наборов данных для вас в облачных сервисах, таких как AWS S3 или Google Drive. Более того, nbdime / nbstripout может помочь вам обеспечить бесперебойную работу Git на ноутбуках.

2. Сделайте свою работу настраиваемой

Вам часто приходится играть с некоторыми параметрами, чтобы найти оптимальные модели для ваших данных, но изменение жестко запрограммированных значений в ваших записных книжках - не самый эффективный способ продолжить. Papermill превращает любую записную книжку в новую на основе некоторых входных параметров, как если бы вы выполняли настраиваемый сценарий командной строки. С Streamlit вы можете превратить каждый параметр в виджет в полностью интерактивном веб-приложении. Однако сначала вам нужно экспортировать записную книжку как скрипт Python с помощью nbconvert.

3. Сделайте свою работу доступной для отладки.

Добавление оператора print() в наш код для отладки, вероятно, является одной из наиболее распространенных практик среди разработчиков. Однако, как я уже упоминал ранее, есть гораздо более сложные решения.

Ведение журнала - чрезвычайно мощный инструмент, но все дело в том, чтобы использовать правильный инструмент для работы. Во-первых, вы должны иметь возможность фильтровать / активировать свои журналы в соответствии с различными уровнями серьезности (например, информация о разработке, сообщения об ошибках в производстве и т. Д.). Во-вторых, вы должны иметь возможность глубоко проверять объекты и трассировку стека, когда это необходимо, чтобы избежать потери контекстной информации. В-третьих, вы также должны иметь возможность записывать свои журналы в файл вместо экрана или в дополнение к нему. И последнее, но не менее важное: вы должны иметь возможность фильтровать свои журналы по запросу в соответствии с различными областями (например, предварительная обработка данных, подгонка модели и т. Д.), Чтобы не предоставлять слишком много информации о крупных проектах. Например, loguru может быть неплохим выбором для Python, хотя встроенный модуль регистрации уже предоставляет богатый набор функций.

Конечно, когда это возможно (например, в непроизводственных средах), лучшим вариантом остается использование отладчика. Как и любой другой язык программирования, Python имеет встроенный отладчик; вам просто нужно научиться эффективно использовать это оружие. Если вы хотите установить точки останова или более комфортно использовать пошаговое выполнение, вам понадобится IDE (интегрированная среда разработки), поддерживающая интерактивную отладку, например Visual Studio Code или PyCharm.

4. Сделайте свою работу доступной в виде конвейера данных.

Блокноты - это в основном интерактивные веб-интерфейсы, содержащие код, визуализации и текст. Действительно хороши для экспериментов или анализа данных, однако они не предназначены для автоматического запуска или обработки через конвейер CI. В какой-то степени использование ноутбуков в производстве можно даже рассматривать как антипаттерн.

Самый простой способ превратить вашу работу в исполняемый конвейер - это экспортировать записную книжку в виде скрипта Python с помощью nbconvert или запустить его через papermill. Тем не менее, лучший способ продолжить работу - это начать использовать сценарии заранее, поскольку ничто не мешает вам импортировать сценарии в свои записные книжки (ведь это всего лишь код Python, не так ли?). Таким образом, вы также можете вызывать его из неинтерактивных процессов. Например, DVC (мы уже встречались с ним ранее) предоставляет вам механизм для захвата конвейеров данных - серии процессов данных, которые производят окончательный результат.

5. Используйте возможности, предлагаемые управляемыми услугами.

По мере увеличения объема данных и усложнения моделей задачи машинного обучения становятся слишком ресурсоемкими для вашего ноутбука. Тогда часто стоит делегировать (часть) рабочую нагрузку облачным сервисам. Kaggle, Google Colaboratory, AI Platform Notebooks, Amazon SageMaker, FloydHub, SaturnCloud и CoCalc, вероятно, являются одними из самых известных сервисов для этого. Новой тенденцией является предоставление более интегрированных платформ для машинного обучения, чем просто записные книжки SaaS, такие как предлагаемые OVH или TADA.

Машинное обучение в двух словах

Вы можете спросить, почему я до сих пор не говорил ни о каких алгоритмах машинного обучения. Мне кажется, что самая сложная и наиболее трудоемкая часть науки о данных - это на самом деле инженерия данных (то есть создание пригодных для использования данных), а не разработка моделей (то есть создание полезных данных). Построение модели на самом деле довольно просто с помощью наборов инструментов машинного обучения, а процесс почти стандартизирован, как показано на следующем псевдокоде:

  1. Выберите модель, которую хотите использовать, и создайте экземпляр с выбранным набором параметров (также называемых гиперпараметрами).
  2. Разделите свой набор входных данных на набор обучающих данных (используемый для построения модели) и набор тестовых данных (используемый для проверки модели).
  3. Подберите свою модель к набору обучающих данных.
  4. Оцените точность и производительность своей модели на наборе тестовых данных.
  5. Прогнозируйте выходные данные из новых входных данных, используя вашу модель.

Наборы инструментов также предоставляют функции, помогающие или автоматизирующие проектирование моделей, оптимизацию гиперпараметров и тестирование моделей. Таким образом, моделирование с использованием черных ящиков, предоставляемых наборами инструментов машинного обучения, на самом деле довольно просто, если вы опытный программист. По моему скромному мнению, как опытному разработчику, одна из самых важных вещей, о которых нужно знать, - это ограничения машинного обучения. В самом деле, благодаря своему опыту вы, вероятно, быстро сможете выполнить приличное проектирование данных и моделей. Однако следует помнить о нескольких вещах.

Во-первых, машинное обучение - ничто без данных, но вы, вероятно, никогда не узнаете, достаточно ли хороши ваши данные, чтобы охватить все реальные эффекты для вашего варианта использования. Очевидно, что машинное обучение нельзя применить к задачам, для которых мало входных данных. Но даже в том случае, если доступен большой объем данных, данные могут быть зашумленными и включать ошибки или смещения.

Во-вторых, машинное обучение обычно основано на стохастических, а не детерминированных процессах (в частности, на глубоком обучении). Обычно модель не понимает физических законов или включает физические ограничения и, возможно, может предсказывать нереалистичные значения. Короче говоря, доверие алгоритмам больше, чем нашему собственному суждению, может привести к проблемам и плохой объяснимости.

И последнее, но не менее важное: машинное обучение направлено на выявление корреляции между входными данными и результатом модели (т. Е. Прогнозом). Поскольку человеческий мозг пытается найти закономерности, даже если их не существует, корреляцию часто путают с причинной связью. Однако корреляция не подразумевает причинно-следственной связи. Причинно-следственная связь - это доказательство реальных факторов, влияющих на прогноз, в то время как модель часто использует достаточно хорошие ярлыки. Например, путь, ведущий от A к D в реальной жизни, проходит через B и C, прежде чем вы попадете в D, в то время как модель может создать прямую связь между A и D.

Поскольку в настоящее время экосистема науки о данных и машинного обучения быстро развивается, я хотел бы в заключение предложить вам также изучить новые способы экспериментов помимо Python с водородом, взаимодействием или Polynote.