Книга Роман с Data Science. Как монетизировать большие данные, страница 40. Автор книги Роман Зыков

Разделитель для чтения книг в онлайн библиотеке

Онлайн книга «Роман с Data Science. Как монетизировать большие данные»

Cтраница 40

И наконец, шестой способ – использовать ансамбли алгоритмов.

Ансамбли

Теорема No Free Lunch (или по-нашему – халявы не бывает) гласит, что не существует единственного алгоритма, который будет самым точным для любых задач. Аналитики могут заниматься ручным трудом, подбирая все новые и новые модели, которые наилучшим образом решают проблему. Но что если попытаться объединить разные модели в одну большую, каким-либо образом аккумулируя результат? Тогда мы получим новый алгоритм – ансамбль алгоритмов, точность которого может быть очень высокой, даже если использовать внутри «слабые» алгоритмы, чья точность чуть выше обычного подбрасывания монетки. Развитие вычислительных мощностей (больше памяти, мощные процессоры) с легкостью позволило сделать это.

Способов объединения простых алгоритмов в ансамбли придумано много, но мы рассмотрим два наиболее известных типа – бэггинг (bagging) и бустинг (boosting). Бэггинг (Bagging = Bootstrap aggregating) был предложен Лео Брейманом в 1994 году. Суть метода заключается в создании множества тренировочных датасетов, слегка отличающихся от исходного. Делать это можно двумя способами – случайно выбирая (сэмплируя) записи из датасета и случайно выбирая подмножество фич из датасета. Обычно эти два способа совмещают: случайно выбираются и записи, и фичи. Само сэмплирование данных осуществляется с замещением – мы не удаляем строки из исходного датасета, а значит, какие-то данные попадут в новый датасет несколько раз, а какие-то вообще не попадут.

Базовые алгоритмы для бэггинга должны обладать склонностью к переобучению – например, глубокие деревья решений с большим числом ветвей. Затем на каждом тренировочном датасете обучается базовый алгоритм. Для получения результата всего ансамбля результаты обучения на всех датасетах усредняются. Самый известный алгоритм – Random Forest, его несложно написать самому, но можно воспользоваться готовыми реализациями [56].

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

Самые известные алгоритмы на основе бустинга деревьев (Gradient Boosting Decision Tree) – XGBoost [57], LightGBM [58] от Microsoft и CatBoost [59] от Яндекса. Они являются топовыми алгоритмами, с помощью которых побеждают на Kaggle. Сравним деревья на бустинге и бэггинге. Первый последовательный, второй параллельный, поэтому бэггинг быстрее считается. Его можно распараллелить по нодам кластера или по ядрам процессора. Это бывает важно, например, когда вы хотите быстро получить результат, Random Forest будет быстрее. По точности решения лидирует бустинг, но для этого его нужно долго учить (дни и даже недели), подбирать множество параметров модели (гиперпараметров). Random Forest из коробки учится проще.

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

Глава 9
Машинное обучение на практике
Роман с Data Science. Как монетизировать большие данные
Как изучать машинное обучение

Когда я учился в Твери, в самой обычной школе, и целый год самостоятельно готовился к поступлению в МФТИ, то обкладывался учебниками и решал олимпиадные задачи по четыре часа в день. Два часа уходило на математику, два часа на физику. Я привык так учиться, по-настоящему хорошие книги – мои лучшие друзья.

Я считаю, что получить фундаментальные знания о предмете можно только из книги. Но сейчас время идет быстрее, чем 20 лет назад, и его часто не хватает, чтобы прочитать весь учебник от корки до корки. Приходится часть информации хватать по верхам – и вот тут пригодятся хорошие онлайн-курсы. Я лично пользуюсь Coursera – они первыми сделали хороший коммерческий продукт, за которым стояли профессора Стэнфорда. Я прошел там дюжину различных предметов и именно на Coursera нашел самый лучший курс по машинному обучению. Это курс Machine Learning [61], автором которого является Эндрю Ын. Сам Эндрю – сооснователь Coursera. Я думаю, что его курс сделал очень многое для популярности этой платформы. Цифра зарегистрировавшихся на Machine Learning на сегодняшний момент перевалила за 3 миллиона. Также у Эндрю есть книга по практике машинного обучения [60], она доступна бесплатно.

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

Еще один большой плюс курса Эндрю Ына – вы будете сами программировать алгоритмы и поймете, как они устроены внутри. Это знания лишат вас страха перед машинным обучением – оно перестанет быть для вас магией и станет ремеслом. Я уверен, тот, кто усвоил школьный курс математики и знает технический английский, сможет без больших усилий пройти этот курс [61]. В нем не хватает только пары вещей – деревьев решений и ансамблей. Кстати, Machine Learning Эндрю Ына рекомендует и Шавье Аматриан на своей странице Quora.com.

Как еще можно освоить машинное обучение? Самостоятельно писать алгоритмы. Шавье рекомендует [62] следующую последовательность действий: взять хорошую книгу по машинному обучению, прочитать вводные главы, затем выбрать в книге алгоритм, который вам интересен, и написать его на том языке программирования, которым вы владеете. Если какие-то вещи непонятны, то можно подсмотреть готовую реализацию этого алгоритма в коде каких-либо библиотек (но лучше делать это по минимуму). Я давно заметил: чем сложнее даются знания, тем лучше они усваиваются. Не нужно бояться изобретать велосипед, эти знания пригодятся в дальнейшем. Я лично воспользовался советом Шавье несколько лет назад и написал свою небольшую библиотеку для машинного обучения на Scala [63]. В то время я читал книгу по дизайну программ на Scala и решил объединить эти знания и курс на Coursera. Для библиотеки использовал векторизованные вычисления так же, как это делал Эндрю Ын.

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

Вход
Поиск по сайту
Ищем:
Календарь
Навигация