Big Data в реално изживяване на Beeline
Хей habr! Казвам се Александър Крот, отговарям за разработването на алгоритми за машинно обучение и извличане на данни в Beeline, както и за обучението и подбора на специалисти по данни под ръководството на Сергей Марин, който преди това ви запозна с работата на нашия отдел Big Data. Вече писах за някои аспекти на Big Data и Machine Learning, но днес ще ви разкажа как работи на практика, а именно как ние в Beeline решаваме проблеми, свързани с анализа на големи данни, как избираме специалисти, какви инструменти и методи използваме на практика.
Как решаваме проблемите
На всеки етап от решаването на следващата задача ние използваме най-новите и популярни инструменти. Самият процес на разработване на нов продукт, след като са му представени всички изисквания на клиента и е ясен приблизителният процес на решение, изглежда така.
Събиране на данни
По правило, когато задачата вече е поставена и приблизителният вектор на данните, които ще са необходими за решаване на проблема, е ясен, започва процесът на събиране и агрегиране. Това е така наречениятETL (Extract Transform Load)процес. На пръв поглед тази стъпка може да изглежда тривиална, но на практика далеч не е така. Трябва да разтоварите голямо количество несвързани данни, да ги почистите и обедините. На практика може да има пропуски в данните, може да има неправилни стойности. Усложнява се и от факта, че работим с данни от много източници (фактуриране, геоданни, интернет събития, данни за качеството на услугата, CRM, данни за попълване и дебити, свързани тарифи и услуги и много други) и за да комбинираме данни помежду си (и, например, да извършим добре познатата операция за присъединяване),необходимо е да пренесете данните в едно хранилище и преди да започнете процеса на сливане, трябва внимателно да помислите как да направите заявка, така че да е възможно най-ефективна по отношение на изчислителната сложност. Тук е необходимо умението за ефективно прилагане на алгоритми. На този етап се използват инструменти катоHive,Pig(за прости заявки),Apache Spark(за по-сложни заявки). На този етап е важно да се отбележи една особеност: често при проблеми с машинно обучение (например при проблеми с класификация или регресия) е необходима така наречената тренировъчна извадка - набор от обекти, чиято целева (предсказана) променлива вече е известна. На практика е много трудно да се намери добра и голяма обучителна извадка (която ще разгледам по-подробно по-долу) в много проблеми - първо трябва да извлечете набор от обучителни обекти чрез решаване на спомагателни задачи.
Изграждане на алгоритъм
След като всички данни бъдат събрани, започва процесът на изграждане на алгоритъм, който включва много стъпки. Като начало от всички данни се взема малка част - такава, която се побира в RAM паметта на обикновен персонален компютър. В този момент са включени всички умения, които специалистите използват при решаване на проблеми на Kaggle. А именно: чрез експерименти Data Scientist решава как ще попълни липсващите стойности в данните, извършва подбор и създаване на функции, тества много алгоритми, избира всички необходими параметри, а също така решава много по-малки помощни задачи. След приключване на този етап, като правило, има готов прототип на бъдещия алгоритъм. Той използва инструменти за анализ на данни катоRилиPythonс различни библиотеки (напр.scikit-learnилиpandas). Важно е да се отбележи, че всички стъпки в изграждането на алгоритъма са документирани в подробен отчет с помощта наIPython Notebook(RMarkdownсъответно).
Мащабиране на алгоритъм. Обучение за големи данни
Освен това, веднага след като прототипът на алгоритъма е готов, по правило се извършва процесът на обучение върху големи данни - обучението на алгоритъма, избран на предишния етап, започва върху по-голямо количество данни. За това се използват инструменти за големи данни като Apache Spark и Vowpal Wabbit. Първият ви позволява ефективно да прилагате итеративни алгоритми за машинно обучение и алгоритми върху графики, благодарение на ефективен изчислителен модел в паметта. Второто е да се внедри онлайн обучение на така наречените линейни модели върху големи данни, без изобщо да се зареждат всички данни в RAM. Струва си да се отбележи нарастващата популярност на най-новите инструменти, както и факта, че те, както всички предишни, се разпространяват свободно (което означава, че на практика, като правило, те изискват значително усъвършенстване за промишлена употреба).
Трябва да се отбележи, че това далеч не е единственият възможен процес за решаване на проблема. Често алгоритмите веднага се обучават на големи данни или самата задача включва само компетентно извличане и агрегиране на данни (т.е. това е чист ETL процес). Също така често решаваме задачи върху графики, примери и методи за решаване, за които говорих по-рано. Като цяло в по-голямата си част процесът изглежда като описания по-горе. Средното време от раждането на идеята до внедряването на продуктивно решение варира от няколко дни до месец (като се вземат предвид всички видове тестване, оптимизация и подобряване на качеството на алгоритмите).
Какви задачи решаваме
Ще опиша само задачите, коитоРаботя директно, в същото време има и други също толкова интересни задачи, като геоаналитика, които използват по-прости алгоритми, но изискват например висококачествена визуализация. И така, ние решаваме следните проблеми на машинното обучение и извличането на данни:
Задачи за обработка на естествен език
Обработката на естествен език и текст е една от най-сложните области на извличане на данни в момента - наравно с обработката на изображения и сигнали. На този етап използваме както класически алгоритми, така и текстови функции като торба с думи (Bag of Words) илиTF-IDF, както и по-усъвършенствани методи за дълбоко обучениеDeep Learning(например активно използваме структурата от данниword2vecза търсене на синоними на думи), които със значителни размери на обучителната извадка се оказват много по-ефективни в проблеми с класификацията на текста (и се използват за борба със спама). От инструментите тук ние използваме различни библиотеки катоNLTK (Natural Language Toolkit)и вече внедрени алгоритми в Apache Spark.
Графични проблеми (анализ на социални мрежи)
Проблеми на прогнозирането (предвидително моделиране)
Проблемите с класификацията в класическата среда изглеждат прости. Има набор от обекти, да речем, абонати, и набор от характеристики, които ги описват. От целия набор от обекти има малка група, за всеки обект от която е известна стойността на целевата променлива, например вероятността абонатът да е склонен да се оттегли или е склонен да извърши едно или друго целево действие. Това е така нареченият тренировъчен комплект. Задачата е да се предвиди стойността на целевата характеристика за всички останали обекти. Типична задачарегресия(когато прогнозираната стойност е някакво число) иликласификация(когато прогнозираната стойност е някакъв етикет). Сред примерите за задачи, които решаваме, в допълнение към задачата за прогнозиране на отлив, можем да подчертаем задачите за прогнозиране на пола, възрастта, склонността на абоната да използва конкретни услуги, като например пакета споделени данни. Всичко това се използва например за целеви предложения на собствени услуги на оператора. Тук активно използваме линейни модели, дървета на решенията, невронни мрежи, както и състави на алгоритми (например бустинг). Сред инструментите са Python с неговите библиотеки или, в случай на обучение за големи данни, Apache Spark или Vowpal Wabbit.
Клъстерни задачи (Клъстерен анализ)
Това не е пълен списък от задачи, с които се занимаваме в рамките на извличането на данни на Beeline. Трудно е да се опише целият списък в една статия, ще ви разкажа повече за отделните задачи по-късно.