Автор: Робби Альфардо Ирфан, Ученик в процессе
Реальные данные беспорядочные и часто содержат много отсутствующих значений. Отсутствие значений может быть вызвано несколькими причинами. Но основная причина отсутствия может быть связана с данными, которых не существует, данными, которые не были собраны из-за человеческой ошибки, и данными, которые были удалены случайно.
В этой серии статей мы узнаем, как обнаруживать пропущенные значения, а затем рассмотрим некоторые методы, используемые для их обработки. В частности, сосредоточьтесь на deletions
иimputations
.
Широкий диапазон обработки пропущенных значений - deletions
и imputations
. Есть три метода deletions
, а именно:
- Попарное удаление, удаление только отсутствующих значений.
- Удаление по списку: удаление строки, содержащей пропущенные значения.
- Удаление целых столбцов, удаление столбца, содержащего пропущенные значения.
Хотя у imputations
есть два метода:
- Общие импутации с постоянным, средним, медианным и режимом.
- Расширенный импутация с использованием 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. Итак, мы возьмем постоянный импьютер как лучший метод для обработки пропущенных значений. Что ж, не существует единственного лучшего способа справиться с отсутствующими значениями. Нужно поэкспериментировать с разными методами, а затем решить, какой из них лучше всего подходит для конкретной проблемы.
Надеюсь, вам понравилось это краткое руководство по обработке пропущенных значений с помощью удаления и вменения! Увидимся в следующей серии !!!