Практические руководства
Как создать собственный оценщик для 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.