Table of Contents
· Types of DataContinuous DataDiscrete DataNominal DataOrdinal Data
· How to Encode Categorical data?Ordinal EncodingNominal EncodingOneHotEncoding using PandasDummy Variable TrapOneHotEncoding using Sklearn

Типы данных

В статистике и машинном обучении мы классифицируем данные по одному из двух типов, а именно — Числовые и Категорические.

Числовые данные делятся на дискретные и непрерывные данные. Категорические данные делятся на два типа: номинальные данные и порядковые данные.

Непрерывные данные

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

Пример: вес и рост человека, температура, возраст, расстояние.



Дискретные данные

Дискретные данные могут принимать только дискретные значения (они не могут иметь десятичных значений). Дискретная информация содержит только конечное число возможных значений. Эти ценности не могут быть разделены осмысленно. Здесь вещи можно считать целыми числами.

Пример: количество человек в семье, количество банковских счетов, которые может иметь человек, количество учеников в классе, количество голов, забитых в футбольном матче.



Номинальные данные

Номинальные данные определяются как данные, которые используются для именования или маркировки переменных без какого-либо количественного значения. Иногда их называют «именованными» данными.

Обычно номинальные данные не имеют внутренней упорядоченности. Например, Пол — это номинальная переменная, имеющая 2 категории, но не существует определенного способа упорядочивания от высшего к низшему и наоборот.

Примеры: буквы, символы, слова, пол, цвет и т. д.

Порядковые данные

Порядковые данные — это тип данных, которые следуют естественному порядку. Это тип категориальных данных с порядком. Переменные в порядковых данных перечислены в упорядоченном порядке.

Примеры: рейтинг клиентов (хороший, средний, плохой), категория медалей на Олимпийских играх (золото, серебро, бронза).



Как кодировать категориальные данные?

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

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

Порядковое кодирование

Нам нужно поддерживать внутренний порядок при преобразовании порядковых данных в числовые данные. Итак, каждой категории будут присвоены номера от 0 до количества категорий. Если у нас есть 3 категории в данных, такие как «плохой», «средний» и «хороший», то плохой будет закодирован как 0, средний как 1 и хороший как 2. Таким образом, порядок сохраняется.

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

Мы используем класс OrdinalEncoder из sklearn для кодирования порядковых данных.



Давайте посмотрим, как мы можем практически кодировать порядковые данные.

import pandas as pd
import numpy as np
df = pd.read_csv('customer.csv')
df.head()

df['age'].unique()
array([30, 68, 70, 72, 16, 31, 18, 60, 65, 74, 98, 51, 57, 15, 75, 59, 22,19, 97, 32, 96, 53, 69, 48, 83, 73, 92, 89, 86, 34, 94, 45, 76, 39,23, 27, 77, 61, 64, 38, 25], dtype=int64)
df['gender'].unique()
array(['Female', 'Male'], dtype=object)
df['review'].unique()
array(['Average', 'Poor', 'Good'], dtype=object)
df['education'].unique()
array(['School', 'UG', 'PG'], dtype=object)
df['purchased'].unique()
array(['No', 'Yes'], dtype=object)

возраст — числовые данные.

"пол" – номинальные категориальные данные.

"review" — порядковые категориальные данные.

'образование' — порядковые категориальные данные.

"Купленный" — целевая переменная.

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

df = df.iloc[:,2:]
df.head()

X = df.iloc[:,0:2]
y = df.iloc[:,-1]
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size =0.2, random_state=1)
from sklearn.preprocessing import OrdinalEncoder
ordinal_encoder = OrdinalEncoder(categories=[['Poor','Average','Good'],['School','UG','PG']])
ordinal_encoder.fit(X_train)
X_train = ordinal_encoder.transform(X_train)
X_test = ordinal_encoder.transform(X_test)

В приведенном выше коде мы видим, что мы передаем категории по порядку в класс ordinalEncoder, где «плохой» — самый низкий порядок, а «хороший» — самый высокий порядок в случае обзора функций.

Точно так же в случае столбца образования школа находится на самом низком уровне, а PG — на самом высоком уровне.

После преобразования мы можем наблюдать приведенный выше результат, который показывает первые 5 строк.

Первая строка имеет обзор = средний и образование = UG, поэтому она преобразуется как [1,1]

Вторая строка имеет обзор = плохое и образование = PG, поэтому она преобразуется как [0,2]

Номинальная кодировка

Номинальные данные не будут иметь внутреннего порядка, мы используем класс OneHotEncoder из sklearn для кодирования номинальных данных.

Если мы начнем кодировать категории от 0,1,2 до всех категорий, то алгоритм машинного обучения придаст важности 2 (больше 0 и 1), что будет неправдой, поскольку данные номинальные и не будут иметь внутреннего порядка. . Таким образом, этот метод не будет работать в случае номинальных данных.

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

Давайте посмотрим, как мы можем практически кодировать номинальные данные. Возьмем титанический набор данных с признаками «Пол» и «Посадка» (оба являются номинальными признаками).

import pandas as pd
import numpy as np
df = pd.read_csv('titanic.csv')
df.head()

df['Sex'].unique()
array(['male', 'female'], dtype=object)
df['Embarked'].unique()
array(['S', 'C', 'Q'], dtype=object)
df['Survived'].unique()
array([0, 1], dtype=int64)

OneHotEncoding с использованием Pandas

pd.get_dummies(df,columns=['Sex','Embarked'])

В приведенном ниже выводе показано, как каждая из категорий преобразуется в столбец. Столбец «Пол» был преобразован в «Пол_женщина» и «Пол_мужчина», а столбец «Принято» преобразован в «Принято_C», «Принято_Q» и «Принято_S».

Эти новые созданные атрибуты/столбцы называются фиктивными переменными.

Фиктивная ловушка переменной:

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

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



Например.
Давайте рассмотрим случай, когда пол имеет два значения: мужской(0 или 1) и женский(1 или 0). . Включение обеих фиктивных переменных может привести к избыточности, потому что, если в таком случае человек не мужчина, этот человек будет женщиной, следовательно, нам не нужно использовать обе переменные в регрессионных моделях. Это защитит нас от ловушки фиктивных переменных.



Таким образом, модели должны быть разработаны таким образом, чтобы исключить одну фиктивную переменную. Обычно мы опускаем первую переменную, как показано ниже.

pd.get_dummies(df,columns=[‘Sex’,’Embarked’],drop_first=True)

Результат показывает, что первая переменная была удалена. Sex_female и Embarked_C — это два столбца, удаленные из результата.

OneHotEncoding с использованием Sklearn

Мы можем использовать класс OneHotEncoder из sklearn для выполнения вышеуказанных шагов.

X = df.iloc[:,0:2]
y = df.iloc[:,-1]
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=1)

from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder(drop='first',sparse=False,dtype=np.int32)
X_train_new = ohe.fit_transform(X_train)
X_test_new = ohe.transform(X_test)

Обратите внимание, что новые функции будут создаваться в алфавитном порядке. В данном примере столбец Пол был преобразован в Пол_женский и Пол_мужской в алфавитном порядке, а женский пол был удален, так как это был первый столбец.

А в функции "Embarked" Embarked_C, Embarked_Q и Embarked_S были новыми столбцами в алфавитном порядке. , а категория «C» была удалена, поэтому массив [0,0] будет представлять C. [1,0] представляет «Q», а [0,1] представляет «S».