Автор: Робби Альфардо Ирфан, Ученик в процессе

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

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

Широкий диапазон обработки пропущенных значений - deletions и imputations. Есть три метода deletions, а именно:

  1. Попарное удаление, удаление только отсутствующих значений.
  2. Удаление по списку: удаление строки, содержащей пропущенные значения.
  3. Удаление целых столбцов, удаление столбца, содержащего пропущенные значения.

Хотя у imputations есть два метода:

  1. Общие импутации с постоянным, средним, медианным и режимом.
  2. Расширенный импутация с использованием K-ближайших соседей (KNN) и многомерного вменения с помощью цепных уравнений (MICE)

Хорошо, давайте поедем это шоу !!!

Чтение в наборе данных

Мы увидим пример прогнозирования цен на жилье из Жилищных данных Мельбурна. Он был создан в сентябре 2017 года. Кроме того, были удалены дома без цены. Начнем с чтения наших данных как pandas DataFrame:

##Data Inputing
import pandas as pd
housing = pd.read_csv('.../input/melb_data.csv/melb_data.csv')
housing.info()
housing.head()

Если вы запустите этот код в записной книжке Jupyter или в Spyder, вы увидите, что есть 13580 наблюдений и 21 столбец. Каждый столбец представляет переменную в DataFrame. По типу данных каждого столбца мы можем видеть, что это за тип переменной. Для простоты примера мы будем использовать только числовые предикторы .

##Target and Predictors
housing_target = housing.Price
housing_predictors = housing.drop(['Price'], axis=1)
#For keeping the example simple, we'll use only numeric predictors 
housing_numeric_predictors = housing_predictors.select_dtypes(exclude=['object'])

Обнаружение отсутствующих значений

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

#Splitting our data into Train and Test
import numpy as np
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(housing_numeric_predictors, housing_target, test_size=0.2, random_state=0)
#Detecting Missing Values of train data
train_missing_val = X_train.isnull().sum()
train_missing_percent = X_train.isnull().sum()*100/len(X_train)
train_missing_table = pd.concat([train_missing_val,train_missing_percent],axis=1)
train_missing_summary = train_missing_table.rename(columns = {0 : 'Missing Values', 1 : '% of Total Values'})
#Detecting Missing Values of test data
test_missing_val = X_test.isnull().sum()
test_missing_percent = X_test.isnull().sum()*100/len(X_test)
test_missing_table = pd.concat([test_missing_val,test_missing_percent],axis=1)
test_missing_summary = test_missing_table.rename(columns = {0 : 'Missing Values', 1 : '% of Total Values'})

Создать функцию для измерения качества подхода

Мы загрузили функцию mae_score(X_train, X_test, y_train, y_test) для сравнения качества различных подходов к отсутствующим значениям. Эта функция сообщает значение средней абсолютной ошибки (MAE) вне выборки для случайного леса.

Мы знаем, что ошибка - это абсолютная разница между фактическими значениями и значениями, которые прогнозируются. MAE берет среднее значение этой ошибки из каждой выборки в наборе данных.

Случайный лес - это широко используемый алгоритм машинного обучения, зарегистрированный Лео Брейманом и Адель Катлер, который объединяет выходные данные нескольких деревьев решений для достижения единого результата . Его простота использования и гибкость способствовали его принятию, поскольку он решает проблемы как классификации, так и регрессии. Перейдем к методам!

#Function to measure the quality of an approach
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error
def mae_score(X_train, X_test, y_train, y_test):
    model = RandomForestRegressor()
    model.fit(X_train, y_train)
    predicts = model.predict(X_test)
    return mean_absolute_error(y_test, predicts)

УДАЛЕНИЯ

Удаление означает удаление недостающих значений из набора данных. Однако это не рекомендуется, так как это может привести к потере информации из набора данных. Мы должны удалять отсутствующие значения из набора данных только в том случае, если их доля очень мала. Кроме того, удаления бывают трех типов:

1. Парные исключения

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

Реализация RandomForest Thesklearn не обрабатывает отсутствующие значения внутренне без четких инструкций / добавленного кода. Таким образом, хотя средства правовой защиты (например, вменение отсутствующих значений и т. Д.) Легко доступны в sklearn, вам НЕОБХОДИМО иметь дело с отсутствующими значениями перед обучением модели. Итак, в этой серии статей мы не можем выполнять попарное удаление для анализа с помощью RandomForest.

2. Удаление по списку

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

#Reset index of predictors
X_train_reset = X_train.reset_index()
X_test_reset = X_test.reset_index()
#Get the target without missing value in predictors
listwise_y_train_index = X_train_reset.loc[X_train_reset.isnull().sum(1)>0].index
listwise_y_train = y_train.drop(y_train.index[listwise_y_train_index])
listwise_y_test_index = X_test_reset.loc[X_test_reset.isnull().sum(1)>0].index
listwise_y_test = y_test.drop(y_test.index[listwise_y_test_index])
#Drop rows that containing missing values
listwise_X_train = X_train.dropna()
listwise_X_test = X_test.dropna()
#Get a MAE score
print("Mean Absolute Error from Listwise Deletion:")
print(mae_score(listwise_X_train, listwise_X_test, listwise_y_train, listwise_y_test))

3. Удаление целых столбцов.

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

#Dropping entire columns
cols_with_missing = [col for col in X_train.columns 
                                 if X_train[col].isnull().any()]
reduced_X_train = X_train.drop(cols_with_missing, axis=1)
reduced_X_test  = X_test.drop(cols_with_missing, axis=1)
#Get a MAE score
print("Mean Absolute Error from dropping columns with Missing Values:")
print(mae_score(reduced_X_train, reduced_X_test, y_train, y_test))

ИМПУТАЦИИ

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

1. Общие вменения

а. Постоянный импорт

Постоянный импьютер заменяет отсутствующие значения на fill_value. Может использоваться со строками или числовыми данными. Если для fill_value оставить значение по умолчанию, оно будет равно 0 при подстановке числовых данных и «missing_value» для строк или типов данных объекта.

##General Imputations
from sklearn.impute import SimpleImputer
#Constant Imputer
constant_imputer = SimpleImputer(strategy='constant')
constant_X_train = constant_imputer.fit_transform(X_train)
constant_X_test = constant_imputer.transform(X_test)
print("Mean Absolute Error from Constant Imputation:")
print(mae_score(constant_X_train, constant_X_test, y_train, y_test))

б. Mean Imputer

Среднее значение заменяет отсутствующие значения, используя среднее значение по каждому столбцу. Может использоваться только с числовыми данными.

#Mean Imputer
mean_imputer = SimpleImputer(strategy='mean')
mean_X_train = mean_imputer.fit_transform(X_train)
mean_X_test = mean_imputer.transform(X_test)
print("Mean Absolute Error from Mean Imputation:")
print(mae_score(mean_X_train, mean_X_test, y_train, y_test))

c. Median Imputer

Срединный импьютер заменяет пропущенные значения с помощью медианы по каждому столбцу. Может использоваться только с числовыми данными.

#Median Imputer
median_imputer = SimpleImputer(strategy='median')
median_X_train = median_imputer.fit_transform(X_train)
median_X_test = median_imputer.transform(X_test)
print("Mean Absolute Error from Median Imputation:")
print(mae_score(median_X_train, median_X_test, y_train, y_test))

d. Режим Imputer

Mode Imputer заменяет отсутствующее значение, используя наиболее частое значение в каждом столбце. Может использоваться со строками или числовыми данными. Если таких значений несколько, возвращается только наименьшее.

#Mode Imputer
mode_imputer = SimpleImputer(strategy='most_frequent')
mode_X_train = mode_imputer.fit_transform(X_train)
mode_X_test = mode_imputer.transform(X_test)
print("Mean Absolute Error from Mode Imputation:")
print(mae_score(mode_X_train, mode_X_test, y_train, y_test))

2. Расширенные вменения

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

а. K-Ближайшие соседи (KNN)

Класс KNN Imputer обеспечивает вменение для заполнения пропущенных значений с использованием подхода k-ближайших соседей. Для каждого отсутствующего объекта используются значения из n_neighbors ближайших соседей, которые имеют значение для данного объекта. Характеристика соседей равномерно усредняется или взвешивается по расстоянию до каждого соседа.

##Advanced Imputer
#KNN
from sklearn.impute import KNNImputer
KNN_imputer = KNNImputer(n_neighbors=5, weights='uniform', metric='nan_euclidean')
KNN_X_train = KNN_imputer.fit_transform(X_train)
KNN_X_test = KNN_imputer.transform(X_test)
print("Mean Absolute Error from KNN Imputation:")
print(mae_score(KNN_X_train, KNN_X_test, y_train, y_test))

б. Многомерный расчет с помощью цепных уравнений (MICE)

Стратегия вменения пропущенных значений путем моделирования каждой функции с пропущенными значениями в зависимости от других функций в циклическом режиме. Он выполняет множественную регрессию по случайной выборке данных, затем берет среднее значение множественной регрессии и использует это значение для вменения пропущенного значения. Вsklearn он реализован следующим образом:

#MICE
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
mice_imputer = IterativeImputer()
mice_X_train = mice_imputer.fit_transform(X_train)
mice_X_test = mice_imputer.transform(X_test)
print("Mean Absolute Error from MICE Imputation:")
print(mae_score(mice_X_train, mice_X_test, y_train, y_test))

Вывод

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

На основе этой таблицы мы возьмем метод с наименьшим значением MAE. Итак, мы возьмем постоянный импьютер как лучший метод для обработки пропущенных значений. Что ж, не существует единственного лучшего способа справиться с отсутствующими значениями. Нужно поэкспериментировать с разными методами, а затем решить, какой из них лучше всего подходит для конкретной проблемы.

Надеюсь, вам понравилось это краткое руководство по обработке пропущенных значений с помощью удаления и вменения! Увидимся в следующей серии !!!