![](https://habrastorage.org/getpro/habr/upload_files/31f/8e1/430/31f8e1430eb42aa22b0175e1d84e29a5.png)
Привет! Я Василий Сизов, тим-лид команды «Модели управления Жизненным Циклом Клиента», и мы продолжаем нашу серию материалов о библиотеке autobinary.
Ранее мы рассказали вам о кросс-валидации в autobinary, которую можно использовать не только для расчета усредненной оценки модели или расчета усредненных важностей фичей, но и для подбора параметров модели, отбора фичей в модель и т.д.
В этой статье мы расскажем вам о том, как можно использовать библиотеку autobinary для подбора параметров с помощью Optuna, а также о том, как можно интерпретировать вклад фичей с помощью Shap и PDPbox.
Подбор параметров
Методов подбора параметров существует достаточно много. Самые базовые из них – это GridSearchCV, RandomizedSearchCV и HalvingRandomSearchCV.
Базовые методы представляют собой либо полный, либо случайный перебор по заданной заранее сетке параметров. Это хорошие методы подбора, но проблема из коробки в них заключается в том, что их довольно сложно совместить с конвейером обработки данных (pipeline из sklearn) и обучением модели.
Существуют и другие методы подбора параметров, реализованные в библиотеках Optuna, Hyperopt, Skopt.
Мы покажем, как можно подбирать параметры модели с помощью нашей библиотеки и Optuna.
Все довольно просто! Сначала создаем функцию create_model, в которой задаем словарь параметров param, с которым будет работать Optuna. А далее создаем инстанс класса AutoTrees, как и делали до этого в первой части серии гайдов по библиотеке autobinary.
После этого задаем функцию objective, в которой сначала создается модель, а потом вызывается метод model_fit_cv – обучение кросс-валидации. Сама же функция возвращает результат метода get_mean_cv_scores – средняя метрика модели по всем фолдам.
Обращаю внимание, что в данном случае средней метрикой здесь будет gini, так как именно ее мы задали в качестве параметра main_metric. Вы можете задать и другую метрику.
![](https://habrastorage.org/getpro/habr/upload_files/d02/078/c52/d02078c529f0b196f26f3e4eef7a344d.png)
Подготовительная работа сделана. Теперь можно запускать подбор параметров (в данном случае будет 30 итераций):
![](https://habrastorage.org/getpro/habr/upload_files/f8f/aa7/7fd/f8faa77fdaf1f2f529e5d65bc1e99507.png)
Что мы сейчас сделали?
Мы задали какую-то очень сложную функцию с небольшим количеством параметров – это модель машинного обучения, еще и обученная в кросс-валидации. Но мы сделали это довольно просто и элегантно.
В этом и прелесть Optuna! Можно задавать очень сложные функции и подбирать параметры для этих функций, максимизируя или минимизируя какую-либо метрику, а библиотека справится с такой задачей практически из коробки.
Теперь давайте посмотрим на результаты работы optuna.
Лучшие параметры хранятся в атрибуте best_params:
![](https://habrastorage.org/getpro/habr/upload_files/787/1c3/316/7871c3316b036e86fb2bcdcc55a89bb5.png)
Также можно вывести и все итерации подбора для более глубокого анализа и интерпретации:
![](https://habrastorage.org/getpro/habr/upload_files/d07/92e/4d7/d0792e4d79730a90ba0dadc013d5d2cf.png)
Лучшее значение метрики хранится в атрибуте best_value:
![](https://habrastorage.org/getpro/habr/upload_files/4da/5dc/f06/4da5dcf0611bc227fa254bc4e5c729d6.png)
Помимо простой работы с самой библиотекой, Optuna позволяет строить хорошие графики для интерпретации результатов подбора. Например, график целевой метрики от номера итерации:
![](https://habrastorage.org/getpro/habr/upload_files/049/121/acf/049121acfd6a4a63e5b304e8c67a4609.png)
Также можно построить Slice Plot, который показывает график целевой метрики в зависимости от конкретного параметра:
![](https://habrastorage.org/getpro/habr/upload_files/594/fe1/bda/594fe1bdadae2db2f64d5608a934b090.png)
Очень часто бывает полезен и график с линиями уровня. Здесь можно оценить результат, который дают сразу два параметра:
![](https://habrastorage.org/getpro/habr/upload_files/e37/9aa/077/e379aa07720ff2b9b0ecf60a2c2c1f07.png)
Интепретация фичей: shap
К этому моменту фичи отобраны, параметры подобраны. С этими данными можно обучить модель.
Модель обучили, но что делать с интерпретацией фичей?
Конечно, можно еще раз запустить кросс-валидацию и получить список усредненных важностей факторов. Важность фактора говорит только о важности для модели, но не говорит о влиянии на таргет.
Другими словами, для задачи «Титаника» мы хотим получить ответ на вопрос: «При увеличении возраста пассажир более склонен выжить?»
Отвечать на такие вопросы позволяют библиотеки shap и PDPbox.
Начнем с shap.
Для удобства воспользуемся классом-оберткой из autobinary – PlotShap. В данный класс нужно передать обученную модель (в данном случае xgb_model) и выборку, на которой училась эта модель (new_X_train):
![](https://habrastorage.org/getpro/habr/upload_files/46c/3a7/d98/46c3a7d983c70f6f2cdaae5e9cab46c5.png)
После обучения можно вывести графики интерпретации.
Например, вызвать метод create_plot_shap. Про интерпретацию данного графика можно почитать в официальной документации. Именно этот график позволяет ответить на вопрос «Как влияет рост значения фичи на целевую переменную?»:
![](https://habrastorage.org/getpro/habr/upload_files/0bf/720/8d7/0bf7208d766447bb070975048766c0d2.png)
Например, возраст (age). Красные точки – это более высокие значения признака, синие – наоборот, более низкие. По графику нет какой-то четкой определенности относительно возраста. Высокие значения находятся и в правой (выжил) и в левой (не выжил) областях.
А вот пол довольно четко разделен на два множества. Пол был преобразован с помощью catboost_encoder:
![](https://habrastorage.org/getpro/habr/upload_files/bfa/937/782/bfa9377821ad8b163ef3de06d1af6937.png)
Женский пол соответствует большему значению фичи (female – 0.74). Получается, что женщины более склонны к выживанию на титанике.
Также можно вывести важности фичей в виде гистограммы:
![](https://habrastorage.org/getpro/habr/upload_files/76f/cf5/41a/76fcf541a6c48d895a3467773ef4db93.png)
А для дальнейшего использования, например, для отбора фичей, в виде таблицы:
![](https://habrastorage.org/getpro/habr/upload_files/46d/457/697/46d4576972f55a2352d3078e047ef133.png)
Очень часто бывают такие ситуации, что необходимо вывести фичи в виде графика в строго определенном порядке. Например, для презентации. Это тоже можно сделать:
![](https://habrastorage.org/getpro/habr/upload_files/9d9/a92/13b/9d9a9213bb935b782b220568359aaf76.png)
Интепретация фичей: PDPbox
Другая библиотека для интерпретации фичей – PDPbox.
Для использования данной библиотеки также сделана удобная обертка – PlotPDP. В нее передаем обученную модель, выборку, на которой учили модель, а также список фичей для отрисовки.
![](https://habrastorage.org/getpro/habr/upload_files/5c1/39f/d89/5c139fd8979ecf47b95cb06b992ca150.png)
После этого вызываем метод для создания графиков (в качестве примера приведен график для возраста):
![](https://habrastorage.org/getpro/habr/upload_files/35e/226/70f/35e22670f4784323e78271c61cdb6d31.png)
По оси X – значения фичи. По оси Y – склонности к целевой метке. В данной фиче были пропуски, они заполнены значением -999.
На графике видно, что склонны к выживанию дети (возраст до 4 лет) и люди с 27 до 32 (скорее всего их родители).
Итоги
Сегодня мы обсудили некоторые этапы моделирования: подбор параметров модели и интерпретацию фичей обученной модели.
Больше примеров работы с библиотекой autobinary можно найти здесь.
Над библиотекой работали:
Василий Сизов - https://github.com/Vasily-Sizov
Дмитрий Тимохин - https://github.com/dmitrytimokhin
Павел Зеленский - https://github.com/vselenskiy777
Руслан Попов - https://github.com/RuslanPopov98