Привет, Хаброжители! Мы открыли предзаказ на книгу «Машинное обучение на табличных данных: XGBoost, глубокое обучение и ИИ» Марка Райана и Луки Массарона. Предлагаем ознакомиться с главой 3 «Машинное и глубокое обучение».
Чтобы сравнить машинное и глубокое обучение с точки зрения простоты, сопоставим два решения для конкретной задачи классификации табличных данных: прогнозирование того, будет ли объект недвижимости, предлагаемый в аренду на платформе Airbnb в Нью-Йорке (NYC), иметь цену больше или меньше средней цены в объявлениях Airbnb на этом рынке. Мы сравним:
машинное обучение — представлено решением, использующим XGBoost, популярный подход на основе градиента;
глубокое обучение — представлено решением, использующим функциональный API Keras.
Сравним сложность кода этих решений и посмотрим, что это скажет нам о простоте или сложности обоих подходов.
Чтобы решить задачу прогнозирования того, будет ли объект на Airbnb NYC иметь цену, которая больше или меньше средней цены, мы воспользуемся табличным датасетом с объявлениями Airbnb в Нью-Йорке. Рисунок 3.1 включает описания столбцов датасета Airbnb NYC вместе с указанием типа данных для каждого из них, а сам датасет, образец которого вы можете увидеть на рис. 3.2, опубликован в Kaggle: https://mng.bz/avJ7.
Каждая строка в этом датасете содержит информацию об одном объявлении, а каждый столбец содержит значения для всех объявлений по заданной характеристике.
Датасет Airbnb NYC обладает свойствами, которые делают его хорошим кандидатом для сравнения подходов к анализу табличных данных.
У него удобный размер, около 49 000 записей: он достаточно большой, чтобы быть интересным, но не настолько огромный, чтобы для его обработки требовались специальные инструменты Big Data, такие как Spark.
Он имеет достаточное количество столбцов для сравнения машинного и глубокого обучения. Как мы узнаем из следующих глав, для датасетов, содержащих всего три-четыре столбца, предпочтение однозначно отдается классическому ML. Наборы данных с сотнями столбцов исследовать труднее. Airbnb NYC имеет как раз «правильное» количество столбцов — достаточное, чтобы дать возможность глубокому обучению проявить себя, но не настолько огромное, чтобы человек не смог разобраться в данных.
Поскольку датасет имеет приемлемое количество строк и столбцов, его легко и быстро просмотреть в электронной таблице. Это означает, что не нужно писать код Python каждый раз, когда у нас возникает вопрос о данных. С помощью электронной таблицы можно быстро сортировать, фильтровать, вычислять характеристики и использовать скрипты для Excel или Google Sheets, чтобы провести более подробное исследование. Датасет Airbnb NYC поддается анализу в электронной таблице, а это экономит много сил.
Датасет включает в себя ряд интересных типов данных, в том числе несколько столбцов с непрерывными данными: minimum_nights (минимум ночей для бронирования) — целые значения, price (цена) и reviews_per_month (отзывов за месяц) — значения с плавающей точкой, а latitude (географическая широта) и longitude (географическая долгота) — геопространственные значения; столбцы с категориальными данными: neighboring_group (особенности района), neighborhood (инфраструктура поблизости) и room_type (тип помещения); и текстовые столбцы свободной формы: name (описание объекта) и host_name (имя арендодателя).
В датасете есть недостатки, например в некоторых столбцах пропущены значения, но он не настолько запутанный, чтобы требовалась масштабная очистка, перед тем как его можно будет использовать для обучения модели. Можно быстро создать приложение на основе такого датасета, не слишком отвлекаясь на очистку.
Он свободно распространяется и основан на данных из реального бизнеса. Как мы увидим в последующих главах книги, одной из проблем исследования машинного и глубокого обучения с помощью табличных данных является нехватка хороших датасетов в свободном доступе, которые представляют реальные бизнес-проблемы. Датасет Airbnb является редким исключением.
При работе с этим датасетом целевая переменная очевидна: price. Модель должна сделать предсказание, будет ли конкретный объект иметь цену выше или ниже медианной для объектов в представленном наборе.
В этом подразделе мы познакомились с датасетом Airbnb NYC. В следующем рассмотрим код для обучения модели.
Теперь, когда мы представили датасет Airbnb NYC, взглянем на код решения. Мы не будем вдаваться во все его детали, но важно иметь представление о том, как его отдельные части взаимодействуют друг с другом.
На рис. 3.3 показаны файлы в составе обоих решений.
Ниже приведена более подробная информация о файлах решения.
CSV-файл с входными данными (https://mng.bz/avJ7).
Код очистки данных (https://mng.bz/gawV). Обратите внимание, что, хотя XGBoost и Keras используют один и тот же код очистки, XGBoost имеет встроенные возможности, такие как обработка пропущенных значений, что означает, что его код может быть проще.
Файл конфигурации очистки (https://mng.bz/ey7Q).
Файл конфигурации обучения для XGBoost (https://mng.bz/pKOz).
Файл конфигурации обучения для Keras (https://mng.bz/vKpr).
Код для обучения модели XGBoost (https://mng.bz/YDGA). Среди решений на градиентном бустинге мы выбрали XGBoost, потому что он очень популярен, и в сети есть множество руководств по этому алгоритму на случай возможных проблем.
Код для обучения модели Keras (https://mng.bz/JYwP). Мы выбрали Keras для иллюстрации подхода на основе глубокого обучения, потому что, в отличие от альтернатив, таких как PyTorch или fastai поверх PyTorch, Keras, наряду с сырым TensorFlow, наиболее часто используется в бизнес-приложениях. Мы выбрали Keras вместо одной из табличных библиотек глубокого обучения, представленных в разделе «Сравнение градиентного бустинга и глубокого обучения», потому что Keras используется чаще, чем любая из них, и сравнение его API с API XGBoost больше похоже на сравнение яблок с яблоками, чем сравнение библиотеки глубокого обучения, специально разработанной для табличных данных, и общих возможностей XGBoost.
Для большего удобства решения XGBoost и Keras размещены в двух отдельных папках, но большая часть кода в обоих решениях одинакова.
Код решения на основе XGBoost находится по адресу https://mng.bz/GeEO.
Код решения с использованием Keras находится по адресу https://mng.bz/zZ4Q.
Различия между этими двумя репозиториями ограничиваются кодами для обучения и файлами конфигурации обучения.
Прежде чем углубляться в детали датасета Airbnb и используемого кода, давайте рассмотрим решение на основе Keras в контексте его программного стека, который представлен на рис. 3.4.
В главе 8 мы более подробно рассмотрим слои стека, показанные на рис. 3.4. На данный момент отметим, что Keras — это высокоуровневый API глубокого обучения, который используется для решения задачи прогнозирования цен на Airbnb на основе глубокого обучения, которую мы разберем в этой главе. Существуют два низкоуровневых фреймворка глубокого обучения, и решение, рассматриваемое в этой главе, основано на фреймворке TensorFlow, поскольку именно на нем построен Keras.
Целью обоих решений является прогнозирование того, будет ли объявление на Airbnb иметь цену выше или ниже средней цены во входном датасете. Для этого обе модели обучаются на одном и том же наборе признаков. Их подмножество определено в файле конфигурации для обучения модели: https:/mng.bz/OBoE. Ниже приведена часть этого файла, в которой указаны признаки, используемые для обучения моделей:
categorical: # столбцы с категориальными значениями - 'neighbourhood_group' - 'neighbourhood' - 'room_type' continuous: # столбцы с непрерывными значениями - 'minimum_nights' - 'number_of_reviews' - 'reviews_per_month' - 'calculated_host_listings_count'
Файл конфигурации также содержит список признаков, которые явно исключены из процесса обучения:
excluded: # столбцы, не используемые в качестве входящих признаков для обучения модели - 'price' - 'id' - 'latitude' - 'longitude' - 'host_id' - 'last_review' - 'name' - 'host_name' - 'availability_365'
Причины, по которым эти столбцы не используются в качестве признаков для обучения модели, следующие.
price (цена) не включен, поскольку это целевой признак для модели.
Два столбца с id не включены в качестве признаков, поскольку не несут никакой информации о цене в объявлении и представляют собой просто числовые идентификаторы, назначенные объявлениям и арендодателям.
Мы не используем longitude или latitude в качестве признаков, поскольку географическое положение объектов недвижимости уже закодировано в neighborhood_group и neighborhood, которые используются для обучения модели. Если бы у нас их не было, мы могли бы использовать значения latitude и longitude (или полярные координаты, полученные из них: https://mng.bz/0Q66) для кластеризации объявлений в соответствии с их местоположением или преобразования их в полярные координаты. Использование сырых широты и долготы для каждого объявления в качестве признаков может привести к переобучению, поскольку каждый объект недвижимости будет иметь уникальное значение для пары (latitude, longitude).
name и host_name не используются, поскольку являются в некоторой степени произвольными наборами токенов, которые позволяют читателям-людям идентифицировать объявления. Интересным упражнением было бы включение host_name в качестве признака, чтобы посмотреть, предоставляет ли он какой-либо сигнал, связанный с ценой на аренду объектов одного и того же арендодателя.
Мы решили не включать availabiltiy_365 (доступность 365 дней в году) в набор признаков, поскольку этот столбец сложно интерпретировать.
Мы рассмотрели признаки, которые предстоит использовать для обучения модели, чтобы предсказать, будет ли объект недвижимости в объявлении на Airbnb иметь цену выше или ниже средней. В следующем разделе сравним простоту кода для моделей градиентного бустинга и глубокого обучения для этого датасета.
Как мы уже упоминали ранее, два решения задачи Airbnb NYC отличаются только в нескольких местах. На рис. 3.5 показана файловая структура решения и выделены файлы, в которых есть отличия. Если решения различаются только в указанных четырех файлах, как мы можем использовать этот пример для сравнения простоты глубокого обучения XGBoost и Keras? Таблица 3.1 содержит критерии оценки сложности кода.
Оценим код решения задачи Airbnb NYC по каждому из представленных критериев сложности.
Решение XGBoost содержит дополнительный код для подготовки данных. Исходное решение было написано с использованием глубокого обучения на Keras, а затем на его основе было создано решение на XGBoost. Первоначальная модель Keras требовала обучающих входных данных в виде списка массивов numpy. XGBoost требует входных данных в виде массива списков numpy. Листинг 3.1 содержит код для XGBoost, который преобразует исходный формат данных в формат, подходящий для этой модели.
Таблица 3.1. Сравнение сложности кода XGBoost и Keras
|
Критерий сложности кода |
XGBoost |
Модель глубокого обучения на Keras |
|
Данные (подготовка) |
Блок кода, необходимый для преобразования списка массивов numpy в массив списков numpy |
Процесс подготовки данных был специально разработан с учетом глубокого обучения |
|
Определение модели |
Одна команда по стандартам scikit-learn |
Блок кода, необходимый для задания слоев модели, с отдельными слоями для столбцов со значениями каждого типа: непрерывными, категориальными, текстовыми |
|
Обучение модели |
Одна команда по стандартам scikit-learn |
Блок кода, необходимый для управления обратными вызовами (колбэками): позволяет избегать лишних итераций обучения, которые не приводят к улучшению модели, и сохранить вариант, имеющий лучшую производительность. Блок кода для определения обратного вызова, необходимого для эффективного обучения модели Keras |
|
Сохранение модели |
Одна команда по стандартам scikit-learn |
Является частью функции обратного вызова сохранения модели |
|
Загрузка модели |
Блок кода — требует установки последней версии XGBoost, иначе загруженная модель выводит ошибку: AttributeError: 'XGBClassifier' object has no attribute '_le' |
Одна команда |
Обратите внимание, что, хотя этот код для XGBoost немного сложнее кода для Keras, он не является неотъемлемой частью XGBoost, а скорее необходим из-за способа, которым решение на XGBoost было создано из решения на Keras.
Чтобы получить дополнительное объяснение того, что делает код подготовки данных XGBoost, перейдите на сайт Gemini (https://gemini.google.com), вставьте код в поле ввода вместе с промптом «what does this code do?» («что делает этот код?») и отправьте его (рис. 3.6).
Вы получите ответ, в котором объясняется, что делает код:
По сути, код делает следующее: Он извлекает определенные элементы из двух входных списков (X_train_list и X_test_list). Он упорядочивает эти элементы в определенном формате (списки списков). Он преобразует эти списки в массивы NumPy, подготавливая данные для дальнейшей обработки или обучения модели.
Теперь, когда мы рассмотрели разницу между XGBoost и Keras с точки зрения подготовки данных, давайте сравним код определения модели для двух решений.
Ниже приведено определение модели XGBoost для задачи Airbnb NYC — одна строка кода в соответствии со стандартами scikit-learn:
model = XGBClassifier()
Давайте посмотрим, как выглядит код определения модели для решения на Keras. На рис. 3.7 показано начало функции, которая определяет модель глубокого обучения для рассматриваемой задачи.
На рис. 3.8 показана остальная часть функции, определяющей модель глубокого обучения для задачи Airbnb NYC.

На рис. 3.9 показана визуализация модели для задачи Airbnb.
Контраст довольно резкий: модель глубокого обучения можно было бы определить проще. Данное определение модели задает отдельный набор слоев Keras для каждого типа столбцов (непрерывные, категориальные и текстовые). Это не самое лаконичное определение слоев модели для табличных данных, но очень гибкое. Оно сможет работать с табличными датасетами, содержащими различные комбинации непрерывных, категориальных и текстовых столбцов. Кроме того, это определение модели включает код, который задает слои для текстовых столбцов, а мы их не брали для обучения модели, поэтому этот блок кода можно было бы опустить. Тем не менее разница между простотой определения модели XGBoost и сложностью определения модели на Keras подчеркивает преимущество первой: код определения модели проще на XGBoost, чем на Keras.
Мы сравнили код подготовки данных и код определения модели. Теперь давайте сравним код обучения моделей на XGBoost и на Keras. В решении XGBoost обучение выполняется с помощью одной строки кода со значениями по умолчанию, принятыми для всех параметров:
model.fit(xgb_X_train, dtrain.target)
В листинге 3.2 показано, что в Keras есть две различные версии оператора fit, а также необходимо задать несколько дополнительных параметров, включая размер батча и количество эпох, которое будет запущено в процессе обучения по умолчанию.
Между XGBoost и Keras нет большой разницы в сложности обучающего кода. Однако, чтобы сделать процесс обучения на Keras эффективным, нам нужно использовать обратные вызовы: это позволит не проходить бесполезные циклы обучения, получив в итоге неоптимальную модель. Подробнее об использовании обратных вызовов на Keras для оптимизации процесса обучения см. в главе 6 книги «Deep Learning with Structured Data» (https://mng.bz/KGx0).
Прежде чем рассмотреть функции обратного вызова для решения на Keras, давайте посмотрим, что Gemini может нам рассказать о методах fit. Снова отправим этот код в Gemini, предварив его промптом «what does this code do?» («что делает этот код?»). Если ответ вас не удовлетворил, нажмите Regenerate draft («Перегенерировать ответ»). Со второй попытки мы получили от Gemini подробное описание кода, которое включало следующее описание параметров для метода fit:
В обоих случаях модель обучается с помощью метода model.fit(), который является распространенным способом обучения моделей в библиотеках машинного обучения, таких как TensorFlow или Keras. Ключевые аргументы, передаваемые в model.fit(): X_train_list: признаки обучающих данных. dtrain.target: целевые переменные (метки) обучающих данных. epochs: количество эпох (итераций обучения). batch_size: размер батча (количество образцов данных на шаг обучения). validation_ данные для валидации для мониторинга производительности (необязательно). verbose: уровень детализации вывода в процессе обучения (1 для отображения прогресс-бара). callbacks: список функций обратных вызовов, выполняемых во время обучения (только в случае ранней остановки)
Gemini также приводит следующее заключение:
Код обучает модель требуемым образом с ранней остановкой и без нее, предотвращающей переобучение и улучшающей способность модели к обобщению. Конкретная реализация ранней остановки зависит от содержимого callback_list. Чтобы полностью понять его назначение, необходимо больше информации о модели, процессе обучения и критериях ранней остановки.
Обратите внимание, как в последней строке Gemini уточняет ограничения своего анализа, справедливо отмечая, что, имея только обучающий фрагмент, он не может сделать вывод обо всех деталях полного решения.
В листинге 3.3 показан код, определяющий обратные вызовы, которые используются на этапе обучения модели на Keras. Этот код добавляет дополнительную сложность в версию на Keras для Airbnb NYC.

После того как мы обучили модель, следует сохранить ее в файл, чтобы иметь возможность загрузить ее и использовать в другом сеансе или в процессе развертывания модели. В нашем простом примере мы сохраняем и перезагружаем модель в том же блокноте, который используем для обучения модели. Метод сохранения модели для XGBoost:
model.save_model(xgb_save_model_path)
Для Keras нам не нужен явный метод сохранения модели, поскольку она сохраняется автоматически с помощью обратного вызова для сохранения.
В листинге 3.4 показан код для загрузки модели в XGBoost.
Метод загрузки модели для Keras:
saved_model = load_model(save_model_path)
Еще одно отличие между XGBoost и Keras заключается в том, что, когда вы попытаетесь загрузить сохраненную модель классификатора XGBoost (например, ту, которую мы обучили для задачи Airbnb NYC) и запустить процесс прогнозирования, возникнет ошибка, если используется не самая последняя версия XGBoost. Чтобы избежать этого, код обучения модели XGBoost включает следующую инструкцию, гарантирующую использование последней версии XGBoost:
!pip install --upgrade XGBoost
В этом разделе мы сравнили простоту кода XGBoost и Keras для подготовки данных, а также определения, обучения и сохранения модели. Далее обсудим выводы, которые можно сделать из этого сравнения.
Один из лучших советов для проектов data science — использовать максимально простой подход. Примените бритву Оккама. Если существует более одного способа решить задачу, выберите самый простой. Если линейная регрессия решит проблему, то зачем использовать метод опорных векторов (SVM)? Если традиционный подход к программированию решит проблему, то зачем вообще использовать машинное обучение? Если вы выберете максимально простой подход, то, скорее всего, быстрее получите начальные результаты, быстрее завершите разработку всего решения и вам будет легче сопровождать систему после ее развертывания.
Чтобы ответить на вопрос о том, что проще: классическое машинное или глубокое обучение, мы сопоставили решения, использующие каждый подход, к конкретной задаче — прогнозирование цен для Airbnb NYC. Отвечая на этот вопрос, в задачах анализа табличных данных мы советуем руководствоваться принципом «не усложняй».
Прежде чем завершить сравнение простоты кода для градиентного бустинга и глубокого обучения, необходимо отметить, что Keras — не единственный подход к глубокому обучению. Существуют и другие, работающие с табличными данными, и некоторые из них предлагают более простой код для определения и обучения моделей, чем Keras. Например, с помощью фреймворка fastai (https://docs.fast.ai/), который более подробно будет рассмотрен в главе 9, вы можете определить модель для работы с табличными данными, обучить ее и использовать для получения прогнозов, написав менее 10 строк кода. Готовые оценщики Tensorflow (tensorflow canned estimators) (https://mng.bz/9Y51) — еще один простой способ глубокого обучения на табличных данных. С их помощью вы можете обучить модель на табличном датасете и получать прогнозы с помощью API, столь же простого, как API XGBoost. Это всего лишь два примера. Преимущество Keras заключается в его высокой гибкости, и именно это одна из причин, по которой компании в продакшене часто используют его, в то время как более простые инструменты, такие как fastai, встречаются редко.
Теперь, когда мы сравнили машинное и глубокое обучение с точки зрения простоты кода, в следующем разделе сравним два подхода с точки зрения прозрачности.
Оформить предзаказ на книгу «Машинное обучение на табличных данных: XGBoost, глубокое обучение и ИИ» со скидкой 35% можно на нашем сайте по промокоду - Предзаказ
Источник


![[Перевод] Как Альтман превратил Пентагон в венчурный фонд OpenAI — и почему платить будем мы](https://mexc-rainbown-activityimages.s3.ap-northeast-1.amazonaws.com/banner/F2025080614393546573MGEAZfu7B2PS.png)