Erhalten Sie Zugang zu diesem und mehr als 300000 Büchern ab EUR 5,99 monatlich.
Изучите ключевые концепции машинного обучения' работая над реальными проектами! Машинное обучение — то, что поможет вам в анализе поведения клиентов, прогнозировании тенденций движения цен, оценке рисков и многом другом. Чтобы освоить машинное обучение, вам нужны отличные примеры, четкие объяснения и много практики. В книге все это есть! Автор описывает реалистичные, практичные сценарии машинного обучения, а также предельно понятно раскрывает ключевые концепции. Вы разберете интересные проекты, такие как сервис прогнозирования цен на автомобили с использованием линейной регрессии и сервис прогнозирования оттока клиентов. Вы выйдете за рамки алгоритмов и изучите важные техники, например развертывание приложений в бессерверных системах и запуск моделей с помощью Kubernetes и Kubeflow. Пришло время закатать рукава и прокачать свои навыки в области машинного обучения!
Sie lesen das E-Book in den Legimi-Apps auf:
Seitenzahl: 467
Veröffentlichungsjahr: 2024
Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:
Переводчик Р. Чикин
Алексей Григорьев
Машинное обучение. Портфолио реальных проектов. — СПб.: Питер, 2023.
ISBN 978-5-4461-1978-3
© ООО Издательство "Питер", 2023
Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.
Я знаю Алексея уже более шести лет. Мы почти в одно время работали в команде анализа и обработки данных в IT-компании в Берлине: Алексей приступил к работе спустя несколько месяцев после моего ухода. Несмотря на это нам все же удалось познакомиться с помощью Kaggle, платформы для соревнований в области науки о данных, и благодаря одному общему другу. Мы состояли в одной команде в конкурсе Kaggle по обработке естественного языка, интересном проекте, который требовал тщательного использования предварительно обученных механизмов встраивания слов и их умелого смешения. В то время Алексей писал книгу и поэтому попросил меня быть научным редактором. Книга была о Java и науке о данных, и, читая ее, я особенно был впечатлен тем, насколько скрупулезно Алексей планировал и прорабатывал интересные примеры. Вскоре последовал новый этап сотрудничества: мы стали соавторами проектной книги о TensorFlow и работали над различными проектами: от обучения с подкреплением до рекомендательных систем, которые должны были стать источником вдохновения и примером для читателей.
Работая с Алексеем, я заметил, что он предпочитает учиться на практике и писать код, как и многие другие, кто перешел в data science из разработки.
Поэтому я не очень удивился, узнав, что он взялся за еще одну книгу, основанную на проекте. Алексей попросил меня оставить отзыв о его работе, так что я читал книгу еще на этапе рукописи, и она меня чрезвычайно увлекла. Книга представляет собой практическое введение в машинное обучение с упором на практику. Она написана для людей, имеющих тот же опыт, который есть у Алексея, — для тех разработчиков, кто интересуется data science и нуждается в том, чтобы быстро получить полезный опыт работы с данными‚ который можно было бы применять в своей работе.
Как автор более десятка книг по науке о данных и ИИ, я знаю, что на эту тему создано уже множество книг и курсов. Однако эта книга не похожа на другие. На ее страницах вы не найдете тех же избитых задач по работе с данными, которые предлагаются в других книгах. Нет здесь и педантичной, повторяющейся череды тем, которая подобна проторенной дороге‚ всегда ведущей в места, где вы уже были.
Все в книге вращается вокруг практических и почти реальных примеров. Вы узнаете, как спрогнозировать цену автомобиля, предсказать отток клиентов и оценить риск невозврата кредита. Затем вы классифицируете фотографии одежды, распределив их по категориям: футболки, платья, брюки и др. Проект особенно любопытен тем, что Алексей лично курировал этот набор данных, а вы можете обогатить его одеждой из собственного гардероба.
Прочитав эту книгу, вы, конечно, научитесь применять машинное обучение для решения распространенных проблем и будете использовать наиболее простые и эффективные методы достижения наилучших результатов. Первые главы начинаются с описания основных алгоритмов, таких как линейная и логистическая регрессия. Затем читатель постепенно переходит к градиентному бустингу и нейронным сетям. Тем не менее сильной стороной книги является то, что, рассказывая о машинном обучении на практике, она также готовит вас к реальному миру. Вы столкнетесь с несбалансированными классами и распределениями с длинным хвостом, а также узнаете, как обрабатывать грязные данные. Вы оцените собственные модели и развернете их с помощью AWS Lambda и Kubernetes. И это лишь некоторые из новых техник, которые вы встретите на страницах этой книги.
Рассуждая с позиции инженера, можно сказать, что книга составлена таким образом, что вы получите те основные 20 % знаний, которые охватывают 80 % объема, позволяющего стать специалистом по обработке данных. Что еще более важно, вы будете читать и практиковаться под руководством Алексея, знания и умения которого основаны на его работе и опыте в Kaggle. На этой ноте я пожелаю вам доброго пути по страницам и проектам книги. Я уверен, что она поможет вам найти подход к науке о данных и ее проблемам, инструментам и решениям.
Лука Массарон
Я начинал свою карьеру, будучи разработчиком Java. Примерно в 2012–2013 годах я заинтересовался наукой о данных (data science) и машинным обучением. Сначала я смотрел онлайн-курсы, а затем поступил на магистерскую программу и в течение двух лет изучал различные аспекты бизнес-аналитики и науки о данных. В итоге я окончил университет в 2015 году и начал работать специалистом по обработке данных.
Мой коллега познакомил меня с Kaggle — платформой для соревнований в области науки о данных. Я подумал: «Имея все навыки, которые я получил на курсах, и мою степень магистра, я смогу легко победить в любом соревновании». Но когда я начал участвовать в соревнованиях, меня ждал полный провал. Все мои теоретические знания оказались бесполезны на Kaggle. Мои модели были ужасны, так что в итоге я оказался в самом конце рейтинга.
Следующие девять месяцев я провел, участвуя в соревнованиях, связанных с наукой о данных. У меня не очень хорошо получалось, но именно тогда я по-настоящему научился машинному обучению.
Я понял, что для меня лучший способ учиться — это работать над проектами. Сосредоточиваясь на задаче, что-то внедряя, экспериментируя, я действительно учусь. Но если фокусируюсь на курсах и теории, то трачу слишком много времени на изучение вещей, которые оказываются неважными и бесполезными на практике.
И я не одинок. Рассказывая эту историю, я много раз слышал: «И у меня так!» Вот почему основное внимание в книге уделяется обучению в процессе выполнения проектов. Я считаю, что инженеры-программисты — люди с таким же, как у меня, опытом — лучше всего учатся на практике.
Мы начнем с проекта прогнозирования цен на автомобили и изучим линейную регрессию. Затем определим, не хотят ли клиенты прекратить пользоваться услугами нашей компании. Для этого изучим логистическую регрессию. Чтобы изучить деревья принятия решений, мы оценим клиентов банка и определим, в силах ли они погасить кредит. Наконец, мы используем глубокое обучение, чтобы распределить изображение одежды по таким категориям, как футболки, брюки, обувь, верхняя одежда и т.д.
Каждый проект в книге начинается с описания задачи. Затем мы ее решаем, используя различные инструменты и фреймворки. Мы сосредоточиваемся на задаче и охватываем только те аспекты, которые важны для ее решения. Встречается и теория, но я свожу ее к минимуму и фокусируюсь на практической части.
Тем не менее иногда мне приходилось включать формулы в некоторые главы. Невозможно совсем избавиться от формул в книге о машинном обучении. Я знаю, что они пугают некоторых из нас. Меня они тоже пугали. Вот почему я также объясняю все формулы с помощью кода. Увидев формулу, не позволяйте ей испугать вас. Сначала попытайтесь понять код, а затем вернитесь к формуле, чтобы увидеть, как код преобразуется в нее. Тогда она уже не будет такой устрашающей!
В книге вы не найдете всех возможных тем. Я сосредоточился на самых фундаментальных вещах — тех концепциях, которые вы будете использовать со 100 %-ной вероятностью, начав работать с машинным обучением. Есть и другие важные темы, которые я не затронул: анализ временных рядов, кластеризация, обработка естественного языка. Прочитав данную книгу, вы будете иметь базовые знания, которые позволят вам изучить эти темы самостоятельно.
Три главы в книге посвящены развертыванию модели. Это крайне важные главы — может быть, самые важные. Возможность развертывания модели определяет разницу между успешным проектом и неудачным. Даже самая лучшая модель бесполезна, если никто иной не сможет ее использовать. Вот почему стоит потратить время на то, чтобы узнать, как сделать ее доступной для других. И именно по этой причине я рассказываю об этом почти в начале‚ сразу после того, как мы изучим логистическую регрессию.
Последняя глава посвящена развертыванию моделей с помощью Kubernetes. Это непростая глава, но в настоящее время Kubernetes — наиболее часто используемая система управления контейнерами. Вполне вероятно, что вам придется с ней работать, и именно поэтому она включена в книгу. Наконец, каждая глава книги содержит упражнения. Может возникнуть соблазн пропустить их, но я не рекомендую этого делать. Даже просто изучая данную книгу, вы узнаете много нового. Но если вы не примените эти знания на практике, то довольно быстро забудете большую их часть. Упражнения помогут вам применить эти новые навыки на практике‚ и вы гораздо лучше запомните то, что узнали.
Желаю вам получить удовольствие от чтения! Не стесняйтесь связаться со мной в любое время!
Алексей Григорьев
На работу над книгой у меня ушло много времени. Я провел за ней бесчисленное количество вечеров и бессонных ночей. Вот почему прежде всего я хотел бы поблагодарить свою жену за терпение и поддержку.
Далее я хотел бы поблагодарить моего редактора Сьюзан Этридж за ее терпение. Первая ознакомительная версия книги была выпущена в январе 2020 года. Вскоре после этого мир вокруг нас сошел с ума, и все оказались запертыми дома. Работа над книгой стала для меня чрезвычайно сложной задачей. Я не знаю, сколько дедлайнов я пропустил (очень много!), но Сьюзен не давила на меня и позволяла мне работать в моем собственном темпе.
Первым человеком, который должен был прочитать все главы (после Сьюзен), был Майкл Лунд. Я хотел бы поблагодарить его за бесценную обратную связь и за все комментарии, которые он оставил на моих черновиках. Один из рецензентов написал, что «внимание к деталям в книге просто поразительное», и главная причина этого — вклад Майкла.
Найти мотивацию для работы над книгой во время карантина было непросто. Иногда у меня вообще не оставалось никаких сил. Но отзывы рецензентов и читателей MEAP заставляли меня двигаться вперед. Все это помогло мне закончить книгу, несмотря на все трудности. Итак, я хотел бы поблагодарить вас всех за чтение черновиков, за вашу обратную связь и — самое главное — за ваши добрые слова и поддержку!
Хочу отдельно поблагодарить некоторых читателей, поделившихся со мной своими отзывами: Мартина Шенделя, Агнешку Каминску и Алексея Швеца. Кроме того, я хотел бы поблагодарить всех, кто оставил отзыв в разделе комментариев LiveBook или на канале #ml-bookcamp в группе DataTalks. Club Slack.
В главе 7 я использую набор данных с одеждой для проекта классификации изображений. Он создавался и подбирался специально для этой книги. Я хотел бы поблагодарить всех, кто предоставил изображения своей одежды, особенно Кенеса Шангерея и Тагиаса, обеспечивших 60 % всего набора данных.
Последнюю главу я посвятил развертыванию модели с помощью Kubernetes и Kubeflow. Kubeflow — это относительно новая технология, и некоторые аспекты еще недостаточно хорошо документированы. Вот почему я хотел бы поблагодарить своих коллег, Теофилоса Папапанайоту и Антонио Бернардино, за их помощь с Kubeflow.
Большинство читателей не смогли бы получить эту книгу без помощи отдела маркетинга издательства «Мэннинг». Я хотел бы отдельно поблагодарить Лану Класич и Радмилу Эрцеговац за их помощь в организации мероприятий по продвижению книги и за проведение кампаний в социальных сетях для привлечения большего количества читателей. Я также хотел бы поблагодарить моих редакторов Дейрдре Хайам, Адриану Сабо, Памелу Хант и корректора Мелоди Долаб.
Всем рецензентам: Адаму Гладстону, Амарешу Раджасекхарану, Эндрю Кортеру, Бену Макнамаре, Билли О'Каллагану, Чаду Дэвису, Кристоферу Коттмайеру, Кларку Дорману, Дэну Шейху, Джорджу Томасу, Густаво Филипе Рамосу Гомесу, Джозефу Перенье, Кришне Чайтанье Анипинди, Ксении Легостай, Лурду Мата Редди Куниредди, Майку Кадди, Монике Гимарайнш, Наге Паван Кумар Ти, Натану Дельбу, Нур Тавил, Оливеру Кортену, Полу Силистяну, Рами Мадиан, Себастьяну Мохану, Шону Ламу, Вишвеш Рави Шримали, Уильяму Помпеи — ваши предложения помогли улучшить эту книгу.
И последнее, но не менее важное: я хотел бы поблагодарить Луку Массарона за то, что он вдохновил меня на написание книг. Я никогда не стану таким плодовитым автором книг, как ты, Лука, но спасибо тебе за то, что послужил для меня отличной мотивацией!
Эта книга написана для людей, которые умеют программировать и могут быстро освоить основы Python. Вам не понадобится предварительный опыт работы с машинным обучением.
Идеальный читатель — инженер-программист, который хотел бы начать работать с машинным обучением. Однако мотивированному студенту вуза, которому нужно писать код для учебы и сторонних проектов, книга, несомненно, пригодится.
Кроме того, книга будет полезна и людям, которые уже работают с машинным обучением, но хотят узнать больше. Многие из тех, кто уже работает в качестве специалистов по обработке данных и аналитиков данных, сказали, что она оказалась полезной для них, особенно главы о развертывании.
В книге девять глав, и в них мы работаем над четырьмя различными проектами.
• В главе 1 мы лишь приблизимся к теме: обсудим разницу между традиционной разработкой программного обеспечения и машинным обучением. Мы рассмотрим процесс организации проектов машинного обучения, начиная с этапа понимания бизнес-требований и заканчивая заключительным этапом развертывания модели. Мы более подробно изучим этап моделирования в процессе и поговорим о том, как можно оценить наши модели и выбрать из них лучшую. Проиллюстрируем концепции этой главы с помощью задачи обнаружения спама.
• В главе 2 мы начнем наш первый проект: прогноз цены автомобиля. Мы узнаем, как использовать для этого линейную регрессию. Сначала мы подготовим набор данных и выполним легкую очистку данных. Затем проведем предварительный анализ данных, чтобы лучше в них разобраться. После этого собственноручно реализуем модель линейной регрессии с помощью NumPy, что позволит понять модели машинного обучения с точки зрения внутреннего устройства. Наконец, мы обсудим такие темы, как регуляризация и оценка качества модели.
• В главе 3 мы рассмотрим проблему обнаружения оттока. Мы работаем в телекоммуникационной компании и хотим определить, кто из клиентов вскоре захочет прекратить пользоваться нашими услугами. Это проблема классификации, которую мы решаем с помощью логистической регрессии. Мы начнем с анализа важности признаков, чтобы понять, какие факторы являются наиболее значимыми для данной задачи. Затем обсудим прямое кодирование как способ обработки категориальных переменных (таких факторов, как пол, тип контракта и т.д.). Наконец, с помощью Scikit мы научим модель логистической регрессии понимать, какие клиенты скоро от нас уйдут.
• В главе 4 мы возьмем модель, разработанную в главе 3, и оценим ее эффективность. Мы рассмотрим наиболее важные показатели оценки классификации: достоверность, точность и отклик. Обсудим таблицу запутанности, после чего перейдем к подробностям анализа ROC и рассчитаем AUC. А завершим мы эту главу обсуждением K-кратной перекрестной проверки.
• В главе 5 возьмем модель прогнозирования оттока и развернем ее как веб-сервис. Это важный шаг в изучении: если мы не сделаем нашу модель доступной, то она в итоге окажется бесполезной. Мы начнем с Flask, фреймворка Python для создания веб-сервисов. Затем рассмотрим Pipenv и Docker, предназначенные для управления зависимостями, и закончим развертыванием нашего сервиса на AWS.
• В главе 6 мы начнем проект по оценке рисков. Нужно будет понять, возникнут ли у клиента банка проблемы с выплатой кредита. Для этого мы узнаем, как работают деревья принятия решений, и обучим простую модель с помощью Scikit-learn. Затем перейдем к более сложным древовидным моделям, таким как случайный лес и градиентный бустинг.
• В главе 7 мы создадим проект классификации изображений. Обучим модель распределять изображения одежды по десяти категориям, таким как футболки, платья, брюки и т.д. Для обучения нашей модели воспользуемся TensorFlow и Keras и разберем такие темы, как обучение с переносом опыта, что даст нам возможность обучать модель на относительно небольшом наборе данных.
• В главе 8 мы возьмем модель классификации одежды, которую обучали в главе 7, и развернем ее с помощью TensorFlow Lite и AWS Lambda.
• В главе 9 развернем модель классификации одежды, но в первой части используем Kubernetes и TensorFlow, а во второй — Kubeflow Serving.
Чтобы помочь вам начать работу с книгой, а также с Python и связанными с ним библиотеками, я подготовил пять приложений:
• в приложении А объясняется, как настроить среду для книги. Мы покажем, как установить Python с помощью Anaconda, запустить Jupyter Notebook, установить Docker и создать учетную запись AWS;
• приложение Б посвящено основам Python;
• приложение В охватывает основы NumPy и содержит краткое введение в наиболее важные концепции линейной алгебры, которые нужны для машинного обучения: умножение и обращение матриц;
• в приложении Г речь пойдет о Pandas;
• в приложении Д объясняется, как получить Jupyter Notebook с GPU на AWS Sage-Maker.
Эти приложения необязательны, но они могут оказаться полезными, особенно если вы раньше не работали с Python или AWS.
Вам не нужно читать книгу целиком и полностью. Ориентироваться в материале вам поможет следующая карта:
Главы 2 и 3 наиболее важны. Все остальные главы зависят от них. Прочитав их, вы переходите к главе 5, чтобы развернуть модель, главе 6, чтобы узнать о древовидных моделях, или главе 7, чтобы узнать о классификации изображений. Глава 4, посвященная метрикам оценки, зависит от главы 3: мы будем оценивать качество модели прогнозирования оттока, представленной в главе 3. В главах 8 и 9 мы развернем модель классификации изображений, поэтому полезно прочитать главу 7, прежде чем переходить к главам 8 или 9.
Каждая глава содержит упражнения. Выполнять их очень важно — они помогут вам намного лучше запомнить материал.
В этой книге приведено множество примеров исходного кода в виде как пронумерованных, так и обычных листингов. В обоих случаях исходный код оформляется шрифтомфиксированнойширины,подобнымэтому, чтобы отделить его от обычного. Иногда код также выделяется жирным шрифтом для той его части, которая изменилась по сравнению с предыдущими шагами в главе, например когда новая функция добавляется к существующей строке кода.
Во многих случаях исходный код был переформатирован; мы добавили разрывы строк и переработали отступы, чтобы учесть доступное пространство на странице. В редких случаях даже этого оказалось недостаточно, и такие листинги включают маркеры продолжения строки (➥). Кроме того, комментарии в исходном коде часто удалялись, если код описывался в тексте. Важные концепции представлены также в пояснениях к коду листингов.
Код из книги доступен на GitHub по адресу https://github.com/alexeygrigorev/mlbookcamp-code. Этот репозиторий также содержит множество полезных ссылок, которые вам пригодятся в ходе изучения темы машинного обучения.
• Сайт книги https://mlbookcamp.com/ содержит полезные статьи и курсы, основанные на книге.
• Сообщество энтузиастов обработки данных: https://datatalks.club. Там вы можете задать любой вопрос о данных или машинном обучении.
• Существует также канал для обсуждения вопросов, связанных с книгами: #ml-bookcamp.
Ваши замечания, предложения, вопросы отправляйте по адресу [email protected] (издательство «Питер», компьютерная редакция).
Мы будем рады узнать ваше мнение!
На веб-сайте издательства www.piter.com вы найдете подробную информацию о наших книгах.
Алексей Григорьев проживает в Берлине со своей женой и сыном. Он опытный инженер-программист, специализирующийся на машинном обучении. Трудится в OLX Group главным специалистом по обработке данных, помогая своим коллегам внедрять машинное обучение в производство.
В свободное от работы время Алексей ведет DataTalks.Club, сообщество людей, которые любят науку о данных и машинное обучение. Кроме того, он является автором еще двух книг: Mastering Java for Data Science и TensorFlow Deep Learning Projects.
Фигура на обложке — Femme de Brabant, или женщина из Брабанта. Иллюстрация взята из коллекции парадных костюмов из разных стран Жака Грассе де Сен-Совера (1757–1810) под названием Costumes de Différents Pays, опубликованной во Франции в 1797 году. Каждая иллюстрация превосходно прорисована и раскрашена вручную. Богатое разнообразие коллекции Грассе де Сен-Совера живо напоминает нам о том, насколько культурно обособленными были города и регионы мира всего 200 лет назад. Изолированные друг от друга, люди говорили на разных диалектах и языках. На улицах или в сельской местности одежда позволяла легко определить, где проживают люди‚ чем занимаются или каково их положение в обществе.
С тех пор наша манера одеваться изменилась, и региональное разнообразие, столь заметное в то время, практически исчезло. Сейчас трудно различить жителей разных континентов, не говоря уже о разных городах, регионах или странах. Возможно, мы обменяли культурное разнообразие на более разнообразную личную жизнь и уж точно на более разнообразную и быстро развивающуюся технологическую.
Во времена, когда трудно отличить одну компьютерную книгу от другой, издательство Manning подчеркивает изобретательность и находчивость компьютерного бизнеса, создавая обложки книг, основанные на богатом разнообразии региональной жизни двухвековой давности, оживленной благодаря работам Грассе де Сен-Совера.
В этой главе
• Что такое машинное обучение и какие задачи оно может решать.
• Организация успешного проекта машинного обучения.
• Обучение и выбор моделей машинного обучения.
• Проверка модели.
В этой главе мы познакомимся с машинным обучением и опишем случаи, в которых оно наиболее полезно. Мы покажем, чем проекты машинного обучения отличаются от традиционной разработки программного обеспечения (решений, основанных на правилах), и проиллюстрируем различия на примере системы обнаружения спама.
Чтобы решать реальные проблемы с помощью машинного обучения, нам понадобится способ организации проектов машинного обучения. В этой главе мы поговорим о CRISP-DM — пошаговой методологии для реализации эффективных проектов машинного обучения.
Наконец мы более подробно рассмотрим один из этапов CRISP-DM — моделирование. На данном этапе мы обучаем различные модели и выбираем ту, которая лучше всего решает нашу задачу.
Машинное обучение — часть прикладной математики и информатики. Закономерности в данных выявляются в нем с помощью инструментов из математических дисциплин, таких как теория вероятностей, статистика и теория оптимизации.
Основная идея машинного обучения заключается в обучении на примерах: мы готовим набор данных с примерами, а система машинного обучения «учится» на нем. Другими словами, мы даем системе входные данные и желаемый результат, а она пытается выяснить, как выполнять такое преобразование автоматически, не спрашивая человека.
Например, мы можем собрать набор данных с описаниями автомобилей и их ценами. Затем мы предоставляем модель машинного обучения с этим набором данных и «обучаем» ее, демонстрируя ей автомобили и их цены. Этот процесс называется обучением или иногда подгонкой (рис. 1.1).
Рис. 1.1. Алгоритм машинного обучения принимает входные данные (описания автомобилей) и желаемый результат (цены на автомобили). На основе этих данных он создает модель
Когда обучение завершится, мы можем использовать модель, попросив ее спрогнозировать цены на автомобили, которые мы еще не встречали (рис. 1.2).
Рис. 1.2. По завершении обучения у нас имеется модель, которую можно применить к новым входным данным (автомобили без цен), чтобы получить выходные данные (прогноз цен)
Все, что нам нужно для машинного обучения, — это набор данных, в котором с каждым входным элементом (автомобилем) сопоставлен желаемый результат (цена).
Этот процесс сильно отличается от традиционной разработки программного обеспечения. При отсутствии машинного обучения аналитики и разработчики просматривают имеющиеся у них данные и пытаются отыскать закономерности вручную. После этого они придумывают некую логику: набор правил для преобразования входных данных в желаемый результат. Затем они явно кодируют эти правила с помощью языка программирования, такого как Java или Python, а результат называется программным обеспечением.
Таким образом, в отличие от машинного обучения, всю сложную работу выполняет человек (рис. 1.3).
Рис. 1.3. В традиционном программном обеспечении закономерности обнаруживаются вручную, а затем кодируются с помощью языка программирования. Всю работу делает человек
Итоговая разница между традиционной программной системой и системой, основанной на машинном обучении, отражена на рис. 1.4. В машинном обучении мы даем системе входные и выходные данные и в результате получаем модель (код), которая может преобразовывать входные данные в выходные. Сложную работу выполняет машина; нам нужно лишь контролировать процесс обучения, чтобы убедиться, что модель получилась достаточно хорошей (рис. 1.4, б). И напротив, в традиционных системах мы сначала самостоятельно ищем закономерности в данных, а затем пишем код, который преобразует данные в желаемый результат, используя эти обнаруженные вручную закономерности (рис. 1.4, а).
Рис. 1.4. Разница между традиционной программной системой и системой машинного обучения. В традиционной разработке ПО мы выполняем всю работу, в то время как в машинном обучении мы делегируем обнаружение закономерностей машине
Чтобы проиллюстрировать разницу между этими двумя подходами и показать, почему машинное обучение полезно, рассмотрим конкретный случай. Поговорим о системе обнаружения спама.
Предположим, мы запускаем сервис электронной почты, и пользователи начинают жаловаться на нежелательные электронные письма с рекламой. Чтобы решить эту проблему, мы хотим создать систему, которая помечает нежелательные сообщения как спам и переправляет их в соответствующую папку.
Очевидный способ решить проблему — самим просмотреть эти электронные письма, чтобы увидеть, есть ли в них какая-либо закономерность. Например, мы можем проверить отправителя и содержимое.
Если мы обнаружим, что в спам-сообщениях действительно есть закономерность, то запишем обнаруженные закономерности и зададим простые правила для перехвата этих сообщений:
• если отправитель — [email protected], то это спам;
• если заголовок содержит «купить сейчас со скидкой 50 %», а домен отправителя — online.com, то это спам;
• иначе — «полезное электронное письмо».
Мы пишем эти правила на Python и создаем сервис обнаружения спама, который успешно развертываем. Вначале система работает хорошо и отлавливает весь спам, но некоторое время спустя сквозь нее начинают просачиваться новые спам-сообщения. Существующие правила больше не позволяют помечать эти сообщения как спам.
Чтобы решить эту проблему, мы анализируем содержимое новых сообщений и обнаруживаем, что в большинстве из них есть слово «вклад». Итак, мы добавляем новое правило:
• если отправитель — [email protected]‚ то это спам;
• если заголовок содержит «купить сейчас со скидкой 50 %», а домен отправителя — online.com, то это спам;
• если текст содержит слово «вклад», то это спам;
• иначе — «полезное электронное письмо».
Обнаружив это правило, мы внедряем исправление в наш сервис Python и начинаем ловить больше спама на радость нашим пользователям.
Однако какое-то время спустя пользователи снова начинают жаловаться: некоторые люди используют слово «вклад» с благими намерениями, но наша система не распознает этот факт и помечает сообщения как спам. Чтобы решить эту проблему, мы смотрим на полезные сообщения и пытаемся понять, чем они отличаются от спама. Через некоторое время мы обнаруживаем ряд закономерностей и снова изменяем правила:
• если отправитель — [email protected], то это спам;
• если заголовок содержит «купить сейчас со скидкой 50 %», а домен отправителя — online.com, то это спам;
• если тело письма содержит «вклад», то:
• если домен отправителя — test.com, то это спам;
• если длина описания >= 100 слов, то это спам;
• иначе — «полезное электронное письмо».
В этом примере мы просмотрели входные данные вручную и проанализировали их в попытке извлечь из них закономерности. В результате анализа мы получили набор правил, которые преобразуют входные данные (электронные письма) в один из двух возможных вариантов выходных данных: спам или не спам.
Теперь представьте, что мы повторяем этот процесс несколько сотен раз. В результате мы получаем код, который довольно сложно поддерживать и даже понимать. В какой-то момент становится невозможным добавлять в код новые правила, не нарушая существующую логику. Таким образом, в долгосрочной перспективе довольно сложно сопровождать и корректировать существующие правила так, чтобы спам-фильтр по-прежнему хорошо работал‚ сводя к минимуму жалобы на спам.
Это именно та ситуация, в которой может помочь машинное обучение. В ходе данного процесса мы обычно не пытаемся извлекать эти закономерности вручную. Вместо этого мы делегируем задачу статистическим методам, предоставляя системе набор данных с электронными письмами, помеченными как спам или не спам, и описывая каждый объект (электронное письмо) с набором его характеристик (признаков). Основываясь на этой информации, система пытается отыскать закономерности в данных уже без помощи человека. В конце концов, она узнает, как комбинировать признаки таким образом, чтобы спам-сообщения помечались как спам, а нужные сообщения — нет.
Благодаря машинному обучению проблема поддержания созданного вручную набора правил исчезает. Когда появляется новая закономерность — например, новый тип спама, — мы, вместо того чтобы вручную корректировать существующий набор правил, просто предоставляем алгоритму машинного обучения новые данные. В итоге он извлекает новые важные закономерности из новых данных, не повреждая уже существующие — при условии, что они все еще актуальны и присутствуют в новых.
Посмотрим, как мы можем использовать машинное обучение для решения проблемы классификации спама. Для этого нам сначала придется представить каждое электронное письмо с помощью набора признаков. Для начала мы можем выбрать следующие:
• длина заголовка > 10? true/false;
• длина тела письма > 10? true/false;
• отправитель [email protected]? true/false;
• отправитель [email protected]? true/false;
• домен отправителя test.com? true/false;
• описание содержит «вклад»? true/false.
В данном конкретном случае мы описываем все электронные письма с помощью набора из шести признаков. Так совпало, что эти признаки являются производными от рассмотренных ранее правил.
С помощью этого набора мы можем закодировать любое электронное письмо в виде вектора признаков: последовательности чисел, содержащей все значения признаков для конкретного электронного письма.
Теперь представьте, что у нас есть электронное письмо, которое пользователи пометили как спам (рис. 1.5). Мы можем задать это электронное письмо в виде вектора [1, 1, 0, 0, 1, 1], и для каждого из шести признаков мы кодируем значение как 1 для true или 0 для false (рис. 1.6). Поскольку наши пользователи пометили сообщение как спам, целевая переменная равна 1 (true).
Рис. 1.5. Электронное письмо, помеченное пользователем как спам
Рис. 1.6. Шестимерный вектор признаков для спам-сообщения электронной почты. Каждый из шести признаков представлен числом. В этом случае мы используем 1, если признак истинный, и 0, если ложный
Таким образом, мы можем создать векторы признаков для всех электронных писем в нашей базе данных и прикрепить метку к каждому из них. Эти векторы станут входными данными для модели. Затем она берет все эти числа и объединяет признаки таким образом, чтобы прогноз для спам-сообщений был близок к 1 (спам) и равен 0 (не спам) для обычных сообщений (рис. 1.7).
Рис. 1.7. Входные данные для алгоритма машинного обучения состоят из нескольких векторов признаков и целевой переменной для каждого вектора
В результате у нас появляется более гибкий инструмент‚ нежели набор жестко прописанных правил. Если что-то изменится в будущем, то нам не придется пересматривать все правила вручную и пытаться их реорганизовать. Вместо этого мы используем только самые последние данные и заменим старую модель новой.
Этот пример демонстрирует лишь один из способов, с помощью которого машинное обучение может облегчить нашу жизнь.
Другие области применения машинного обучения включают в себя:
• прогнозирование цены автомобиля;
• прогнозирование того, прекратит ли клиент пользоваться услугами компании;
• упорядочивание документов по релевантности по отношению к запросу;
• показ пользователям объявлений, на которые они с большей вероятностью перейдут, вместо нерелевантных;
• классификация вредных и некорректных правок в «Википедии». Подобная система может помочь модераторам «Википедии» расставить приоритеты при проверке предлагаемых правок;
• рекомендации товаров, которые могут купить клиенты;
• классификация изображений по категориям.
Само собой‚ применение машинного обучения не ограничивается этими примерами. Мы можем использовать буквально все, что можно выразить как (входные данные, желаемый результат)‚ для обучения модели машинного обучения.
Машинное обучение полезно и помогает решить множество задач, однако в некоторых случаях в нем нет необходимости.
Для ряда простых задач часто хорошо работают правила и эвристика, поэтому лучше начать с них, а уже затем рассмотреть возможность использования машинного обучения. В нашем примере со спамом мы начали с создания набора правил, но после того, как поддерживать этот набор стало сложно, переключились на машинное обучение. Однако мы использовали некоторые правила в качестве признаков и просто переработали их в модель.
В некоторых случаях просто невозможно применить машинное обучение. Чтобы его использовать, нам нужны данные. Если они отсутствуют, то машинное обучение невозможно.
Проблема классификации электронной почты, которую мы только что рассмотрели, выступает примером контролируемого обучения: мы предоставляем модели признаки и целевую переменную, а она выясняет, как с их помощью достигать цели. Этот тип обучения называется контролируемым, поскольку мы контролируем или обучаем модель, показывая ей примеры, точно так же, как мы учили бы ребенка, показывая ему изображения различных объектов, а затем называя их.
Немного более формально мы можем выразить модель контролируемого машинного обучения математически как
y ≈ g(X),
где:
• g — функция, которую мы хотим изучить с помощью машинного обучения;
• X — матрица признаков, в которой строки являются векторами признаков;
• y — целевая переменная: вектор.
Цель машинного обучения состоит в том, чтобы изучить эту функцию g таким образом, чтобы, когда она получает матрицу X, выходные данные были близки к вектору y. Другими словами, функция g должна быть способна принимать X и производить y. Процесс изучения g обычно называют обучением или подгонкой. Мы «подгоняем» g к набору данных X таким образом, чтобы он получал y (рис. 1.8).
Рис. 1.8. Когда мы обучаем модель, алгоритм принимает матрицу X, в которой векторы признаков являются строками, а желаемый результат — вектором y со всеми значениями, которые мы хотим спрогнозировать. Результатом обучения является g, модель. После обучения g должна производить y при применении к X — или, если коротко, g(X) ≈ y
Существуют различные типы задач контролируемого обучения, и тип зависит от целевой переменной y. Основные типы представлены ниже.
• Регрессия — целевая переменная y является числовой, например цена автомобиля или завтрашняя температура. Мы рассмотрим регрессионные модели в главе 2.
• Классификация — целевая переменная y является категориальной, например спам, не спам или марка автомобиля. Далее мы можем разделить классификацию на две подкатегории: 1) двоичная классификация, которая имеет только два возможных результата, таких как спам или не спам; и 2) многоклассовая классификация, которая имеет более двух возможных исходов, таких как марка автомобиля (Toyota, Ford, Volkswagen и т.д.). Классификация, особенно двоичная, — пример наиболее распространенного применения машинного обучения. Мы рассмотриваем ее в нескольких главах на протяжении всей книги, начиная с главы 3. В текущей же главе мы построим модель, которая позволит спрогнозировать, прекратит ли клиент пользоваться услугами нашей компании.
• Ранжирование — целевая переменная y представляет собой порядок элементов внутри группы, например порядок страниц на странице результатов поиска. Проблема ранжирования часто возникает в таких областях, как поиск и рекомендации, но эта тема выходит за рамки данной книги, и мы не будем рассматривать ее подробно.
Каждую задачу контролируемого обучения можно решить с помощью различных алгоритмов. Нам доступно множество типов моделей. Эти модели определяют, как именно функция g учится прогнозировать y на основе X. Модели включают в себя:
• линейную регрессию для решения задачи регрессии (описывается в главе 2);
• логистическую регрессию для решения задачи классификации (описывается в главе 3);
• древовидные модели для решения задач как регрессии, так и классификации (описываются в главе 6);
• нейронные сети для решения как регрессионных задач, так и задач классификации (описываются в главе 7).
Глубокому обучению и нейронным сетям в последнее время уделяется особое внимание, в основном благодаря прорыву в методах компьютерного зрения. Эти сети решают такие задачи, как классификация изображений, намного лучше, чем это делали более ранние методы. Глубокое обучение — подобласть машинного обучения, в которой функция g представляет собой нейронную сеть со многими слоями. Мы узнаем больше о нейронных сетях и глубоком обучении, начиная с главы 7, где обучаем модель глубокого обучения для классификации изображений.
Создание системы машинного обучения включает в себя больше, чем просто выбор модели, ее обучение и применение к новым данным. Обучение модели — лишь часть‚ небольшой шаг в этом процессе.
Будет много других шагов, таких как определение проблемы, которую может решить машинное обучение, и использование прогнозов модели для воздействия на конечных пользователей. Более того, процесс является итеративным. Обучая модель и применяя ее к новому набору данных, мы часто выявляем случаи, в которых модель работает недостаточно хорошо. Мы используем их для переобучения модели таким образом, чтобы новая версия лучше справлялась с подобными ситуациями.
Определенные методы и фреймворки помогают нам организовать проект машинного обучения так, чтобы он не выходил из-под контроля. Одним из таких фреймворков служит CRISP-DM, который расшифровывается как Cross-Industry Standard Process for Data Mining — межотраслевой стандартный процесс интеллектуального анализа данных. Он был изобретен довольно давно, в 1996 году, но, несмотря на возраст, все еще применим к сегодняшним задачам.
Согласно CRISP-DM (рис. 1.9) процесс машинного обучения состоит из шести этапов:
1. Бизнес-анализ.
2. Анализ данных.
3. Подготовка данных.
4. Моделирование.
5. Оценка.
6. Развертывание.
Рис. 1.9. Процесс CRISP-DM. Проект машинного обучения начинается с понимания проблемы, а затем переходит к подготовке данных, обучению модели и оценке результатов. Наконец модель добирается до этапа развертывания. Процесс является итеративным, и на каждом шаге можно вернуться к предыдущему
Каждый этап охватывает типичные задачи:
• на этапе бизнес-анализа мы пытаемся выразить задачу, понять, как мы можем ее решить, и определить, поможет ли нам в этом машинное обучение;
• на этапе анализа данных мы анализируем доступные наборы данных и решаем, нужно ли нам собирать больше данных;
• на этапе подготовки данных мы преобразуем данные в табличную форму, которую можно использовать в качестве входных данных для модели машинного обучения;
• когда данные подготовлены, мы переходим к этапу моделирования, на котором обучаем модель;
• после определения наилучшей модели наступает этап оценки, на котором мы оцениваем модель, чтобы понять, решает ли она исходную бизнес-задачу, и оцениваем ее успешность на этом поприще;
• наконец на этапе развертывания мы развертываем модель в производственной среде.
Рассмотрим пример обнаружения спама для поставщика услуг электронной почты. Мы видим больше спам-сообщений, чем когда-либо прежде, и наша нынешняя система не может с этим справиться. К данной задаче мы обращаемся на этапе бизнес-анализа: анализируем проблему и существующее решение‚ после чего пытаемся определить, поможет ли внедрение машинного обучения в эту систему остановить спам-сообщения. Мы также определяем цель и способы ее измерения.
Целью может быть, например, «уменьшить количество полученных спам-сообщений» или «уменьшить количество жалоб на спам, которые служба поддержки клиентов получает за день». На данном этапе мы также можем решить, что машинное обучение не поможет, и предложить более простой способ решения задачи.
Следующий шаг — анализ данных. Здесь мы попытаемся определить источники данных, которые можем использовать для решения задачи. Например, если на нашем сайте есть кнопка «Сообщить о спаме», то мы можем получить данные, сгенерированные пользователями, которые отметили свои входящие электронные письма как спам. Затем мы смотрим на данные и пытаемся понять, подходят ли они для решения нашей проблемы.
Однако эти данные могут не в полной мере подходить по целому ряду причин. Одной из них может быть то, что набор слишком мал, чтобы извлечь какие-либо полезные закономерности. Другой причиной может быть то, что данные слишком зашумлены. Пользователи могут неправильно использовать кнопку, поэтому она будет бесполезна для обучения модели машинного обучения, или же процесс сбора данных может быть нарушен, и в итоге будет собрана лишь небольшая часть нужных нам данных.
Если мы придем к выводу, что имеющихся у нас в настоящее время данных недостаточно, то нам потребуется найти способ получить более качественные данные, независимо от того, получаем мы их из внешних источников или совершенствуем способ их сбора внутри компании. К тому же открытия, которые мы совершим на данном этапе, могут повлиять на цель, поставленную на этапе, повлияют на цель, которую мы поставили на этапе бизнес-анализа, поэтому нам, возможно, придется вернуться к этому шагу и скорректировать цель в соответствии с выводами.
Когда у нас есть надежные источники данных, мы переходим к этапу подготовки данных.
Здесь мы очищаем данные, преобразуя их так, чтобы использовать в качестве входных для модели машинного обучения. В примере со спамом мы преобразуем набор данных в набор признаков, которые позже вводим в модель.
После того как данные подготовлены, мы переходим к этапу моделирования.
На этом этапе мы решаем, какую модель машинного обучения использовать и как убедиться, что мы извлекаем из нее максимум пользы. Например, чтобы решить проблему спама, мы можем попробовать логистическую регрессию и глубокую нейронную сеть.
Нам нужно знать, как измерить производительность моделей и выбрать наилучшую из них. Что касается модели спам-фильтра, то мы можем посмотреть, насколько хорошо модель прогнозирует спам-сообщения, и выбрать ту, которая делает это лучше других. Для этой цели важно установить надлежащую структуру проверки, поэтому несколько позже мы рассмотрим данную задачу более подробно.
Весьма вероятно, что на текущем этапе нам придется вернуться и скорректировать способ подготовки данных. Возможно, мы выделили отличный признак, поэтому возвращаемся к этапу подготовки данных, чтобы написать некий код для вычисления этого признака. Когда код готов, мы снова обучаем модель, чтобы проверить, подходит ли признак. Например, мы могли бы добавить признак «длина темы письма», переобучить модель и проверить, улучшает ли это изменение производительность модели.
Выбрав наилучшую из возможных моделей, мы переходим к этапу оценки.
На данном этапе мы проверяем, соответствует ли модель ожиданиям. Ставя цель на этапе бизнес-анализа, мы также продумываем способ определения того, будет ли цель достигнута. Как правило, мы делаем это, просматривая некую важную бизнес-метрику и убеждаясь, что модель перемещает метрику в нужном направлении. В случае обнаружения спама метрикой может служить количество людей, которые нажимают кнопку «Сообщить о спаме», или количество жалоб на решаемую проблему, полученных службой поддержки. В обоих случаях мы надеемся, что использование модели сократит их количество.
В настоящее время этот шаг тесно связан со следующим — развертыванием.
Лучший способ оценить модель — устроить ей боевое крещение: протестировать ее на небольшом количестве пользователей, а затем проверить, изменилась ли наша бизнес-метрика для этих пользователей. Например, если мы хотим, чтобы наша модель уменьшила количество зарегистрированных спам-сообщений, то ожидаем увидеть меньше сообщений от этой группы по сравнению с остальными пользователями.
После развертывания модели мы используем все, что узнали на предыдущих этапах, и возвращаемся к первому шагу, чтобы поразмышлять о достигнутом (или недостигнутом). Может оказаться, что наша первоначальная цель была неправильной и что на самом деле мы хотим добиться не сокращения количества жалоб, а повышения вовлеченности клиентов за счет уменьшения количества спама. Поэтому мы возвращаемся к этапу бизнес-анализа и переопределяем нашу цель. Затем, при повторной оценке модели, мы уже используем другую бизнес-метрику для измерения ее качества.
Как видите, CRISP-DM делает упор на итеративный характер процессов машинного обучения: по окончании последнего шага от нас ожидается возвращение к первому, уточнение исходной задачи и изменение ее на основе полученной информации. Мы никогда не останавливаемся на последнем шаге; вместо этого мы переосмысливаем проблему и стараемся понять, что можно улучшить на следующей итерации.
Распространенное заблуждение состоит в том, что инженеры по машинному обучению и специалисты по обработке данных целыми днями только и делают‚ что обучают модели машинного обучения. В действительности это не так, что можем легко заметить на схеме CRISP-DM (см. рис. 1.9). До и после этапа моделирования выполняется множество шагов, и все они важны для успешного проекта машинного обучения.
Как мы видели ранее, обучение моделей (этап моделирования) — только один шаг во всем процессе. Но он важен, поскольку именно здесь мы на самом деле используем машинное обучение для обучения моделей.
Собрав все необходимые данные и убедившись, что они достаточно хороши, мы ищем способ обработки данных, а затем приступаем к обучению модели машинного обучения.
В нашем примере со спамом это происходит после того, как мы получим все отчеты о спаме, обработаем электронные письма и подготовим матрицу для использования в модели.
На этом этапе может встать вопрос, что использовать — логистическую регрессию или нейронную сеть. Если мы решим использовать нейронную сеть, поскольку где-то услышали, что это лучшая модель, то как нам убедиться, что она действительно лучше любой другой?
Цель данного этапа — создать модель таким образом, чтобы она обеспечивала наилучшие прогностические характеристики. Для этого нам нужен способ надежно измерить производительность каждой возможной модели-кандидата, а затем выбрать наилучшую.
Один из возможных подходов заключается в обучении модели, запуске ее в живой системе и наблюдении за тем, что произойдет. В примере со спамом мы решили использовать нейронную сеть для обнаружения спама, поэтому мы обучаем ее и внедряем в нашу производственную систему. Затем наблюдаем, как модель ведет себя при новых сообщениях, и регистрируем случаи, когда система работает некорректно.
Однако такой подход в нашем случае не идеален: мы не можем проделать это для каждой имеющейся у нас модели-кандидата. Что еще хуже, мы можем ненароком развернуть действительно плохую модель и увидеть, что она плохая, только после того, как она опробована на живых пользователях нашей системы.
ПРИМЕЧАНИЕ
Тестирование модели в живой системе называется онлайн-тестированием и служит важным этапом оценки качества модели на реальных данных. Однако этот подход относится к этапам оценки и развертывания процесса, а не к этапу моделирования.
Лучший способ выбрать наилучшую модель перед развертыванием — эмуляция сценария запуска в эксплуатацию. Мы получаем наш полный набор данных, отбираем из него часть и обучаем модель на остатке. Когда обучение завершено, мы делаем вид, что сохраненный набор данных — это новые данные, и используем его для оценки производительности наших моделей. Эту часть данных часто называют проверочным набором, а процесс удаления части набора данных и использования его для оценки производительности называется проверкой (рис. 1.10).
Рис. 1.10. Чтобы оценить производительность модели, мы отделяем часть данных и используем их только для проверки
В наборе данных о спаме мы можем изъять каждое десятое сообщение. Таким образом, мы сохраняем 10 % данных, которые используем только для проверки моделей, а остальные 90 % применяем для обучения.
Далее на основе обучающих данных мы обучаем как логистическую регрессию, так и нейронную сеть. Когда модели обучены, мы применяем их к проверочному набору данных и выясняем, какая из них более точно прогнозирует спам.
Если после применения моделей к проверочному набору мы видим, что логистическая регрессия справляется с прогнозированием спама только в 90 % случаев, тогда как нейронная сеть — в 93 % случаев, то приходим к выводу, что модель нейронной сети более результативна, чем логистическая регрессия (рис. 1.11).
Рис. 1.11. Процесс проверки. Мы разделяем набор данных на две части, обучаем модели на обучающей части и оцениваем производительность на проверочной. Используя результаты оценки, мы можем выбрать наилучшую модель
Часто у нас в наличии оказываются не две модели, а гораздо больше. Логистическая регрессия, например, имеет параметр C, и в зависимости от заданного значения, результаты могут сильно различаться. Аналогично нейронная сеть имеет множество параметров, и каждый из них может очень сильно повлиять на прогностические характеристики конечной модели. Кроме того, есть и другие модели, каждая со своим набором параметров. Как нам выбрать лучшую модель с наилучшими параметрами?
Для этого мы используем ту же схему оценки. Мы обучаем модели с различными параметрами на обучающих данных, применяем их к проверочным данным, а затем выбираем модель и ее параметры на основе наилучших результатов этапа проверки (рис. 1.12).
Однако у этого подхода есть один нюанс. Если мы раз за разом повторяем процесс оценки модели и используем для этой цели один и тот же проверочный набор данных, то хорошие цифры, которые мы наблюдаем в наборе данных проверки, могут оказаться лишь следствием случайности. Другими словами, «лучшей» модели могло просто повезти с прогнозированием результатов для этого конкретного набора данных.
Рис. 1.12. Использование проверочного набора данных для выбора наилучшей модели с наилучшими параметрами
ПРИМЕЧАНИЕ
В статистике и других областях эта проблема известна как проблема множественных сравнений или проблема множественных тестов. Чем больше раз мы выполняем прогнозы на одном и том же наборе данных, тем больше вероятность того, что мы случайно увидим хорошую производительность.
Чтобы избежать этой проблемы, мы используем ту же идею: снова изымем часть данных. Эту часть назовем тестовым набором данных. Мы будем изредка использовать его для тестирования модели, которую выбрали как лучшую (рис. 1.13).
Рис. 1.13. Разделение данных на обучающую, тестовую и проверочную части
Чтобы применить этот подход к примеру со спамом, сначала мы сохраним 10 % данных в качестве тестового набора, после чего сохраним еще 10 % в качестве проверочного. Мы опробуем несколько моделей на проверочном наборе данных, выберем лучшую и применим ее уже к тестовому набору. Если при этом разница в производительности между проверкой и тестированием невелика, то можно утверждать, что эта модель действительно наилучшая (рис. 1.14).
Рис. 1.14. Использование тестового набора данных для подтверждения того, что производительность наилучшей модели на проверочном наборе является хорошей
ВАЖНО
Настройка процесса проверки — наиболее важный шаг в машинном обучении. Без этого нет надежного способа выяснить, является ли только что обученная модель хорошей, бесполезной или даже вредной.
Процесс выбора наилучшей модели и наилучших параметров для модели называется выбором модели. Мы можем обобщить выбор модели следующим образом (рис. 1.15).
1. Мы разделяем данные на части для обучения, проверки и тестирования.
2. Сначала мы обучаем каждую модель на обучающей части, а затем оцениваем на проверочной.
3. Каждый раз, обучая новую модель, мы записываем результаты оценки, используя проверочную часть.
4. В конце мы определяем, какая модель является лучшей, и тестируем ее на тестовом наборе данных.
Рис. 1.15. Сначала мы разбиваем набор данных, выбираем модель и обучаем ее только на обучающей части данных. Затем‚ на этапе проверки‚ мы оцениваем модель. Мы повторяем этот процесс многократно, пока не обнаружим лучшую модель
Важно использовать процесс выбора модели, прежде всего проверив и протестировав модели в автономном режиме, чтобы убедиться, что обучаемые модели вполне пригодны. Если модель хорошо работает в автономном режиме, то мы можем принять решение о переходе к следующему шагу и развернуть ее, чтобы оценить ее производительность на реальных пользователях.
• В отличие от традиционных систем разработки программного обеспечения на основе правил, в которых правила извлекаются и кодируются вручную, системы машинного обучения можно научить извлекать значимые закономерности из данных автоматически. Это в разы увеличивает уровень гибкости и облегчает адаптацию к изменениям.
• Для успешной реализации проекта машинного обучения требуется структура и набор руководящих принципов. CRISP-DM — платформа для организации проекта машинного обучения, которая разбивает процесс на шесть этапов, от бизнес-анализа до развертывания. Фреймворк ориентирован на итеративный характер машинного обучения и помогает нам с его организацией.
• Моделирование — важный шаг в проекте машинного обучения: та часть, где мы фактически используем машинное обучение для обучения модели. На данном этапе рождаются модели, которые обеспечивают наилучшую прогностическую производительность.
• Выбор модели представляет собой процесс выбора наилучшей модели для решения задачи. Мы разделили все доступные данные на три части: обучающую, проверочную и тестовую. Мы обучаем модели на обучающем наборе и выбираем лучшую с помощью проверочного. Когда лучшая модель выбрана, мы используем этап тестирования, чтобы выполнить окончательную проверку и убедиться, что лучшая модель работает хорошо. Этот процесс помогает создавать полезные модели, которые хорошо работают, не преподнося неприятных сюрпризов.