В моем последнем блоге Ссылка я объяснил различные способы обработки отсутствующих данных в непрерывном столбце и их реализацию.
В этом блоге я объясню, как обрабатывать отсутствующие значения столбца категориальных данных в наборе данных с помощью реализации с использованием 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())))
- Частое категорическое вменение
Допущения: данные отсутствуют случайным образом (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