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

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

Как вы с этим согласитесь, потому что LR не принимает категориальные данные в качестве входных данных?

Ответ: мы можем просто преобразовать категориальные данные в числовые данные. Для этого у нас есть 2 метода в питоне:

1. Фиктивное кодирование

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

Метод 1: фиктивное кодирование

Это особенность библиотеки pandas для python.

Синтаксис:

pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False, dtype=None)

Параметры:

данные: в виде массива, серии или кадра данных.

prefix:str, список str или dict of str, по умолчанию None: Строка для добавления имен столбцов DataFrame.

prefix_sep: строка, по умолчанию ‘_’: добавление префикса, используемый разделитель/разделитель. Или передайте список или словарь, как с префиксом.

dummy_na: bool, по умолчанию False: добавьте столбец для указания NaN, если False NaN игнорируются.

Столбцы: в виде списка, по умолчанию Нет: Имена столбцов в DataFrame должны быть закодированы. Если столбцы имеют значение None, то все столбцы с типом объекта, строки или категории будут преобразованы.

Sparse: bool, по умолчанию False: должны ли столбцы с фиктивным кодированием поддерживаться массивом SparseArray (True) или обычным массивом NumPy (False).

drop_first: логическое значение, по умолчанию False: следует ли получить k-1 фиктивных значений из k категориальных уровней, удалив первый уровень.

Dtype: dtype, по умолчанию np.uint8: тип данных для новых столбцов. Допускается только один dtype.

Возвраты:фиктивный кодированный DataFrame

Давайте разберемся с помощью кода:

import pandas as pd
a=["apple", "mango", "apple", "guava"]

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

Пример:

data = {'Name': ['Vinay', 'Anany', 'Yash', 'Vidush'],'Age': [20, 18, 21, 19]}

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

Двигаясь вперед, мы должны преобразовать данные.

Преобразование значений в «а» из категориальных в числовые:

pd.get_dummies(a)

Приведенный выше код напечатает что-то вроде:

Мы видим, что он делит каждую категорию (имя) на столбцы и ставит 1 на каждую позицию. Вот как pandas.get_dummies кодирует категориальные данные в числовые данные.

Способ 2: кодировщик меток

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

Мы также можем кодировать категориальные данные в числовые данные с помощью Label Encoder, но это сильно отличается от pandas.get_dummies().

Его также можно использовать для преобразования нечисловых меток (если они поддаются хешированию и сопоставимы) в числовые метки.

Он кодирует метки со значением от 0 до n-1, где n — номер отдельной категории (метки). Если категория повторяется, ей присваивается то же значение, что и ранее.

Давайте посмотрим на пример:

#using previous data
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
le.fit_transform(a)

fit_transform: подходит для кодировщика меток и возвращает закодированные метки.

Параметры: y:массив формы (n_samples) (целевые значения).

Возвращает: y:массив формы (n_samples) (закодированные метки).

Он выдаст некоторый вывод, например:

Из приведенного выше изображения видно, что оно предоставляет значения от 0 до n-1 и возвращает их в виде массива.

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

(Часть взята с https://pandas.pydata.org/docs/reference/api/pandas.get_dummies.html

https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html)

Надеюсь, вы хорошо провели время, читая статью. Я был бы рад узнать ваше мнение о том же. Вы можете связаться со мной в LinkedIn и GitHub.