Big Data в Билайне: реальный опыт



    Привет, хабр! Меня зовут Александр Крот, я отвечаю за разработку алгоритмов машинного обучения и интеллектуального анализа данных в компании Билайн, а также за подготовку и отбор специалистов по работе с данными под руководством Сергея Марина, который ранее знакомил Вас с работой нашего подразделения Big Data. Я уже писал про отдельные аспекты Big Data и Machine Learning, но сегодня я расскажу, как это устроено на практике, а именно — как мы в Билайн решаем задачи, связанные с анализом больших данных, как отбираем специалистов, какие инструменты и методы применяем на практике.

    Кто мы


    Начнем с того, что у нас есть лаборатория, в которой работают специалисты — так называемые Data Scientist'ы — люди, которых на рынке найти очень сложно. К нам на собеседование приходит много людей, только лишь единицы из которых остаются работать у нас.
    Процесс начинается с телефонного интервью с вопросами по некоторым разделам математики. После кандидата ждёт тестовая задача — конкретная задача машинного обучения, аналогичная задачам на kaggle.com. Построив хороший алгоритм и получив высокое значение метрики качества на тестовой выборке, кандидат допускается до следующего этапа — непосредственного собеседования, на котором проверяется знание методов машинного обучения и анализа данных, а также задаются нетривиальные вопросы из практики и задачи на логику. Идеальный потрет кандидата — это выпускник МФТИ, МГУ, ШАД, участник соревнований ACM и Kaggle с обязательным практическим опытом построения алгоритмов машинного обучения и анализа данных (телеком, банки, ретейл). Плюсом является опыт применения методов Large Scale Machine Learning, т. е. построения алгоритмов машинного обучения, в случае когда обучаться приходится на очень больших данных, которые не помещаются в оперативную память машины.

    Как мы решаем задачи


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

    Сбор данных


    Как правило, когда задача уже поставлена и понятен примерный вектор данных, которые потребуются для решения задачи, начинается процесс сбора и агрегации. Это так называемый ETL (Extract Transform Load) процесс. На первый взгляд этот шаг может показаться тривиальным, но на практике это далеко не так. Приходится выгружать большое количество не связанных между собой данных, чистить их и объединять.
    На практике в данных могут быть пропуски, могут быть некорректные значения. Усложняется всё ещё и тем, что мы работаем с данными из многих источников (биллинг, геоданные, интернет-события, данные о качестве сервиса, CRM, данные о пополнениях и списаниях, подключённые тарифы и услуги и многое другое), и чтобы объединить данные между собой (и, например, выполнить всем известную операцию join), необходимо занести данные в единое хранилище, и прежде чем запустить процесс объединения, нужно хорошо подумать, как сделать запрос так, чтобы он был максимально эффективным с точки зрения вычислительной сложности. Именно здесь необходим навык эффективной реализации алгоритмов.
    На данном этапе используются такие инструменты, как Hive, Pig (для простых запросов), Apache Spark (для более сложных запросов). В этом пункте важно отметить одну особенность: часто в задачах машинного обучения (например, в задачах классификации или регрессии) необходима так называемая обучающая выборка — набор объектов, целевая (предсказываемая) переменная которых уже известна. На практике найти хорошую и большую обучающую выборку (подробнее о которой я расскажу ниже) во многих задачах очень сложно — приходится сначала добывать набор обучающих объектов путём решения вспомогательных задач.

    Построение алгоритма


    После того как все данные собраны, начинается процесс построения алгоритма, который включает в себя множество этапов. Для начала из всех данных берётся некоторая небольшая часть — такая, которая помещается в оперативной памяти обычного персонального компьютера. В этот момент задействуются все навыки, которые специалисты применяют при решении задач на Kaggle. А именно: путем экспериментов Data Scientist решает, как будут заполнять пропущенные значения в данных, делает отбор и создание признаков , , тестирует множество алгоритмов , подбирает все необходимые параметры, а также решает множество более мелких вспомогательных задач. После завершения данного этапа, как правило, имеется готовый прототип будущего алгоритма. Здесь используются такие инструменты анализа данных, как R или Python со всевозможными библиотеками (например, scikit-learn или pandas). Важно отметить, что все шаги при построении алгоритма оформляются в подробный отчёт с помощью IPython Notebook (RMarkdown соответственно).

    Масштабирование алгоритма. Обучение на больших данных


    Далее, как готов прототип алгоритма, как правило, происходит процесс обучения на больших данных — запускается обучение выбранного на предыдущем этапе алгоритма на большем объёме данных. Для этого используются инструменты для работы с большими данными — Apache Spark и Vowpal Wabbit. Первый из них позволяет эффективно реализовать итеративные алгоритмы машинного обучения и алгоритмы на графах благодаря эффективной модели вычислений в оперативной памяти. Второй — реализовать онлайн-обучение так называемых линейных моделей на больших данных, не загружая все данные в оперативную память вообще. Стоит отметить растущую популярность последних инструментов, а также то, что они, как и все предыдущие, являются свободно распространяемыми (а значит, на практике, как правило, требуют существенной доработки для промышленного применения).

    Стоит отметить, что это далеко не единственный возможный процесс решения задачи. Зачастую алгоритмы сразу обучаются на больших данных, либо сама задача предполагает только грамотное извлечение и агрегацию данных (т. е. представляет собой чистый ETL-процесс). Также часто у нас решаются задачи на графах, о примерах и методах решения которых я рассказывал ранее. В целом в большей части процесс выглядит так, как описано выше. Среднее время от рождения идеи до реализации продуктивного решения составляет от нескольких дней до месяца (с учётом всевозможного тестирования, оптимизации и улучшения качества алгоритмов).

    Какие задачи мы решаем


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

    Задачи обработки естественного языка (Natural Language Processing)


    Обработка естественного языка и текстов является одним из самых сложных разделов интеллектуального анализа данных в настоящее время — наравне с обработкой изображений и сигналов. В этом месте мы используем как классические алгоритмы и текстовые признаки вроде мешка слов (Bag of Words) или TF-IDF, так и более продвинутые методы глубокого обучения Deep Learning (например, активно используем структуру данных word2vec для поиска синонимов слов), которые при существенных размерах обучающей выборки оказываются гораздо более эффективными в задачах классификации текстов (и используются для борьбы со спамом). Из инструментов здесь мы используем различные библиотеки вроде NLTK (Natural Language Toolkit) и уже реализованные алгоритмы в Apache Spark.

    Задачи на графах (Social Network Analysis)


    Мы также занимаемся задачами анализа сетей — так называемых графов. Подробно об этом я рассказывал ранее , поэтому сейчас лишь кратко напомню, что граф — это множество объектов, между которыми известны связи. Или, говоря простым языком, это множество точек (вершин), соединённых отрезками (ребрами). Типичные графы — это социальные сети, где между объектами определено понятие дружбы, или граф Интернета, в котором есть сайты, ссылающиеся друг на друга. В графах можно выделять сообщества, вычислять, считать их различные характеристики, и даже предсказывать новые знакомства между людьми. Т. к. задачи на графах очень требовательны к ресурсам, здесь мы используем Apache Spark, в котором уже реализована часть известных алгоритмов, таких как поиск сильно связных компонент (Strongly Connected Components) или PageRank. Однако зачастую этого недостаточно, и мы используем другие инструменты, которые используют более привычную модель вычислений Pregel.

    Задачи прогнозирования (Predictive Modeling)


    Задачи классификации в классической постановке выглядят просто. Имеется набор объектов, скажем, абонентов и множество признаков, их описывающих. Из всего множества объектов есть небольшая группа, для каждого объекта из которой известно значение целевой переменной, например, вероятность того, что абонент склонен уйти в отток или склонен совершить то или иное целевое действие. Это так называемая обучающая выборка. Задача заключается в предсказании значения целевого признака для всех остальных объектов. Типичная задача регрессии (когда предсказываемым значением является некоторое число) либо классификации (когда предсказываемым значением является некоторая метка). Среди примеров решаемых нами задач, помимо задачи прогнозирования оттока, можно выделить задачи предсказания пола абонента, возраста, склонности к потреблению конкретных услуг, таких, например, как Shared Data Bundle. Все это используется, допустим, для таргетированных предложений собственных услуг оператора. Здесь мы активно используем линейные модели, деревья решений, нейронные сети, а также композиции алгоритмов (например, бустинг). Среди инструментов — Python с его библиотеками либо, в случае обучения на больших данных, Apache Spark или Vowpal Wabbit.

    Задачи кластеризации (Cluster Analysis)


    Задачи кластеризации, в отличие от задач прогнозирования, не имеют обучающей выборки. Типичная постановка таких задач заключается в поиске закономерностей в неразмеченных данных. Единственное, что есть на входе в такой задаче, — это набор объектов и известных для них признаков. В рамках задачи необходимо ответить на вопрос: разделяются ли объекты на кластеры, внутри каждого объекты из которых очень похожи друг на друга? С помощью этого мы регулярно сегментируем абонентскую базу с целью нахождения групп пользователей, в некотором смысле похожих друг на друга. Мы выделяем людей, которые составляют некоторое социальное сообщество. После этого изучаем интересы и особенности конкретной группы с помощью задач прогнозирования, описанных выше. Здесь мы используем как классические алгоритмы вроде KMeans, так и более продвинутые алгоритмы иерархической кластеризации и кластеризации на графах.

    Это далеко не полный список задач, которыми мы занимаемся в рамках интеллектуального анализа данных компании Билайн. Весь перечень сложно описать в одной статье, подробнее об отдельных задачах я расскажу позже.
    ВымпелКом (Билайн)
    0.00
    Company
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 18

      +13
      Пафосный товарищ на заглавной картинке морщит лоб над примерами из средней школы…
        +3
        Научите, как Вы распознаёте мимику лба по затылку?
        :-0
          +1
          Тут хорошо сработает популярный в последнее время Deep Learning подход, в частности – сверточные нейронные сети (CNN). Дайте нам набор интересующих Вас лбов – мы их научимся классифицировать!
          +1
          При этом на доске мешанина из математики, химии и физики, никак не связанных с собой.
            +1
            Уговорили. Убрали.
              0
              Годно. И, что не маловажно, тема лбов-затылков осталась актуальной. 2 эксперимента позволяют начать классификацию?
              +1
              Для тех кому интересно, какая картинка была ранее… :]
              Спойлер

              +2
              Дело за малым — дать в конце статьи ссылку на тестовые задания. Или хотя-бы в комментариях. Меня персонально интересует тема NLP.
                –2
                Напишите на akrot@beeline.ru– я дам вам пример задачи.
                –1
                Простите, я понимаю у яндекса, но какой data science в принципе может быть у билайна?! Что вы анализируете, зачем?
                  –2
                  В тексте содержится ответ.
                    –2
                    Спасибо, туплю.
                  +4
                  А есть какие-то данные об эффективности применяемых методик? Т.е. как было ДО и стало ПОСЛЕ в каких-то осязаемых величинах ($$$, время и т.п.)
                    0
                    Мы решаем много исследовательских задач, многие из которых ранее операторы не решали. Критерии качества алгоритмов обычно формируются классических терминах машинного обучения – Precision, Recall и тому подобных. Результаты исследований передаются в соответствующий департамент Билайна. Например, если решается задача по разработке таргетированного предложения – результаты исследований попадают в департамент по работе с клиентами, где планируется кампания и происходит непосредственное взаимодействие с конечным клиентом.
                    +1
                    Про техническую часть — все понятно и очень интересно, спасибо.
                    А какие бизнес-задачи решаете или решали, не могли бы рассказать коротенько, если не коммерческая тайна, конечно?
                    Как приходите к технической постановке задачи на исследование/разработку? Бизнес что-то спускает или сами что-то генерите? Формируются какие-то бизнес-требования и критерия качества? Как результаты ваших разработок и исследований до конкретных действий доходят?

                    Был бы признателен, если поделитесь своими соображениями и опытом на это счет.
                      0
                      Про бизнес-задачи расскажем подробнее в следующих статьях! Часть задач, конечно же, дает бизнес – особенно это касается классических для многих бизнесов задач, таких как – предсказание оттока, увеличение качества связи и таргетированные предложения услуг. Вторая часть задач – это исследовательские задачи, про них я частично ответил выше — habrahabr.ru/company/beeline/blog/254469/#comment_8354215
                      0
                      Привет, Билайн_ETL! Подскажи, пожалуйста, как до вас достучаться, если у вас прям сейчас на промышленном сайте ошибка работы веб-сервиса ETL?

                      https://widgetpay1.beeline.ru/api/WrongPayment/SubmitWrongPaymentRequest 
                      500 Internal Server Error:
                      
                      ExceptionMessage: "The database "beeline_ETL" cannot be opened. It is acting as a mirror database."
                      ExceptionType: "System.Data.SqlClient.SqlException"
                      Message: "An error has occurred."

                      StackTrace:
                      " at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
                      ↵ at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
                      ↵ at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
                      ↵ at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption)
                      ↵ at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
                      ↵ at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
                      ↵ at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
                      ↵ at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
                      ↵ at AltLanDS.Beeline.NewPay.Services.CrmIntegrationService.CrmIntegrationService.d__5.MoveNext()
                      ↵--- End of stack trace from previous location where exception was thrown — ↵ at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
                      ↵ at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
                      ↵ at AltLanDS.Beeline.NewPay.WebApp.Controllers.API.WrongPaymentController.d__5.MoveNext()
                      ↵--- End of stack trace from previous location where exception was thrown — ↵ at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
                      ↵ at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
                      ↵ at System.Threading.Tasks.TaskHelpersExtensions.d__3`1.MoveNext()
                      ↵--- End of stack trace from previous location where exception was thrown — ↵ at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
                      ↵ at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
                      ↵ at System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext()
                      ↵--- End of stack trace from previous location where exception was thrown — ↵ at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
                      ↵ at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
                      ↵ at System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext()
                      ↵--- End of stack trace from previous location where exception was thrown — ↵ at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
                      ↵ at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
                      ↵ at System.Web.Http.Controllers.ExceptionFilterResult.d__0.MoveNext()
                      ↵--- End of stack trace from previous location where exception was thrown — ↵ at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
                      ↵ at System.Web.Http.Controllers.ExceptionFilterResult.d__0.MoveNext()
                      ↵--- End of stack trace from previous location where exception was thrown — ↵ at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
                      ↵ at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
                      ↵ at System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()"


                        0
                        Привет билайн :) как у вас с big data, а то данные в договорах вы можете вносить только в офисах того региона где симку заводили :D и это-то в 2018 Привет себрканк.

                        Only users with full accounts can post comments. Log in, please.