http://habrahabr.ru/post/252743/
Привет, хабр!
После публикации
нескольких статей по
Big Data и
Машинному обучению, ко мне пришло немало писем от читателей с вопросами. За последние несколько месяцев мне удалось помочь многим людям сделать быстрый старт, некоторые из них — уже решают прикладные задачи и делают успехи. А кто-то уже устроился на работу и занимается решением реальных задач. Моя цель — чтобы вокруг меня были умные люди, с которыми в том числе и я смогу работать в дальнейшем. Поэтому я хочу помочь тем, кто действительно хочет научиться решать настоящие задачи на практике. В сети присутствует большое количество мануалов о том, как стать ученым по данным (
Data Scientist). В свое время я прошел все, что там есть.
Однако, на практике порой нужны совсем другие знания. О том, какие именно навыки нужны — я расскажу в сегодняшней статье и постараюсь ответить на все Ваши вопросы.
Если загуглить
«How to become a Data Scientist», можно наткнуться на множество картинок вроде
этой или
этой. В целом, все, что там написано — действительно так. Но, изучив все это, не гарантируется, что вас ждет успех в решении реальных задач на практике. В целом, можно пойти путем, изложенным на изображениях выше — а именно, учиться самостоятельно, после чего пойти и решать реальные задачи. Можно поступить иначе — пойти получить специальное образование. В свое время мне довелось пройти и тот и другой путь — и курсы
Coursera, и
Школу Анализа Данных и множество других курсов в ВУЗе, в том числе по компьютерному зрению, анализу веб-графов, Large Scale Machine Learning и др. Мне повезло учиться у лучших преподавателей — и пройти лучшие курсы, какие только есть. Но только после того, как я начал применять полученные знания на практике, пришло понимание, что в курсах зачастую не уделяется должное внимание практическим проблемам, либо они не усваиваются до тех пор, пока сам на них не наткнешься. Поэтому, я постараюсь изложить набор минимальных навыков, которых будет достаточно для того, чтобы как можно скорее начать решать задачи на практике.
Станьте отличным математиком
Да, это наверное самое важное — математическое мышление, которое надо развивать в себе постоянно с младших лет. Для тех, кто, возможно это упустил, стоит начать с курсов по Дискретной математике — это полезно вообще для всех людей, которые работают в IT. На этом основаны все доказательства и рассуждения в дальнейших курсах. Рекомендую пройти
курс Александра Борисовича Дайняка, который когда-то я слушал очно. Этого должно быть достаточно.
Здесь важно набрать навыки работы с дискретными обьектами.
После того, как вы научитесь оперировать дискретными обьектами, рекомендуется познакомиться с построением эффективных алгоритмов — для этого достаточно пройти небольшой курс по алгоритмам, вроде
курса ШАДа или прочитав обзор известных алгоритмов на
e-maxx.ru — довольно популярный сайт среди участников ACM.
Здесь достаточно понимать, как реализовавывать алгоритмы эффективно, а также знать типичные структуры данных и случаи, когда их использовать.
После того, как ваш мозг научился оперировать с дисретными обьектами, а также развилось алгоритмическое мышление вам необходимо научиться мыслить в терминах теории вероятности. Для этого я рекомендую (заодно освежив знания в области дискретной математики) пройти
курс моего научного руководителя
Андрея Михайловича Райгородского, который умеет обьянять сложные вещи «на пальцах».
Здесь важно научиться оперировать в терминах теории вероятности и знать основные понятия математической статистики.
В целом, этого хоть и мало, но на практике достаточно для того, чтобы иметь дело с дискретными обьектами и оперировать вероятностными величинами. Еще неплохо иметь представление о линейной алгебре, но, как правило, в курсах машинного обучения есть введения в необходимые разделы. Добавив к этому хорошие навыки программирования, можно стать неплохим разработчиком.
Научитесь писать код
Для того, чтобы стать хорошим разработчиком, конечно необходимо знать языки программирования и иметь опыт написания хорошего промышленного кода. Для ученого по данным достаточно знания, как правило, скриптовых языков, такие вещи, как шаблоны или классы, обработка исключений, как правило — не нужны, поэтому в них углубляться не стоит. Вместо этого неплохо знать хотя бы один скриптовый язык, ориентированный на научные и статистические вычисления. Наиболее популярные из них — это
Python и
R. Существует достаточно много хороший онлайн курсов по обоим языкам. Например, вот
этот по Python или вот
этот по R — в них даются базовые знания, достаточные для специалиста по данным.
Здесь в первую очередь важно научиться работать с манипулированием данными — это 80% работы ученого по данным.Пройдите основные курсы по машинному обучению
После того, как вы обрели хорошую математическую культуру и получили навыки программирования — самое время начать изучать машинное обучение. Я настоятельно рекомендую начать с курса
Andrew Ng — т.к. этот курс остается до сих пор наилучшим введением в предмет. Конечно, в курсе проспускаются важные распространенные алгоритмы, вроде деревьев — но на практике, теоретических знаний, полученных в этом курсе вам будет достаточно для решения большинства задач. После этого настоятельно рекомендуется начать как можно скорее решать задачи на
Kaggle — а именно, начать с задач из раздела
Knowledge — в них есть хорошие Tutorials, в которых разбираются задачи — именно они нацелены на быстрый старт для новичков. Уже после этого можно подробнее познакомиться с оставшимися разделами машинного обучения и пройти полностью
курс К.В.Воронцова по машинному обучению.
Здесь важно получить целостное представление о задачах, которые могут возникать на практике, методах их решения и научиться реализовывать свои идеи на практике. Важно также добавить, что большинство алгоритмов машинного обучения уже реализовано в библиотеках, таких как
scikit-learn для Python. Введение в Scikit-Learn я публиковал
ранее.
Практикуйтесь в построении алгоритмов
Участвуйте как можно больше в соревнованиях по машинному обучению — решайте как простые классические задачи, так и задачи в неклассической постановке, когда, например,
нет обучающей выборки.
Это необходимо для того, чтобы вы набрались различных методик и трюков, которые используются в задачах и помогают значительно увеличить качество полученных алгоритмов. О некоторых практически важных трюках я рассказывал ранее
здесь и
здесь.
После этого, вы уже, как правило готовы к построению хороших алгоритмов и к участию в денежных соревнованиях Kaggle, однако, пока ваши возможности ограничиваются работой с небольшими данными, которые помещаются в оперативной памяти вашей машины. Для того, чтобы иметь возможность работать с большими данными необходимо познакомиться с моделью вычислений Map-Reduce и инструментами, применяемыми для работы с большими данными
Познакомьтесь с большими данными
После того, как вы научились строить хорошие модели — необходимо научиться работать с большими данными. В первую очередь нужно познакомиться с методами хранения больших данных, а именно с файловой системой
HDFS, которая входит в стек
Hadoop, а также с моделью вычислений
Map-Reduce. После этого необходимо познакомиться с остальными компонентами из стека Hadoop — а именно, как устроена
YARN, как работает планировщик
Oozie, как устроена
NoSQL базы данных, такие как
Cassandra и
HBase. Как данные импортируются в кластер с помощью
Apache Flume и
Apache Sqoop. В сети пока еще мало курсов по этим разделам, наиболее полным справочником остается книга
Hadoop: The Definitive Guide.
Здесь важно понять особенности взаимодействия всех компонент Hadoop, а также способы хранения и вычислений на больших данных.Познакомьтесь с современными инструментами
После изучения стека технологий Hadoop, вам необходимо познакомиться с фреймворками, которые используются парадигму Map-Reduce и с прочими инструментами, которые использутся для вычислений на больших данных. Часть из этих инструментов я описывал уже ранее. А именно — познакомьтесь с набирающем в последнее время популярность
Apache Spark, который мы уже рассматривали
здесь,
здесь и
здесь. Помимо этого рекомендуется познакомиться с альтернативными инструментами, работать с которыми вы можете даже не имея кластера — это инструмент, позволяющий строить линейные модели (обучая их в онлайн-режиме, не помещая обучающую выборку в оперативную память)
Vowpal Wabbit, обзор которого мы делали
ранее. Также, важно изучить простые инструменты из стека Hadoop —
Hive и
Pig, которые используются для несложных операций с данными в кластере.
Здесь важно научиться реализовывать необходимые вам алгоритмы машинного обучения, как вы это делали ранее с помощью Python. Отличием является то, что теперь вы работаете с большими данными с помощью другой модели вычислений.Изучите Real-Time инструменты обработки больших данных и вопросы архитектуры
Зачастую хочется строить системы, которые принимают решения в реальном времени. В отличие от работы с накопленными данными, здесь существует своя терминология и модель вычислений. Рекомендуется познакомиться с инструментами
Apache Storm, который исходит из предположения, что единица обрабатываемой информации — это транзакция, и
Apache Spark Streaming — в котором заложена идея о том, чтобы производить обработку данных мелкими кусками (
batch'ами). После этого у любого читателя возникнет вопрос — как выглядит архитектура кластера, в которой часть поступающих данных обрабатывается в режиме онлайн, а часть — накапливается для последующей обработки, как эти две компоненты взаимодействуют между собой и какие инструменты используются в каждом на каждом этапе хранения и обработки данных. Для этого я рекомендую познакомиться с так называемой
лямбда-архитектурой, которая достаточно подробно описана на
этом ресурсе.
Здесь важно понимать, что на каждом этапе происходит данными, как они преобразуются, как они хранятся и как над ними происходят вычисления.
Итак, мы рассмотрели далеко не все знания и навыки, которые требуются для того, чтобы понимать, как на практике работать с Big Data. Но часто в реальных задачах на практике возникает множество трудностей, с которыми приходится работать. Например, элементарно может отсутствовать обучающая выборка или часть данных может быть известна с некоторой точностью. Когда же дело касается реально огромных массивов данных — то тут зачастую начинаются в том числе и технические трудности и важно знать не только методы машинного обучения, но и их эффективную реализацию. Более того,
еще только появляются и развиваются инструменты, которые позволяют обрабатывать данные в оперативной памяти и часто нужно очень постараться, чтобы правильно их закэшировать, либо известная проблема мелких файлов того же
Apache Spark — со всем этим приходится иметь дело на практике!
Напишите мне Ваши вопросы
Повторюсь, что публикуя статьи на хабре, я преследую цель подготовки людей для работы в Big Data, для того, чтобы в последствии с ними работать. За последние несколько месяцев мне удалось помочь многим людям сделать быстрый старт. Поэтому, я очень хочу с Вами познакомиться и ответить на текущие вопросы, помочь начать решать задачи или помочь с решением уже существующих. Дальше я буду наблюдать за вашим прогрессом (если Вы не против) и помогать, если это будет необходимо. Лучших людей я выберу и буду персонально готовить на протяжении ближайших нескольких месяцев, после чего, возможно, у меня к ним будут интересные предложения!
Не знаю, сколько писем придет на почту, сразу лишь скажу — что отвечать буду поздно вечером, либо ночью, т.к. днем я работаю). Постараюсь ответить на столько писем, насколько смогу.
Помимо цели обучения людей, я также хочу показать, что методы обработки
«Big Data», про которые так любят рассказывать маркетологи, не являются «волшебной палочкой», с помощью которой можно творить чудеса. Я постараюсь показать, какие задачи сейчас решаются хорошо, какие возможно решить при желании, а какие — пока еще решать тяжело. После Ваших вопросов я напишу большой пост, в котором опубликую развернутые ответы. Давайте вместе развивать
Data Science, потому что настоящих специалистов сейчас очень не хватает, а
дорогих курсов хоть отбавляй.
Поэтому, все те, кто хотел бы научиться решать задачи, независимо от Вашего уровня подготовки — напишите мне на почту (
al.krot.kav@gmail.com) письмо с темой
Big Data, указав:
- Информацию о себе: как вас зовут, чем занимаетесь, где работаете/учитесь
- Ваш опыт: что пытались учить сами, что получилось/не получилось
- Цели, которых хотите достичь: самый важный пункт — без этого письмо читать не буду)
- Ваш непосредственный вопрос, если таковой уже есть
Буду ждать Ваших писем!