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

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

Имея в виду потенциальное улучшение точности, я выбрал реальный учебный набор о выживших на Титанике, затонувшем в начале 20-го века. Наборы данных для этого примера можно найти на странице соревнований Kaggle: — https://www.kaggle.com/c/titanic/data

Выдержки из Постановки задачи конкурса Kaggle гласят следующее:

«15 апреля 1912 года во время своего первого рейса «Титаник», считавшийся «непотопляемым», затонул после столкновения с айсбергом. К сожалению, спасательных шлюпок на всех на борту не хватило, в результате чего из 2224 пассажиров и членов экипажа погибли 1502 человека.

Хотя в выживании был некоторый элемент удачи, кажется, что у некоторых групп людей было больше шансов выжить, чем у других.

В этом задании мы просим вас построить прогностическую модель, отвечающую на вопрос: «У каких людей больше шансов выжить?» используя данные о пассажирах (например, имя, возраст, пол, социально-экономический класс и т. д.)».

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

Первое, что я сделал, это импортировал библиотеки, необходимые для решения этой вычислительной задачи. Pandas и numpy являются опорой Python, поэтому они были первыми двумя импортированными библиотеками.

Поскольку эта программа была написана на Kaggle, также необходимо было импортировать операционную систему, используемую Kaggle, и распечатать файлы данных в ее каталоге:

Затем я прочитал файлы данных поезда и тестов, которые будут использоваться для этого расчета:

Я проверил наличие нулевых значений и обнаружил, что они присутствуют в следующих столбцах: «Возраст», «Кабина», «Посадка» и «Тариф». Все эти столбцы нужно будет ввести, прежде чем я смогу обучиться, а затем вписать наборы данных в модель:

Я решил создать переменные «ID_train» и «ID_test», которые хранили данные в «PassengerId». Я решил удалить столбцы «PassengerId», «Cabin» и «Ticket» из наборов поездов и тестов, потому что они больше не нужны:

Я использовал KNNImputer() для вменения отсутствующих значений в столбцах с числовыми данными, таких как «Возраст» и «Тариф»:

Затем я заменил отсутствующие значения столбца, в котором были объекты, «Embarked» наиболее часто используемым значением, указанным как mode():-

После того, как значения были введены, я закодировал столбцы, содержащие данные объекта, с помощью OrdinalEncoder():

В рамках предварительной обработки данных я создал новый столбец под названием «Заголовок» и извлек заголовок из имени. Я добился этого, создав определяемую пользователем функцию лямба и разделив строку на «,» и «.» чтобы извлечь заголовок: -

Затем я закодировал заголовки, используя сопоставление, чтобы присвоить каждому заголовку номер, который хочет видеть компьютер, когда он сопоставляет данные с различными функциями в алгоритме:

Затем я создал корзины, чтобы присвоить диапазон номеров категориям: «ребенок», «молодой взрослый», «средний возраст» и «пенсионер». Этот диапазон был помещен в другой столбец, который я создал, «Age_Range»:

Затем я сопоставил возрастной диапазон, присвоив числовые значения каждой категории:

Я создал новую колонку. «Семейный», объединив «СибСп» и «Парч»:-

Я создал новый столбец «Fare_Range» и поместил тарифы в категории:

Затем я присвоил номер каждой категории в «Fare_Range» и сопоставил его, чтобы сделать столбец числовым:

После предварительной обработки данных я установил значения X, y и X_test. Я создал переменную, функции и поместил в нее все столбцы, которые собирался использовать в качестве переменных X и X_test. Затем я использовал столбец «Выжил» в наборе данных поезда и использовал его как переменную y.

После того, как переменные X, y и X_test были установлены, я использовал train_test_split(), чтобы разделить набор данных поезда для обучения и проверки. Поскольку это проблема классификации, я установил stratify=y:-

Затем я использовал StandardScaler() для масштабирования данных в наборах для обучения, проверки и тестирования в том же масштабе, что и целевая переменная:

Поскольку набор данных Titanic имеет умеренный дисбаланс классов, я создал переменную class_werights, которая будет использоваться для балансировки классов в процессе моделирования:

Теперь данные готовы к обучению, поэтому я использовал функцию Stacking() для создания ансамбля моделей, которые нужно сложить. Обобщение с накоплением — это метод объединения оценок для уменьшения их погрешностей. Точнее, прогнозы каждого отдельного оценщика складываются вместе и используются в качестве входных данных для окончательного оценщика для вычисления прогноза. В этом случае окончательный оценщик LogisticRegression().

Когда я обучил и подогнал эту модель, я добился точности 85,02%:

После того, как тренировочный набор был обучен и подобран, я сделал прогноз на проверочном наборе и получил точность 77,78%:

Затем я сделал прогноз на тестовом наборе данных и поместил прогнозы в фрейм данных в соответствии со спецификациями соревнований Kaggle:

Когда я отправил прогнозы на Kaggle, я получил публичную оценку 77,511%, что является лишь незначительным улучшением по сравнению с моей предыдущей оценкой. Очевидно, что для повышения точности этого набора данных необходимо выполнить большую интенсивную работу:

Код для этого набора данных можно найти в моем блокноте Jupyter на странице соревнований Kaggle Titanic: https://www.kaggle.com/tracyporter/titanic-stacking?scriptVersionId=47458851.