Осмысление категориальных данных с помощью кодирования

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

Предположим, у нас есть набор данных, содержащий характеристики домов и цены продажи за определенный период. Некоторые функции этого набора данных будут хорошо работать с моделями машинного обучения с самого начала. Квадратные метры, размер участка, размер подвала и т. д. — это непрерывные числовые значения, которые модель подберет довольно быстро. Но как насчет таких вещей, как качество строительных материалов, состояние строения или находится ли дом на берегу моря? Чтобы использовать эти функции в наших моделях (а мы очень хотим их использовать!), нам нужно преобразовать наши данные, чтобы они были удобочитаемы для модели.

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

Набор данных

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

С этим покончено, давайте перейдем к первому подходу в нашей повестке дня — кодированию меток.

Метка/порядковое кодирование

Метка и порядковое кодирование — это процессы, с помощью которых мы пытаемся преобразовать категориальные данные в число, которое может понять модель ML. Страна происхождения является распространенным примером, используемым для кодирования этикетки. Если бы у меня был список автомобилей, произведенных в Англии, Германии, Японии и Соединенных Штатах, я мог бы решить присвоить значение от 1 до 4 для каждой страны в зависимости от того, где был произведен автомобиль. Это позволит мне передать мои данные в регрессионную модель и интерпретировать результаты на основе ключа моей страны.

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

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

Соображения и подводные камни:

Как оказалось, порядковое кодирование не слишком хорошо подходит для наших почтовых индексов. Поскольку кодирование меток связывает числовую метку с порядком появления точки данных в наборе данных, модель, скорее всего, будет учитывать этот порядок при выводе своего прогноза. В нашем наборе данных нет ничего лучше или хуже в почтовом индексе 98002 по сравнению с 98001. Конечно, существуют основные различия в тех местах, которые могут повлиять на цену продажи (школьные округа, схемы движения, близость объектов инфраструктуры и т. д.), но почтовый индекс сам по себе просто ярлык, присвоенный почтовым отделением. Мы бы не хотели, чтобы наша модель узнала, что для каждого объекта недвижимости почтовый индекс 98001 ‹ 98002 ‹ 98003… и соответственно прогнозировала цены на жилье. Если бы это было правдой, каждая недвижимость в 98199 продавалась бы дороже всех и была бы самой желанной, что, конечно же, не так.

Кроме того, поскольку кодирование меток использует порядковый подход к кодированию данных, подразумевается, что разница между категориями 1, 2, 3… одинакова. Возвращаясь к примеру с почтовым индексом, очевидно, что разница между всеми 70 кодами в нашем наборе данных не одинакова. Мы бы не хотели, чтобы наша модель узнала, что существует разница ровно в 1 единицу между последовательными почтовыми индексами или что существует разница ровно в 50 единиц между 98001 и 98051. Существует множество причин, по которым один почтовый индекс может отличаться в значение от другого, и мы не хотим, чтобы наша модель чрезмерно упрощалась.

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

Горячее кодирование

Несмотря на пикантное название, горячее кодирование на самом деле довольно простое. Идея состоит в том, что любой категориальный признак в наборе данных будет иметь категорию, которая полностью или полностью не применима к каждой записи. Кроме того, внутри категориального признака к каждой записи может применяться только одно из возможных значений. Запись 1 может быть только категории A или категории B, но не обеих одновременно. Давайте воспользуемся нашими данными округа Кинг, чтобы упростить анализ.

Один и тот же дом в наборе данных округа Кинг не может иметь одновременно два почтовых индекса: 98001 и98002. Это может быть близко к границе почтового индекса, но почтовое отделение в конечном итоге присвоит этому месту один почтовый индекс. Эта запись либо является «горячей» для почтового индекса 98001, либо нет. Если он расположен в 98001, он не может быть ни в одном из других почтовых индексов. Горячее кодирование создает новый столбец для каждого возможного значения категориального признака и присваивает 1 или 0 каждой записи.

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

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

Соображения и подводные камни:

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

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

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

Чтобы избежать этой ловушки, мы можем сказать OneHotEncoder, чтобы он удалял ссылочную категорию при создании экземпляра объекта. Выбор категории для исключения заслуживает отдельной статьи, но проще говоря: наша исключенная эталонная категория становится точкой сравнения для всех других переменных-предикторов в этой категории. Возвращаясь к почтовым индексам, если мы решим отказаться от 98001 в качестве нашей эталонной категории, наши коэффициенты регрессии для других почтовых индексов теперь показывают нам важность перехода от 98001 к каждому из других почтовых индексов.

Заворачивать:

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

Ссылки:

Набор данных округа Кинг

Документация SKLearn:

Дальнейшее чтение: