Практические руководства

Как создать собственный оценщик для scikit-learn

Реализация пользовательской модели ансамбля с недостаточной выборкой для несбалансированных данных

В этом посте вы узнаете, как реализовать собственную модель и сделать ее совместимой с API scikit-learn. Конечным результатом будет модель, которую можно не только подогнать и использовать для прогнозов, но и использовать в сочетании с другими инструментами scikit-learn, такими как поиск по сетке и конвейеры.

Вступление

Этот пост появился несколько месяцев назад. На одном из моих курсов по машинному обучению мы обсуждали тему несбалансированных данных и то, как алгоритмы с трудом обучаются, когда данные не сбалансированы. Для наших алгоритмов обучения событие, которое мы пытаемся предсказать, настолько необычно, что в процессе улучшения оценок наша модель редко предсказывает эту категорию. Как только я коснулся этой темы, я понял, что это очень важно. Я раньше видел несбалансированные данные и очень хорошо знал, что в реальной жизни не так просто, как с игрушечными наборами данных. Наибольший резонанс у меня вызвал прогноз оттока клиентов.

Так или иначе, в нашем классе мы увидели много способов избежать или попытаться смягчить проблему несбалансированных данных, но одно решение было особенно интересным для меня: Ensemble Resampling. Мы следили за лекциями Андреаса Мюллера. В этом разделе он упоминает статью Исследовательская недостаточная выборка для изучения классового дисбаланса. В этой статье авторы описывают интересный подход к улучшению классификации несбалансированных наборов данных, они называют его EasyEnsemble. Основная идея состоит в том, чтобы обучить модель ансамбля, используя недостаточную выборку, каждый раз передискретизируя и комбинируя общий результат ансамбля. Преимущество этой модели состоит в том, что она уменьшает количество данных, которые отбрасываются в процессе недостаточной выборки.

Построение модели

Конкретная реализация вашей пользовательской модели будет во многом зависеть от модели, которую вы пытаетесь расширить или построить. Если вы начинаете с нуля, хорошим началом будет BaseEstimator. Мы можем начать с создания класса для нашей модели:

Нам нужно реализовать несколько методов, но, прежде всего, мы можем пойти дальше и создать этот __init__ метод.

На этом этапе мы просто передаем все аргументы и сохраняем их как атрибуты. Есть еще пара вещей, которые нам нужно сделать для реализации реальной модели. Нам нужен способ сгенерировать ансамбль. Для этого мы определим функцию для генерации оценок: _generate_estimators.

Этот метод не принимает никаких аргументов, потому что все необходимые нам данные уже хранятся в атрибутах экземпляра. Начнем с создания списка оценщиков. Это будет наш конечный результат; список оценщиков. Количество оценщиков определяется атрибутом self.n_estimators, поэтому мы просто создаем каждый оценщик внутри цикла for. Чтобы построить каждый оценщик, мы клонируем self.base_estimator, настраиваем его, используя все параметры, и составляем из него конвейер. Вместо использования конвейера scikit-learn нам нужно использовать конвейер несбалансированного обучения (docs), чтобы мы могли выполнять нашу недостаточную выборку.

Теперь мы можем вернуться к функции __init__ и сгенерировать эти оценки:

Отлично, теперь последняя часть головоломки - создать единую оценку, которая принимает решение о результате на основе ансамбля. Мы будем использовать VotingClassifier, который будет брать результаты оценок и делать окончательный вывод с помощью мягкого голосования.

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

Мы реализуем методы fit, predict и classes_, которые просто делегируем ответственность, вызывая VotingClassifier методы.

И последнее, но не менее важное: нам нужно реализовать метод set_params. Как упоминалось в документации, эта функция является довольно фундаментальной, поскольку она используется во время поиска по сетке для обновления параметров моделей. В нашем случае это довольно просто:

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

Осталось только протестировать!

Использование модели

Если вы сохраните только что созданный класс в resampled_ensemble.py файле, импортировать вашу модель так же просто, как:

С этого момента это в основном модель scikit-learn, поэтому мы можем действовать как обычно:

Мы создадим экземпляр модели, подгоним ее и проверим, как она работает:

Мы также можем построить кривую ROC и матрицы путаницы:

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

Заключение

Как видите, создать свои собственные модели для scikit-learn чрезвычайно просто, а также воспользоваться другими инструментами, которые может предложить scikit-learn. Вы можете построить любую модель, которую захотите, и по-прежнему иметь возможность использовать ее с метриками, конвейерами и поиском по сетке. В этом посте я показал вам один пример реализации модели для несбалансированных данных, но возможности поистине безграничны. Например, эту же методологию можно использовать для реализации байесовских моделей вероятностного программирования в scikit-learn. Думаю, нам придется обсудить это в одном из следующих постов ...

Лю, X.Y., Wu, J., & Zhou, Z.H. (2008). Исследовательская недостаточная выборка для обучения классному дисбалансу. Транзакции IEEE по системам, человеку и кибернетике, часть B (кибернетика), 39 (2), 539–550.

Мюллер, А. (2018). Advanced Scikit-learn, репозиторий GitHub, https://github.com/amueller/ml-training-advanced

Мюллер, А.С., & Гвидо, С. (2016). Введение в машинное обучение с помощью Python: руководство для специалистов по данным (1-е изд.). O’Reilly Media.