Важность функций и древовидные модели

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

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

В порядковом кодировании категориальный признак остается в одном столбце, но значения представлены в числовом виде:

Для фреймов данных, содержащих 20 категориальных признаков, скажем, по 10 уникальных значений в каждом, будет 200 признаков. Большие и разнообразные наборы данных могут легко привести к расширению функций до 1000, что делает извлечение важности функций трудоемким и не очень простым, особенно для новичков в науке о данных.

Порядковый кодировщик

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

Внимание! Ordinal Encoder подходит только для древовидных моделей, таких как деревья решений или случайные леса. Другие типы моделей могут предполагать, что между назначенными значениями признаков существует числовая связь, которой не существует.

Кодировщики категорий

Я предлагаю использовать OrdinalEncoder из Category Encoders, пакет кодировщиков, совместимых с пайплайнами sklearn, но с еще несколькими полезными параметрами в транке.

Вот ссылка на документацию кодировщика категорий:

https://contrib.scikit-learn.org/category_encoders/index.html

Чтобы установить кодировщик категорий pip, попробуйте следующее (вы также можете использовать conda):

OrdinalEncoder в учебном пособии по конвейеру

Вот краткое руководство по использованию OrdinalEncoder в конвейере с визуальным извлечением важности функций.

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

Давайте импортируем наши пакеты. Внимательно посмотрите на импорт кодировщиков категорий. Здесь мы импортируем OrdinalEncoder. Убедитесь, что вы установили кодировщики категорий через установку pip в своем терминале. Его также можно установить через Conda.

Загрузите предикторы и целевые данные и посмотрите. Обычно после этого мы хотим провести исследовательский анализ данных, но мы пропустим этот шаг, чтобы сразу перейти к моделированию.

Обратите внимание на категориальные признаки. Числовые функции были удалены, чтобы сосредоточиться только на использовании OrdinalEncoder в конвейере.

Осмотрите цель. Я выбрал диапазон, чтобы показать три класса, с которыми мы работаем.

Разделите данные на обучающие и тестовые наборы.

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

Создайте воронку и отметьте важность функций

Все, мы прибыли, пора строить трубопровод. Эта модель использует модель классификатора дерева решений. Обратите внимание, что в нашем OrdinalEncoder из кодировщиков категорий мы возвращаем кадр данных, это один из доступных нам удобных параметров, которых нет в стандартном кодировщике sklearn.

Шаг 1

Шаг 2

Соберите конвейер, включите «подробный» для получения информации о продолжительности вычислений.

Шаг 3

Обучите модель.

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

Шаг 4

Сгенерируйте оценку на обучающих данных и тестовых данных. Скорее всего, будет какая-то передозировка.

Шаг 5

Изучите важность функций.

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

Чтобы извлечь важность, используйте атрибут конвейера «named_steps». Это позволяет нам выбрать DecisionTreeClassifier, который мы использовали. Модели на основе дерева содержат атрибут «feature_importances_». Мы получим массив относительной важности каждой функции.

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

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

Если мы хотим придерживаться OneHotEncoder, нам нужно будет использовать некоторые обходные пути, чтобы извлечь важность этих функций на основе наших исходных функций. Вам может быть полезно запустить свою модель с помощью OneHotEncoder и OrdinalEncoder и внимательно изучить оценки для сравнения. Для этой модели различия в оценках были минимальными.

Шаг 6

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

Сводка

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

OrdinalEncoder — полезная опция кодирования для категориальных переменных для древовидных моделей. Это позволяет нам легче извлекать и отображать важность функций на основе наших исходных функций.