Наука о данных за 5 минут: что такое One Hot Encoding?

Наука о данных за 5 минут Программирование и разработка

Наука о данных за 5 минут

Если вы работаете в области науки о данных, вы, вероятно, слышали термин «одно горячее кодирование». Даже документация Sklearn говорит вам «кодировать категориальные целочисленные функции, используя горячую схему». Но что такое горячее кодирование и почему мы его используем?

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

В этом руководстве мы познакомим вас с одной горячей кодировкой и покажем, когда её использовать в ваших моделях машинного обучения. Мы предоставим несколько реальных примеров со Sklearn и Pandas.

Что такое горячее кодирование?

Категориальные данные относятся к переменным, которые состоят из значений меток, например, переменная «цвет» может иметь значения «красный», «синий» и «зелёный». Думайте о ценностях как о разных категориях, которые иногда имеют естественный порядок.

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

Одно горячее кодирование — это один из методов преобразования данных для подготовки их к алгоритму и получения лучшего прогноза. С помощью one-hot мы конвертируем каждое категориальное значение в новый категориальный столбец и присваиваем этим столбцам двоичное значение 1 или 0. Каждое целочисленное значение представлено как двоичный вектор. Все значения равны нулю, а индекс отмечен цифрой 1.

Читайте также:  Использование функции strsep в C

Взгляните на эту диаграмму, чтобы лучше понять:

Взгляните на эту диаграмму, чтобы лучше понять

Применим это к примеру. Скажем, у нас есть значения красный и синий. При использовании one-hot мы бы присвоили красному цвету числовое значение 0 и синему — числовому значению 1.

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

После присвоения числовых значений мы создаём двоичный вектор, представляющий наши числовые значения. В этом случае длина нашего вектора будет равна 2, поскольку у нас есть 2 значения. Таким образом, redзначение может быть представлено двоичным вектором [1,0], а blueзначение будет представлено как [0,1].

Зачем использовать одно горячее кодирование?

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

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

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

Как преобразовать категориальные данные в числовые данные

Преобразование наших данных в числовые значения вручную включает два основных шага:

  • Целочисленное кодирование.
  • Одно горячее кодирование.

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

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

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

red,    yellow,  blue
1,      0,      0
0,      1,      0
0,      0,      1

Примечание. Во многих других полях двоичные переменные называются фиктивными переменными.

Одно горячее кодирование с помощью Pandas

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

df_new = pd.get_dummies(df, columns=["col1"], prefix="Planet")
import pandas as pd
df = pd.DataFrame({«col1»: [«Sun», «Sun», «Moon», «Earth», «Moon», «Venus»]})
print(«The original data»)
print(df)
print(«*» * 30)
df_new = pd.get_dummies(df, columns=[«col1″], prefix=»Planet»)
print(«The transform data using get_dummies»)
print(df_new)
  • Строка 7 показывает, что мы используем get_dummiesбыстрое кодирование pandas DataFrameобъекта. Параметр prefixуказывает префикс имени нового столбца.
  • Строка 9 показывает нам наш результат.

Применим это к практическому примеру. Скажем, у нас есть следующий набор данных.

import pandas as pd
 
ids = [11, 22, 33, 44, 55, 66, 77]
countries = ['Seattle', 'London', 'Lahore', 'Berlin', 'Abuja']
 
df = pd.DataFrame(list(zip(ids, countries)),
                  columns=['Ids', 'Cities'])

Здесь у нас есть фрейм данных Pandas dfс двумя списками: idsи Cities. Давайте вызовем, head()чтобы получить этот результат:

Идентификаторы Города
0 11 Сиэтл
1 22 Лондон
2 33 Лахор
3 44 год Берлин
4 55 Абуджа

Здесь мы видим, что Citiesстолбец содержит наши категориальные значения: названия наших городов. Мы должны преобразовать их в нашем новом столбце, Cities используя get_dummies()функцию, которую мы обсуждали выше.

= pd.get_dummies(df.Countries, prefix='City')
print(y.head())

Здесь мы передаём значение Cityдля prefixатрибута метода get_dummies(). Если мы запустим код сейчас, мы напечатаем наши закодированные значения:

import pandas as pd
df = pd.DataFrame({«col1»: [«Seattle», «London», «Lahore», «Berlin», «Abuja»]})
print(«The original data»)
print(df)
print(«*» * 30)
df_new = pd.get_dummies(df, columns=[«col1″], prefix=»Cities»)
print(«The transform data using get_dummies»)
print(df_new)

Одно горячее кодирование с помощью Sklearn

Мы можем реализовать аналогичную функциональность с помощью Sklearn, который предоставляет объект / функцию для быстрого кодирования в preprocessingмодуле.

import sklearn.preprocessing as preprocessing
import numpy as np
import pandas as pd
targets = np.array([«red», «green», «blue», «yellow», «pink»,
                    «white»])
labelEnc = preprocessing.LabelEncoder()
new_target = labelEnc.fit_transform(targets)
onehotEnc = preprocessing.OneHotEncoder()
onehotEnc.fit(new_target.reshape(-1, 1))
targets_trans = onehotEnc.transform(new_target.reshape(-1, 1))
print(«The original data»)
print(targets)
print(«The transform data using OneHotEncoder»)
print(targets_trans.toarray())
  • Мы используем LabelEncoderдля преобразования строки в int в строке 7 и строке 8.
  • Строка 9 создаёт наш OneHotEncoderобъект.
  • Строка 10 соответствует оригинальной функции с использованием fit().
  • Строка 11 преобразует исходную функцию в новую с помощью однократного кодирования.
  • Вы можете увидеть новые данные из вывода строки 15.

Примечание. В более новой версии sklearnвам не нужно преобразовывать строку в int, поскольку OneHotEncoderэто происходит автоматически.

Давайте посмотрим на OneHotEncoderкласс в действии на другом примере. Во-первых, вот как импортировать класс.

from sklearn.preprocessing import OneHotEncoder 

Как и раньше, мы сначала заполняем наш список уникальных значений для кодировщика.

x = [[11, «Seattle»], [22, «London»], [33, «Lahore»], [44, «Berlin»], [55, «Abuja»]]
y = OneHotEncoder().fit_transform(x).toarray()
print(y)

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

[[1. 0. 0. 0. 0. 0. 0. 1.]
 [0. 1. 0. 0. 0. 1. 0. 0.]
 [0. 0. 1. 0. 0. 0. 0. 1.]
 [0. 0. 0. 1. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1. 1. 0. 0.]]

Следующие шаги для вашего обучения

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

  • One hot with Numpy.
  • Count encoding.
  • Mean encoding.
  • Label encoding.
  • Weight of evidence encoding.ncoding.
Оцените статью
bestprogrammer.ru
Добавить комментарий