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

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

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

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

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

Количество категорий в каждом столбце:

# Code to get number of categories in missing value columns
print("Number of Categories in: ")
for ColName in DataFrame[['Embarked','Cabin_Serial','Cabin']]:
    print("{} = {}".format(ColName,       len(DataFrame[ColName].unique())))

  1. Частое категорическое вменение

Допущения: данные отсутствуют случайным образом (MAR), и, похоже, отсутствуют значения большинства.

Описание. Замена значений NAN наиболее часто встречающейся категорией в переменной / столбце.

Реализация:

Шаг 1: Найдите, какая категория чаще всего встречается в каждой категории, используя режим ().

Шаг 2: Замените все значения NAN в этом столбце на эту категорию.

Шаг 3: Отбросьте исходные столбцы и сохраните новые столбцы с условными значениями.

#1. Function to replace NAN values with mode value
def impute_nan_most_frequent_category(DataFrame,ColName):
    # .mode()[0] - gives first category name
     most_frequent_category=DataFrame[ColName].mode()[0]
    
    # replace nan values with most occured category
     DataFrame[ColName + "_Imputed"] = DataFrame[ColName]
     DataFrame[ColName + "_Imputed"].fillna(most_frequent_category,inplace=True)
#2. Call function to impute most occured category
for Columns in ['Embarked','Cabin_Serial','Cabin']:
    impute_nan_most_frequent_category(DataFrame,Columns)
    
# Display imputed result
DataFrame[['Embarked','Embarked_Imputed','Cabin_Serial','Cabin_Serial_Imputed','Cabin','Cabin_Imputed']].head(10)
#3. Drop actual columns
DataFrame = DataFrame.drop(['Embarked','Cabin_Serial','Cabin'], axis = 1)

Преимущество: просто и легко реализовать для категориальных переменных / столбцов.

Недостаток:

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

2. Добавление переменной для захвата NAN

Допущения: без предположений, можно работать со всеми типами категориальных столбцов.

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

Реализация:

Шаг 1. Создайте новый столбец и замените 1, если категория - NAN, иначе 0. Этот столбец является столбцом важности для вмененной категории.

Шаг 2. Замените значение NAN на наиболее часто встречающуюся категорию в фактическом столбце.

# Function to impute most occured category and add importance vairable
def impute_nan_add_vairable(DataFrame,ColName):
    #1. add new column and replace if category is null then 1 else 0
    DataFrame[ColName+"_Imputed"] =   np.where(DataFrame[ColName].isnull(),1,0)
    
    # 2. Take most occured category in that vairable (.mode())
    
    Mode_Category = DataFrame[ColName].mode()[0]
    
    ## 2.1 Replace NAN values with most occured category in actual vairable
    
    DataFrame[ColName].fillna(Mode_Category,inplace=True)
# Call function to impute NAN values and add new importance feature
for Columns in ['Embarked','Cabin_Serial','Cabin']:
    impute_nan_add_vairable(DataFrame,Columns)
    
# Display top 10 row to see the result of imputation
DataFrame[['Embarked','Embarked_Imputed','Cabin_Serial','Cabin_Serial_Imputed','Cabin','Cabin_Imputed']].head(10)

Преимущество. Подчеркните важность отсутствия.

Недостаток:

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

3. Создайте новую категорию (случайную категорию) для значений NAN

Предположения: без предположений.

Описание. Создайте новую категорию для значений NAN, то есть случайную категорию.

Реализация:

Шаг 1. Замените значение NAN новым именем (здесь мы создаем новую категорию как Неизвестно).

Шаг 2. Отобразите результат

#1. Function to impute null value with new category
def impute_nan_create_category(DataFrame,ColName):
     DataFrame[ColName] = np.where(DataFrame[ColName].isnull(),"Unknown",DataFrame[ColName])
## Call function to create new category for variables
for Columns in ['Embarked','Cabin_Serial','Cabin']:
    impute_nan_create_category(DataFrame,Columns)
#2. Display result
DataFrame[['Embarked','Cabin_Serial','Cabin']].head(10)

Преимущество: просто и легко реализовать для категориальных переменных / столбцов и сохраняет дисперсию.

Недостаток:

  • Может создавать случайные данные, если недостающая категория больше.
  • Не дает хороших результатов, если отсутствует значительная часть данных.

Вывод:

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

Для справки: блокнот Jupyter - код доступен на GitHub: https://github.com/GDhasade/Medium.com_Contents/blob/master/Handle_Categorical_Missing_Data.ipynb