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

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

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

  1. Кодировщик этикеток

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

Например, рассмотрим набор данных, содержащий информацию о фруктах. Набор данных содержит столбец «Цвет» с тремя категориями: «Красный», «Зеленый» и «Желтый». Чтобы использовать эти данные в модели машинного обучения, нам нужно преобразовать категориальные данные в столбце «Цвет» в числовую форму.

Итак, мы сопоставим числовые значения с этими цветами, используя класс LabelEncoder().

#Import Libraries 
import pandas as pd
from sklearn.preprocessing import LabelEncoder

#Create Dataset
data_raw = pd.DataFrame({'Fruit': ['Apple', 'Banana', 'Orange','Apple', 'Kiwi', 'Grape'],
                       'Color': ['Red', 'Yellow', 'Orange','Red', 'Green', 'Purple']})

#Encode Color Column 
data = data_raw.copy()
le = LabelEncoder()
data['Color_Encoded'] = le.fit_transform(data['Color'])
print(data)

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

2. Горячий энкодер

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

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

#Import Libraries
from sklearn.preprocessing import OneHotEncoder

#Fitting OHE
data = data_raw.copy()
ohe = OneHotEncoder(handle_unknown='ignore')
encoding_col = ['Fruit','Color']
data_encoded = ohe.fit_transform(data[encoding_col]).toarray()
data_encoded_df = pd.DataFrame(data_encoded, columns=ohe.get_feature_names(encoding_col))
data_encoded = pd.concat([data, data_encoded_df], axis=1)

print(data_encoded)

В Label Encoder размерность набора данных не меняется, но в случае OneHot Encoder размерность набора данных увеличивается в зависимости от количества категориальных столбцов и количества категорий, которые он имеет.

3. Порядковый энкодер

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

Например, если у нас есть категориальная переменная «уровень образования» со значениями «средняя школа», «степень бакалавра», «степень магистра» и «доктор философии», мы можем присвоить значения 1, 2, 3 и 4 соответственно. Порядковое кодирование предполагает наличие некоторого значимого порядка или ранжирования между категориями и использует эту информацию для присвоения числовых значений.

#Import Libraries 
from sklearn.preprocessing import OrdinalEncoder

#Create Dataset 
data = pd.DataFrame({'education_level':['High School','Bachelor\'s Degree',
                                        'Master\'s Degree','PhD','High School','Master\'s Degree']})

#Define Ranks/Order 
category_ranks = {'High School': 1, 
                  'Bachelor\'s Degree': 2, 
                  'Master\'s Degree': 3, 
                  'PhD': 4}

#Ordinal Encoding 
ordinal_encoder = OrdinalEncoder(categories=[list(category_ranks.keys())], dtype=int)
data['education_level_encoded'] = ordinal_encoder.fit_transform(data[['education_level']])

print(data)

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

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

Вы можете найти Блокнот для этой статьи здесь: Нажмите здесь

Спасибо за прочтение :)