Реализованы популярные техники с использованием Python

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

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

Введение. Все модели машинного обучения представляют собой своего рода математическую модель, для работы с которой нужны числа. Категориальные данные имеют возможные значения (категории) и могут быть в текстовой форме. Например, Пол: Мужской / Женский / Другой, Ранги: 1-е, 2-е, 3-е и т. Д.

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

Во-первых, давайте разберемся с типами категориальных данных:

  1. Номинальные данные: номинальные данные, называемые данными с метками / именами. Разрешено менять порядок категорий, изменение порядка не влияет на его значение. Например, пол (мужской / женский / другой), возрастные группы (молодые / взрослые / старые) и т. Д.
  2. Порядковые данные: представляют дискретные и упорядоченные единицы. То же, что и номинальные данные, но с упорядоченным / ранжированием. Не разрешено изменять порядок категорий. Например, звания: 1-е, 2-е, 3-е, образование: (средняя школа / бакалавриат / аспирантура / докторская степень) и т. Д.

Способы обработки категориальных признаков:

Набор данных, используемый для объяснения, - это Titanic (набор данных Kaggle):

import pandas as pd
import numpy as np
Data = pd.read_csv("train.csv")
Data.isnull().sum()

  1. Создать манекены

Описание. Создайте столбцы фиктивного или двоичного типа для каждой категории в функции типа объекта / категории. Значение для каждой строки равно 1, если эта категория доступна в этой строке, иначе 0. Для создания макетов используйте функцию pandas get_dummies ().

Реализация:

DataDummies = pd.get_dummies(Data)
DataDummies

Преимущество:

  • Простой в использовании и быстрый способ обработки значений категориальных столбцов.

Недостаток:

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

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

2. Кодировка порядковых номеров

Описание:. Когда категориальные переменные являются порядковыми, самым простым способом является замена каждой метки / категории некоторым порядковым номером на основе рангов. В наших данных Pclass - это порядковый признак, имеющий значения First, Second, Third, поэтому каждая категория заменяется своим рангом, то есть 1,2,3 соответственно.

Реализация:

Шаг 1. Создайте словарь с ключом в качестве категории и значениями с его рангом.

Шаг 2: Создайте новый столбец и сопоставьте порядковый столбец с созданным словарем.

Шаг 3: Отбросьте исходный столбец.

# 1. 
PClassDict =   {   'First':1,
                    'Second':2,
                     'Third':3,              
                }
# 2. 
Data['Ordinal_Pclass'] = Data.Pclass.map(PClassDict)
# Display result
      
      Data[['PassengerId', 'Pclass', 'Ordinal_Pclass']].head(10)
# 3.
Data = Data.drop('Pclass', axis = 1)

Преимущество:

  • Самый простой способ обработать порядковый номер в наборе данных.

Недостаток:

  • Не подходит для объектов номинального типа в наборе данных.

3. Счетчик / частотное кодирование

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

Реализация:

Шаг 1. Создайте словари с ключом в качестве имени категории и значением с подсчетом категорий, то есть частотой этой категории в каждом категориальном столбце.

Шаг 2. Создайте новый столбец, который действует как вес для этой категории, и сопоставьте с соответствующим словарем.

Шаг 3. Отбросьте исходные столбцы.

# 1.
Pclass_Dict = Data['Pclass'].value_counts()
Salutation_Dict = Data['Salutation'].value_counts()
Sex_Dict = Data['Sex'].value_counts()
Embarked_Dict = Data['Embarked'].value_counts()
Cabin_Serial_Dict = Data['Cabin_Serial'].value_counts()
Cabin_Dict = Data['Cabin'].value_counts()
# 2.
Data['Encoded_Pclass'] = Data['Pclass'].map(Pclass_Dict)
Data['Salutation_Dict'] = Data['Salutation'].map(Salutation_Dict)
Data['Sex_Dict'] = Data['Sex'].map(Sex_Dict)
Data['Embarked_Dict'] = Data['Embarked'].map(Embarked_Dict)
Data['Cabin_Serial_Dict'] = Data['Cabin_Serial'].map(Cabin_Serial_Dict)
Data['Cabin_Dict'] = Data['Cabin'].map(Cabin_Dict)
# Display Result
Data[['Pclass','Encoded_Pclass','Salutation','Salutation_Dict','Sex'       ,'Sex_Dict','Embarked','Embarked_Dict','Cabin_Serial','Cabin_Serial_Dict','Cabin','Cabin_Dict']].head(10)
# 3. 
Data = Data.drop(['Pclass','Salutation','Sex','Embarked','Cabin_Serial','Cabin'], axis = 1)

Преимущество:

  • Восток реализовать.
  • Никаких дополнительных функций не увеличивается.

Недостаток:

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

4. Целевое / управляемое кодирование

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

Реализация. Чтобы продемонстрировать реализацию, я использую столбец Cabin относительно столбца Survived target. Те же шаги применимы для любого порядкового столбца в наборе данных.

Шаг 1. Замените исходное значение кабины первым символом названия кабины.

Шаг 2. Рассчитайте совместную вероятность каждой категории на основе целевого значения столбца.

Шаг 3. Создайте список с отсортированным индексом в порядке возрастания вероятностей присоединения.

Шаг 4. Создайте словарь, в котором ключ является названием категории в каюте, а значения - общим вероятностным ранжированием.

Шаг 5. Создайте новый столбец и сопоставьте значения кают со словарным совместным рейтингом вероятностей.

Шаг 6. Удалите исходную колонку кабины.

# 1.
Data['Cabin'] = Data['Cabin'].astype(str).str[0]
# 2.
Data.groupby(['Cabin'])['Survived'].mean()
# 3.
Encoded_Lables = Data.groupby(['Cabin'])  ['Survived'].mean().sort_values().index
# 4.
Encoded_Lables_Ranks = { k:i for i, k in enumerate(Encoded_Lables, 0) }
# 5.
Data['Cabin_Encoded'] = Data['Cabin'].map(Encoded_Lables_Ranks)
# 6.
Data = Data.drop('Cabin', axis = 1)

Преимущества:

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

Недостатки:

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

5. Среднее кодирование

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

Реализация:

Шаг 1. Рассчитайте среднее значение для каждой категории в столбце «Кабина» относительно целевого столбца («Выжившие»).

Шаг 2. Создайте новый столбец и замените его средним значением, т. Е. Сопоставьте категории столбцов каюты с его закодированным средним словарем.

Шаг 3. Отбросьте оригинальную колонку кабины.

# 1.
Encoded_Mean_Dict = Data.groupby(['Cabin'])['Survived'].mean().to_dict()
# 2.
Data['Cabin_Mean_Encoded'] = Data['Cabin'].map(Encoded_Mean_Dict)
# Display result
Data[['Cabin','Cabin_Mean_Encoded']].head()
# 3.
Data = Data.drop('Cabin', axis = 1)

Преимущества:

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

Недостатки:

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

6. Кодирование отношения вероятности

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

Реализация:

Шаг 1. Замените исходное значение кабины первым символом названия кабины.

Шаг 2. Найдите процент (%) людей, выживших в конкретной каюте, и сохраните в новом фреймворке.

Шаг 3. Создайте новый столбец в фрейме данных «Вероятность выживания» с вероятностью гибели людей в конкретной каюте.

Шаг 4. Создайте еще один новый столбец во фрейме данных «Вероятность выживания», то есть соотношение вероятности выживания и смерти.

Шаг 5. Создайте словарь со столбцом отношения вероятностей.

Шаг 6. Создайте новый столбец в Data и замените, сопоставив категории столбцов кабины с его закодированным словарем отношения вероятностей.

Шаг 7. Отбросьте оригинальную колонку кабины.

#1. 
Data['Cabin']  = Data['Cabin'].astype(str).str[0]
# 2. 
Probability_Survived = Data.groupby(['Cabin'])['Survived'].mean()
Probability_Survived = pd.DataFrame(Probability_Survived)
# 3.
Probability_Survived['Died'] = 1 - Probability_Survived['Survived']
# 4.
Probability_Survived['Prob_Ratio'] = Probability_Survived['Survived'] / Probability_Survived['Died']
# 5.
Encode_Prob_Ratio = Probability_Survived['Prob_Ratio'].to_dict()
# 6.
Data['Encode_Prob_Ratio'] = Data['Cabin'].map(Encode_Prob_Ratio)
# Display result
Data[['Cabin','Encode_Prob_Ratio']].head(10)
# 7.
Data = Data.drop('Cabin', axis = 1)

Преимущества:

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

Недостатки:

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

Вывод:

Поэтому в этих блогах я пытаюсь объяснить наиболее широко используемые способы обработки категориальных переменных при подготовке данных для машинного обучения. Фактическая записная книжка с кодом доступна по адресу https://github.com/GDhasade/Medium.com_Contents/blob/master/Handle_Categorical_Data.ipynb

Для получения дополнительной информации посетите http://contrib.scikit-learn.org/category_encoders/index.html.

Использованная литература:

  1. Scikit-learn.org. (2019). sklearn.preprocessing.OneHotEncoder - документация scikit-learn 0.22. [онлайн] Доступно по адресу: https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html.
  2. ‌Contrib.scikit-learn.org. (нет данных). Кодировщики категорий - документация по кодировщикам категорий 2.2.2. [онлайн] Доступно по адресу: http://contrib.scikit-learn.org/category_encoders/index.html.
  3. Криш Найк (2019). Разработка функций - Как выполнить одно горячее кодирование для многозначных переменных. YouTube. Доступно по адресу: https://www.youtube.com/watch?v=6WDFfaYtN6s&list=PLZoTAELRMXVPwYGE2PXD3x0bfKnR0cJjN&ab_channel=KrishNaik [доступ 10 сентября 2020 г.].