(Примеры с использованием Python)

Введение

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

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

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

Способы обработки отсутствующих данных

  1. Удаление столбцов с большим количеством пропущенных значений
  2. Удаление строк с пропущенными значениями
  3. Вменение пропущенных значений для непрерывных переменных
  4. Вменение пропущенных значений для категориальных переменных
  5. Вменение методов для данных временных рядов
  6. Использование алгоритмов, поддерживающих пропущенные значения
  7. Прогнозирование пропущенных значений
  8. Вменение с использованием библиотеки глубокого обучения — Datawig

Удаление столбцов с большим количеством пропущенных значений

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

Например, рассмотрим набор данных идентификации Glass от Kaggle.

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

# Dropping all the columns with more than 50 percent missing values
df2 = df1.dropna(axis=1, thresh = df1.shape[0]*0.50)

Плюсы:

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

Минусы:

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

Удаление строк с пропущенными значениями

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

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

# Dropping all the rows with containing one or more NULL values
df_removed_null_values = df1.dropna(axis=0)

Плюсы:

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

Минусы:

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

Вменение пропущенных значений для непрерывных переменных

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

Например, рассмотрим набор данных идентификации Glass от Kaggle.

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

  • Если переменная содержит более 10 отсутствующих записей, импутируйте записи, используя среднее значение записей из соответствующего класса вместо использования среднего значения всего столбца.
  • Если переменная содержит менее 10 отсутствующих записей, вмените записи с предыдущим значением, отличным от NAN, из строки с тем же «классом».
group1 = []
group2 = []
for col in df2.columns:
  if df2[col].isnull().sum() > 10:
    group1.append(col) # columns with greater than 10 missing records
  else: 
    group2.append(col) # columns with lesser than 10 missing records

#impute values for mean based on category
df2[group1] = df2.groupby('Class')[group1].transform(
lambda g: g.fillna(np.mean(g)))
df2[group2] = df2.groupby('Class')[group2].fillna(method='ffill')

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

Плюсы:

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

Минусы:

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

Вменение пропущенных значений для категориальных переменных

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

Используются данные Titanic Dataset от Kaggle

df['cabin'] = df['cabin'].fillna('U') 

Плюсы:

  1. Предотвращая потерю данных, этот метод гарантирует, что никакая важная информация не будет удалена из набора данных, включая строки или столбцы. Это может иметь решающее значение для точного анализа данных.
  2. Этот метод особенно эффективен при работе с небольшими наборами данных и прост в применении на практике, что делает его отличным вариантом для тех, кто плохо знаком с кодированием данных.
  3. Чтобы противодействовать любой потенциальной потере данных, этот подход добавляет в набор данных уникальную категорию. Это может помочь обеспечить учет всей информации и отсутствие каких-либо упущений.

Минусы:

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

Вменение значений переменной временного ряда

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

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

Используются данные Titanic Dataset от Kaggle

data["Age"] = data["Age"].interpolate
(method='linear', limit_direction='forward', axis=0)

Плюсы:

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

Минусы:

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

Использование алгоритмов, поддерживающих пропущенные значения

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

Плюсы:

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

Минусы:

  • Нет реализации этих алгоритмов машинного обучения в библиотеке scikit-learn.
  • Использование этих алгоритмов может потребовать больше вычислительных ресурсов и более длительного времени обучения по сравнению с более простыми методами вменения.

Прогноз пропущенных значений:

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

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

Используются данные Titanic Dataset от Kaggle

Here 'Age' column contains missing values so for prediction of null values 
the spliting of data will be,y_train: rows from data["Age"] 
with non null values
y_test: rows from data["Age"] with null values
X_train: Dataset except data["Age"] features with non null values
X_test: Dataset except data["Age"] features with null values
from sklearn.linear_model import LinearRegression
import pandas as pd

data = pd.read_csv("train.csv")
data = data[["Survived", "Pclass", "Sex", "SibSp", "Parch", "Fare", "Age"]]

data["Sex"] = [1 if x=="male" else 0 for x in data["Sex"]]

test_data = data[data["Age"].isnull()]
data.dropna(inplace=True)

y_train = data["Age"]
X_train = data.drop("Age", axis=1)
X_test = test_data.drop("Age", axis=1)

model = LinearRegression()
model.fit(X_train, y_train)

y_pred = model.predict(X_test)

Плюсы:

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

Минусы:

  • Рассматривается только как прокси для истинных значений

Вменение с использованием библиотеки глубокого обучения — Datawig

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

Пример использования библиотеки Datawig для набора данных Titanic от kaggle

import pandas as pd
pip install datawig
import datawig

data = pd.read_csv("train.csv")

df_train, df_test = datawig.utils.random_split(data)

#Initialize a SimpleImputer model
imputer = datawig.SimpleImputer(
    input_columns=['Pclass','SibSp','Parch'], # column(s) containing information about the column we want to impute
    output_column= 'Age', # the column we'd like to impute values for
    output_path = 'imputer_model' # stores model data and metrics
    )

#Fit an imputer model on the train data
imputer.fit(train_df=df_train, num_epochs=50)

#Impute missing values and return original dataframe with predictions
imputed = imputer.predict(df_test)

Плюсы:

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

Минусы:

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

Заключение

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

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

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

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

Ссылки:

[1] Datawig: https://github.com/awslabs/datawig