Путь в Data Science с нуля
Долгожданный «честный роадмеп» дата саентиста, который я очень ждала выпустить
Писали вместе с моим очень хорошим другом Димой, сейчас Middle Data Engineer в GlowByte, ранее Research Scientist в Тинькофф и Data Scientist/ML Engineer в УБРиР.
Путь "с нуля" в дата саенс у меня занял примерно год: в апреле 2020 я написал свои первые строки кода на питоне, в апреле 2021 я получил свою первую работу.
Далее я попробую построить свой роадмап обучения - что следовало за чем, какими я пользовался ресурсами, на что обращал внимание и т.д. Сразу скажу о том, что это не является рекомендацией к тому "как делать надо", я просто делюсь своим опытом "захода в IT".
Я учился в УрФУ, и на третьем курсе у нас были "майноры" - предметы на выбор, по одному на семестр. Во втором семестре, как раз, когда начался ковид, я выбрал майнором курс "Аналитика больших данных", его у нас тогда проводили специалисты из CISCO. В целом, как можно было бы ожидать, курс был очень базовым (и никаких больших данных, естественно, не было) из-за того, что на него приходят студенты с очень разным опытом, кто-то - как я тогда - совсем без релевантного опыта в программировании. Курс длился примерно 3 месяца (апрель-июнь) и был достаточно лайтовым, однако некоторые полезные вещи этот курс определенно дал - главным образом это знакомство с основной средой разработки DS-специалистов - Jupyter Notebook, и с некоторыми базовыми библиотеками, такими как pandas, matplotlib, plotly, sklearn (Хотя, там было и несколько интересных и более специализированных тем, например распознавание объектов на изображении и работа с геоданными).
После окончания летней сессии на третьем курсе из-за суммы нескольких факторов я решил продолжить обучение в области ML и анализа данных с целью полностью перейти в эту сферу и получить в ней работу (университет я, правда, не бросил, и доучился четвёртый курс).
После принятия решения, дело стало за поиском обучающих материалов. Здесь мне очень помог мой хороший друг, уже проделавший дорогу в профессиональный DS - подсказал мне, вероятно, один из лучших курсов - специализацию "Машинное обучение и анализ данных" от Яндекса и МФТИ. В те времена специализация была доступна на Coursera, и благодаря моему университету я получил свободный доступ к нескольким курсам из специализации. Сейчас специализация доступна на собственном ресурсе.
Лично мне специализация очень понравилась прежде всего структурой. В целом, она покрывает все основы, которые нужно знать джуну DS. Специализация состоит из 6 курсов, каждый покрывает свой большой раздел:
1) Первый посвящен необходимой для DS и ML математической базе, а также знакомит с основными конструкциями и структурами питона, которые пригодятся в будущем. По сути, это курс закладывает базу, и он особенно важен для тех, у кого на момент начала обучения нет релевантных навыков в математике и программировании
2) Второй курс специализации, на мой взгляд самый важный. Он покрывает класс задач обучения с учителем, а большая доля кейсов в машинном обучении относится именно к этому классу - когда у вас набор примеров с известным значением целевого признака, и по нему нужно научить модель прогнозировать этот признак для новых данных. В этом курсе рассматриваются популярные и распространённые классы моделей для работы с табличными данными - линейные модели, решающие деревья и их ансамбли (во времена курсеры там были ещё Naive Bayes и KNN, но из текущего описания разделов это не следует). Также именно здесь впервые поднимается тема оценки качества моделей, а это очень важная вещь как с практической точки зрения, так и с точки зрения подготовки к собеседованиям, ибо именно эта тема встречается на собеседованиях очень часто, и не только на уровне джунов
3) Третий курс посвящен задачам обучения без учителя - когда у вас нет "готовых примеров", и вам нужно найти закономерности в данных, например, выделить из общей совокупности объектов группы похожих друг на друга, исходя из их признакового описания (такие задачи ещё называются задачами кластеризации), или сгруппировать набор текстов по нескольким темам. Ещё из того, что точно может пригодиться всем, там будет блок о визуализации данных и поиске аномалий в них.
4) Четвёртый курс посвящён статистике. Как правильно формулировать гипотезы и проверять их, как строить корректные выводы по данным, что такое A/B тестирование; Именно этот курс я не прошёл, т.к. у университета закончился договор с курсерой, по которому студенты могли бесплатно проходить курсы. У меня осталась личная возможность выбрать один курс бесплатно (если не ошибаюсь, тогда она была у всех пользователей курсеры), и я предпочёл пятый курс четвёртому - он в свою очередь посвящен различным прикладным задачам анализа данных. Кстати говоря, сейчас я думаю, что это было неверное решение. Тогда основной моей мотивацией было рассмотреть как можно больше различных типов задач машинного обучения, т.к. думал, что пригодиться может что угодно, а на собеседовании от тебя будут ждать знаний по всему и сразу. Однако фактически это не так, и лучшее, что может показать джун на собеседовании на свою первую работу - это хорошее понимание основ и способность учиться новому. И как раз-таки владение знаниями в статистике и умение делать корректные выводы по данным к основам точно относится. Более специализированные и узконаправленные знания (например, анализ временных рядов, задачи ранжирования, анализ текстов), безусловно, могут пригодиться, но с большей вероятностью от джуна/стажёра будет требоваться просто наличие "базы", а остальное может быть выучено при наличии необходимости.
5) Пятый курс, как уже было сказано выше, посвящен различным прикладным задачам анализа данных. Неплох для развития кругозора, но если вы ограничены в ресурсах и времени, то именно этот курс больше всего подходит для того, чтобы пропустить его (хотя я не уверен, что при его пропуске у вас будет возможность работать над финальным проектом).
6) Заключение специализации - финальный проект. Здесь вам предлагается применить полученные знания на практике, и выполнить свой собственный pet-project - такие вещи очень хороши для составления первого резюме. Дело в том, что специалисты с опытом могут на собеседовании просто рассказать о том, что на самом деле делали на работе, а вот когда вы приходите на собеседование без какого-либо релевантного опыта, объективно оценить вас зачастую непросто. Наличие собственного проекта, который можно показать потенциальному работодателю - хорошее доказательство того, что вы способны перекладывать знания на практику. Естественно, это будет выгодно выделять вас при конкурсе на стажировку/позицию в штате.
В период с июля по октябль я прошёл первые 3 курса из специализации. По идее, каждый из них рассчитан примерно на месяц, но у меня это заняло больше времени из-за работы летом и несобранности в начале обучения. Сейчас сложно вспомнить, сколько времени я тратил на курсы, но, кажется, это было примерно часов 10-12 в неделю.
Оглядываясь назад, я понимаю, что эти три курса покрывали значительную часть вопросов изтеории ML, которые могли бы встретиться на первом собеседовании: что вообще из себя представляет обучение модели, что такое градиентный спуск, какие классы моделей в каких задачах могут применяться, чем отличается обучение с учителем от обучения без учителя, какие основные метрики есть в задачах регрессии и классификации, что из себя представляет каждая метрика, как строится ROC-кривая, что такое ансамбли моделей, как обрабатывать категориальные признаки, какие базовые приемы предобработки данных.
В конце октября я решил провести небольшой эксперимент - попросил друга, работающего в сфере DS, провести мне "тренировочное собеседование" на стажёра/джуна. Тогда у меня больших проблем с вопросами, касающихся анализа данных, у меня не возникло, но беда была в другом - несмотря на полгода обучения уровень владения питоном оставался довольно низким. С очень большой вероятностью даже на первом собесе вам придётся решить какую-нибудь алгоритмическую задачку, поэтому плохой уровень питона - это проблема, которую нельзя игнорировать. Мои трудности тогда сводились к двум случаям: 1) даже не представляю, как задача может решаться; 2) понимаю алгоритм, но из-за незнания всех возможностей языка решение получается очень костыльным, а прихожу к нему очень долго. Тогда на ноябрь я поставил себе челлендж - каждый день решать как минимум одну (но чем больше, тем лучше) алгоритмическую задачу в день. В качестве ресурса я использовал Leetcode - там и задачи разбиты на темы/по сложности, и оценивается не только решение, но и оптимальность использования памяти и время выполнения алгоритма, а если будет совсем сложно - можно посмотреть решения других людей.
Челлендж был выполнен, и, на самом деле, дал довольно много - частично удалось устранить вторую проблему: вырос уровень владения питоном, удалось узнать и научиться применять различные структуры и конструкции языка, и главное - я начал понимать, из чего складывается алгоритмическая сложность решения. Так что всем, кто путь в DS стартует с низким уровнем питона, после изучения основ языка настоятельно рекомендую повторить мой челлендж.
Первая из указанных выше проблем, естественно, тоже разрешима, но для этого нужно немного погрузиться в теорию алгоритмов. Алгоритмические задачи можно поделить на классы, и к каждому из них имеется оптимальный подход, так что далеко не всегда велосипед придётся придумывать самостоятельно. Для подтягивания по алгоритмам можно пройти тренировку от Яндекса.
Сейчас идёт уже пятый запуск курса, я в своё время проходил второй запуск, когда уже работал. Курс предоставляет как лекции с разбором отдельных классов задач, так и, собственно, сами задачи для практики. Мне тренировки по алгоритмам очень пригодились уже на последующих собеседованиях, на одном из них задача и вовсе почти полностью повторяла один из примеров, разобранных в курсе.
Последние 4 месяца подготовки я занимался в основном расширением кругозора: прошёл пятый курс из специализации, посвященный прикладным задачам анализа данных, попробовал поучаствовать в паре соревнований на каггле, начал по-немногу разбираться с нейронками. В качестве источника использовал курс на dlcourse.ai. Курс, правда, далеко не обзорный, и без знаний в математике, которые я упоминаю в конце статьи, разобраться будет крайне сложно. Но в этом и его плюс - в нём довольно детально разбирается то, что происходит внутри "чёрного ящика".
Но пожалуй, самым важным из того, что было изучено за последние месяцы перед получением работы, был SQL. Это то, что от вас как от аналитика данных уровня стажёра/джуна будут ждать точно - уметь писать запросы средней сложности (вероятно без оконных функций, но с группировками, джоинами, подзапросами). Очень популярный и проверенный годами ресурс для тренировки навыков в sql - это sql-ex. Там есть огромное количество задач, но сам сайт местами выглядит допотопным, да ещё и зачастую никак не помогает прийти к решению, если самостоятельно решить задачу не получается. Для новичков, пожалуй, лучше подойдёт другой ресурс - интерактивный тренажёр по SQL на Степике. Там можно начать разбираться прямо с нуля - тренажёр предоставляет как теорию, так и практические задачи. Отлично подходит для того, чтобы усвоить базовый синтаксис SQL, но за более сложными примерами уже стоит лезть в sql-ex.
В марте я начал проходить собеседования, а в апреле получил стажёрскую позицию. Таким образом, мой путь от первых строк кода на питоне до первой работы в DS занял ровно год. И, честно говоря, его вполне можно было бы сократить месяца на 3-4, если исключить время, потраченное на изучение менее значимого материала, и учиться более собрано, чем это было в моём случае.
Поиск работы и подготовка к собесам
В целом, универсальной формулы для подготовки к собеседованиям нет. Возможно легче сказать, чего там не будет, чем что будет. Так вот, точно не будет очень сложных задач на алгоритмы - т.к. время ограничено и все понимают, что решать задачи под давлением непросто. Задачи из дивизиона B (базовый уровень) тренировок по алгоритмам от Яндекса, что я скидывал выше - это хороший бэнчмарк. Если уверенно справляетесь с ними - то алгоритмический блок собеседования для вас не должен быть проблемой. Вполне вероятно, что на стажёрском собедевании у вас даже не будет задач на алгоритмы. Так же вас очень маловероятно будут спрашивать какие-то формулы (помимо самых основных, например, аналитического решения линейной регрессии, формулы условной вероятности по Байесу, как выглядит логистическая функция, плотность вероятности нормального распределения и т.д.), и тем более должны не просить выводить и доказывать общеизвестные утверждения. А так, в целом, я для подготовки к собеседованиям часто просто гуглил "списки вопросов", а-ля "list of most popular questions for Junior (/Middle) Data Scientist interview", и проходился по ним. По моему опыту, самые любимые вопросы - про метрики, как их считать, какая метрика лучше подходит под задачу, как правильно выбрать метрику под бизнес-задачу.
Далее немного расскажу о поиске работы. Немного - потому что для меня процесс был очень быстрым и лёгким, но, полагаю, так происходит далеко не всегда.
Напомню, что во время моего самообучения в сфере DS и ML я всё ещё учился в университете, и, естественно, что в универах часто проводят встречи с потенциальными работодателями. Так вот - эти встречи реально бывают полезными! В частности, я свою первую работу получил именно таким образом - поговорил с HR одной из компаний, которая набирала стажёров, меня позвали на собеседование на стажировку и я его прошёл. На таких мероприятиях ваша главная задача - поговорить с как можно большим количеством HR-ов из тех, которые ищут стажёров/джунов по вашему профилю.
Здесь хочу обсудить одно предубеждение, которое было у меня во время поиска первой работы, хотя не знаю, насколько оно распространено. В общем, сначала я думал, что попасть в какую-нибудь большую компанию, например, в Сбер - это очень сложно. Я думал, что для этого твои знания должны быть на очень высоком уровне (как из-за большого конкурса на место, так и из-за требований компании), а без каких-то собственных проектов шансов попасть даже на стажировку практически нет. Однако фактически, только у больших компаний есть ресурсы нанимать стажёров с не самыми прокачанными навыками, чтобы дообучить их в процессе, тем самым заработав их лояльность. Помимо того, что у больших компаний есть достаточно ресурсов для того, чтобы позволить себе нанимать новичков, которые не начнут сразу приносить вэлью, у них, во-первых, всегда есть потребность в новых сотрудниках - для поддержания и масштабирования текущих проектов и для запуска новых, а во-вторых, в больших компаниях зачастую и текучка кадров тоже большая. Два этих момента частично нивелируют наличие большого конкурса на место. Конечно, не все гиганты готовы сотрудничать с "совсем новичками", но сторониться их из-за того что вы думаете, что ожидания по отношению к вам будут очень сильно завышены, а конкуренция во входном конкурсе будет непроходимой - это не так. Вполне вероятно, что именно условный "Сбер/Альфа/Озон/МТС" будет вашим первым работодателем.
О магистратуре
Ещё один вопрос, который стоит обсудить - это выбор университетского образования, а точнее говоря магистратуры, как возможного пути в DS. Сразу стоит сказать, что разные магистерские программы могут довольно сильно отличаться друг от друга глубиной погружения и направленностью - какие-то ориентированы на прикладные задачи, другие на более фундаментальные вещи и науку. Конечно, в рамках нашего разговора мы рассматриваем именно программы прикладной направленности, которые по сути выполняют функцию дополнительного образования или "переквалификации", (и, пожалуй, только те, куда вы можете поступить на бюджет). Попробуем сравнить «самообучение» по онлайн-курсам и обучение в магистратуре.
Самообучение по онлайн-курсам и ресурсам
Плюсы
- Вы сами составляете себе программу, следовательно, можете включать туда только те вещи, которые считаете максимально полезными для вас, и только те, что непосредственно понадобятся в поиске первой работы;
- Помимо программы вы сами составляете себе расписание и работаете в комфортном для себя ритме.
Минусы
- Не все ресурсы бесплатны;
- Самостоятельное составление расписание может стать и минусом, если вам не хватает мотивации или дисциплины;
Магистратура в университете
Плюсы
- Как правило, университет помимо главных для какой-либо специальности предметов даёт возможность изучать и смежные предметы, что полезно для расширения кругозора и «горизонтального роста» компетенций;
- Если магистерская программа ведётся вместе с какой-нибудь крупной компанией (а сейчас это вполне распространённое явление), то это может значительно упростить поиск работы;
- В магистратуре могут проводиться проектные практикумы, что является потенциальной возможностью сделать неплохой pet-project, познакомиться с методологиями разработки, попробовать себя в роли project manager`а; при должных усилиях, удаче и помощи менторов проект с практикума даже может вылиться в стартап;
- Магистерский диплом будет красиво смотреться в резюме;
- Университет — неплохое место для нетворкинга, особенно, если программа поддерживается какой-нибудь IT-компанией;
Минусы
- Скорее всего в университетскую программу будут включены и «не очень полезные» для вас предметы, на которые придётся тратить время; в целом адаптировать обучение под свой ритм вам будет сложнее;
- Дедлайны, сессии и написание диплома — дополнительный стресс;
- Некоторые предметы могут преподаваться на очень поверхностном уровне; к сожалению, преподаватели не всегда ответственно относятся к своей работе
Сам я учился на специальности «Прикладной анализ данных» в УрФУ — эта программа практически полностью курируется Сбером. Но я начал учиться в магистратуре после года самообучения, когда уже получил свою первую работу. По большому счёту, я довольно мало нового узнал непосредственно об анализе данных, но несколько «смежных» предметов оказались довольно полезными — MLOps, базы данных (благодаря теоретическим основам проектирования БД, которые я ранее игнорировал, PL/SQL), PySpark, Java (на которой я до магистратуры ничего не писал). Очень интересным опытом был еже-семестровый проектный практикум, на котором я фактически брал на себя роль бэкендера, благодаря чему я впервые познакомился с Flask и Docker (я ещё все 3 раза из 3 проектных семестров был тимлидом). Однако, не все предметы преподавались на достойном уровне, поэтому несмотря на то, что программа была продумана неплохо, получить от неё максимум не получилось.
Многие ребята, которые учились со мной, не имели никакого опыта в DS, но зато знали что-то о разработке. У меня по меркам программы были почти исчерпывающие знания в анализе данных, но о разработке я не знал ничего. Получилось, что у нас всех была возможность изучить что-то новое, но для всех новые знания оказались скорее «сопутствующими», нежели помогающими в основной работе. Ребятам, для которых магистратура была «первым опытом» в мире IT, с «хардовыми» предметами было тяжко, но им получалось эффективно применять другие свои навыки (дизайн, менеджмент, без которых в IT тоже не обходится) на проектном практикуме.
Обобщая выше сказанное, я бы сказал, что не считаю магистратуру хорошим вариантом для начала пути в DS и в IT в целом. Но тем не менее я совсем не считаю её бесполезной. Исходя из своего опыта (не претендую на то, что это однозначно верно), я думаю, что лучше всего она подходит для тех, кто уже имеет определенные навыки в каком-нибудь направлении - будь то анализ данных, DE, разработка или менеджмент, - и хочет расширить свои компетенции, обзавестись новыми контактами.
О математике для анализа данных
Начнём с интересующего всех вопроса - можно ли стать дата саентистом без знания математики. Ответ - нет, нельзя. Если ваши знания в математике ограничиваются девятью классами школы - путь в DS для вас закрыт. Но есть и хорошие новости - чтобы получить первую работу в DS вам и Джимми Нейтроном быть тоже не нужно. В целом, если вы отучились все 11 классов и в университете учились на любой технической специальности (т.е. у вас в программе был мат. анализ, линейная алгебра и теория вероятностей), то необходимая и достаточная база у вас имеется, возможно, достаточно будет только освежить знания.
Для тех, кому придётся начинать "с нуля" (или поднимать знания из самых глубин памяти) давайте чуть более подробно поговорим о том, какие темы и термины точно нужно знать и понимать, и почему они важны в DS и ML.
1) Градиент и производная
Существует численная мера того, насколько хорошо обучаемая модель описывает данные, на которых она обучается. Эта мера называется функционалом ошибки. По сути процесс обучения ML-модели - это подбор параметров модели, при которых значение этого функционала будет минимально возможным. Как правило для этого применяется алгоритм градиентного спуска. Градиент - это вектор, компоненты которого равны частным производным функции, от которой берётся градиент, по всем её переменным. Какое отношение к этому имеют ML-модели? Самое что ни на есть прямое, ведь функционал ошибки модели по большому счёту является очень сложной функцией, зависящей от множества переменных - весов самой модели. У градиента есть замечательное свойство, которое и делает это понятие таким важным для задач оптимизации - градиент всегда указывает направление наискорейшего роста некоторой скалярной величины, в нашем случае - функционала ошибки модели. Таким образом, меняя в процессе обучения веса модели в направлении, противоположном рассчитанному градиенту (в направлении антиградиента), мы должны добиваться наискорейшего убывания ошибок, то есть наискорейшего улучшения меры качества обучения. Должны, но на практике так происходит не всегда. Чтобы понять почему, нам нужно было бы рассмотреть такие моменты, как подбор "скорости обучения", что такое "переобучение", и в чём разница локальных и глобальных минимумов, но это темы для другого разговора. Нам же важно запомнить, что градиент - основополагающее понятие для понимания процесса обучения моделей. Хорошие новости: вам вряд ли когда-то придётся обучать модели "вручную", самим считая градиенты (хотя это довольно хорошее упраженение для саморазвития) Плохие новости: на начальных собедеседованиях вас очень вероятно могут спросить о том, что из себя представляет обучение модели, что такое градиентный спуск и в чём будут отличия в применении этого алгоритма для обучения разных классов моделей.
2) Матричные операции
В анализе данных вам всегда предстоит работать с величинами, организованными в матрицы и векторы. Поэтому нужно знать, каким правилам подчиняются эти структуры. Нужно понимать, как складываются и перемножаются матрицы, что такое транспонирование матрицы, что такое обратная матрица и как её найти. Если мы говорим о задаче обучения с учителем (а большая часть задач относится именно к этому классу), то для многих моделей ML-моделей сам процесс получения прогноза для некоторой выборки объектов по их признаковому описанию есть ни что иное, как последовательность матричных операций операций.
Например, для логистической регрессии, одной из классических и самых известных моделей, прогнозирующей вероятность наступление определенного события, получение прогнозов - это перемножение матрицы признаков и вектора весов модели, затем сложение с вектором смещения, а после - пропускание результата через логистическую функцию. Так что, матрицы и векторы в анализе данных буквально везде, и вам с ними придётся быть на "ты".
3) Математическая статистика и теория вероятностей
Одна из популярнейших практических задач, с которыми сталкиваются специалисты по анализу данных - это проведение А/Б тестов - экспериментов, в которых сравниваются две или больше выборок объектов, отличающихся некоторым признаком, для определения влияния этого признака на целевой показатель.
Разберём на примере. Представим, что мы банк, и мы хотим продавать своим клиентам, скажем, кредит на автомобили; у нас есть два способа набрать группу людей, которым мы позвоним и предложим новый продукт: первый - руководствуясь некоторыми бизнес правилами, второй - набрать группу по прогнозу ML-модели. Чтобы понять, какой способ эффективнее, проводится эксперимент. С помощью обоих методов набираются две группы клиентов примерно одинакового размера, затем в один и тот же промежуток времени происходит коммуникация и с одними, и с другими, а затем сравниваются конверсии (доля клиентов, откликнувшихся на предложение) в группах. А для того, чтобы понять действительно ли в результатах есть значимая разница, или все различия можно списать на случайность, и на самом деле оба метода примерно равны, применяется математическая статистика. Лично мне с подобной задачей пришлось столкнуться в первые 3-4 месяца работы на своей первой работе в роли дата саентиста, так что, базовые знания в статистике иметь необходимо.
Из основных понятий статистики обязательно нужно знать, что такое распределение (особенно - нормальное распределение) и его основные параметры - мат. Ожидание, дисперсия, медиана и мода; для для проведения экспериментов необходимо научиться правильно формулировать гипотезы, проверяющиеся в ходе эксперимента, а также знать основные тесты для проверки гипотез (например, z-test и t-test, бутстрап-тест). Нужно знать, что такое p-value, доверительные интервалы.
Особое внимание нужно уделить центральной предельной теореме - закону, который гласит, что при вне зависимости от исходной формы распределения некоторой величины, распределение выборочных средних этой величины будет стремиться к нормальному при увеличении числа выборок. Эта теорема очень важна, т.к. многие методы проверки гипотез включают в себя предположение о том, что данные распределены нормально.
Ещё одна вещь из мира статистики, которая точно может вам пригодиться - это теорема Байеса, которая позволяет найти вероятность наступления одного события при наступлении другого, каким-то образом связанного с первым. Она помогает принимать решения в условиях неопределенности, "разбавляемой" новыми данными. Также, существует целый класс ML-моделей, называемый байесовскими классификаторами, в основе которых (с некоторыми поправками) лежит теорема Байеса. Полагаю, этих вещей уже достаточно для того, чтобы уделить теореме Байеса внимание при обучении, тем более, что вопросы по ней вполне могут встретиться на собеседованиях.