Реализованы популярные техники с использованием Python
В своих последних блогах я объяснил типы пропущенных значений и различные способы обработки непрерывных и категориальных пропущенных значений с помощью реализации.
После обработки отсутствующих значений в наборе данных следующим шагом была обработка категориальных данных. В этом блоге я объясню различные способы обработки категориальных функций / столбцов вместе с реализацией с использованием Python.
Введение. Все модели машинного обучения представляют собой своего рода математическую модель, для работы с которой нужны числа. Категориальные данные имеют возможные значения (категории) и могут быть в текстовой форме. Например, Пол: Мужской / Женский / Другой, Ранги: 1-е, 2-е, 3-е и т. Д.
Во время работы над проектом по науке о данных после обработки недостающего значения наборов данных. Следующая работа - обработать категориальные данные в наборах данных перед применением любых моделей машинного обучения.
Во-первых, давайте разберемся с типами категориальных данных:
- Номинальные данные: номинальные данные, называемые данными с метками / именами. Разрешено менять порядок категорий, изменение порядка не влияет на его значение. Например, пол (мужской / женский / другой), возрастные группы (молодые / взрослые / старые) и т. Д.
- Порядковые данные: представляют дискретные и упорядоченные единицы. То же, что и номинальные данные, но с упорядоченным / ранжированием. Не разрешено изменять порядок категорий. Например, звания: 1-е, 2-е, 3-е, образование: (средняя школа / бакалавриат / аспирантура / докторская степень) и т. Д.
Способы обработки категориальных признаков:
Набор данных, используемый для объяснения, - это Titanic (набор данных Kaggle):
import pandas as pd import numpy as np Data = pd.read_csv("train.csv") Data.isnull().sum()
- Создать манекены
Описание. Создайте столбцы фиктивного или двоичного типа для каждой категории в функции типа объекта / категории. Значение для каждой строки равно 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.
Использованная литература:
- Scikit-learn.org. (2019). sklearn.preprocessing.OneHotEncoder - документация scikit-learn 0.22. [онлайн] Доступно по адресу: https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html.
- Contrib.scikit-learn.org. (нет данных). Кодировщики категорий - документация по кодировщикам категорий 2.2.2. [онлайн] Доступно по адресу: http://contrib.scikit-learn.org/category_encoders/index.html.
- Криш Найк (2019). Разработка функций - Как выполнить одно горячее кодирование для многозначных переменных. YouTube. Доступно по адресу: https://www.youtube.com/watch?v=6WDFfaYtN6s&list=PLZoTAELRMXVPwYGE2PXD3x0bfKnR0cJjN&ab_channel=KrishNaik [доступ 10 сентября 2020 г.].