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

Типы отсутствующих данных

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

  • Полностью случайно пропавшие без вести (MCAR) - это означает, что пропорция пропущенных значений не связана с каким-либо наблюдением в данных. Примером этого являются весы, у которых разрядились батареи, и в результате некоторые данные будут отсутствовать.
  • Отсутствующие не случайно (MNAR) - это означает, что недостающие данные связаны с неизвестными нам факторами. Например, механизм весов может изнашиваться со временем, тем самым создавая больше пропущенных значений с течением времени, но мы можем не заметить того же. Если у нас есть механизм пропуска MNAR, нам нужно понять, почему данные отсутствуют, а не сразу вменяя им.

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

Отсутствующие значения могут быть в виде пустой строки, NA, N / A или None. Pandas в python идентифицирует все NA или пустые значения в данных как значения NaN. Однако он не определяет na,?, N.a. или н / д. Н / д или пустые форматы значений в наборе данных можно определить с помощью команды df.isnull (). Этот метод возвращает логический ответ True при наличии пропущенных значений в данных.

Однако иногда может быть случай, когда отсутствующие значения находятся в другом формате данных. Например, столбец имеет отсутствующие значения в формате n / a, _ _ или na. Простой способ для pandas обнаружить отсутствующие значения в нестандартном формате в наборе данных при импорте данных следует поместить все типы пропущенных значений в виде списка.

missing_values = ["n/a", "na", " _ _"]
df = pd.read_csv("loan data.csv", na_values = missing_values)

В наборе данных команда df.isnull (). Sum () используется для нахождения общего количества пропущенных значений для каждой функции в данных.

Визуализация отсутствующих значений в Python

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

# Import the library
pip install missingno
import missingno as msno
# Visualize the missing values using a matrix 
msno.matrix(df)

Количество пропущенных значений в каждом столбце представлено в виде гистограммы.

# Visualize missing values as a bar chart
msno.bar(df)

Тепловая карта представляет собой корреляцию между отсутствующими значениями в каждом столбце.
Значение, соответствующее -1, указывает, что переменная A в наборе данных приводит к отсутствию значений в ее переменной B.

msno.heatmap(df)

Подходы к работе с отсутствующими значениями

1 Перетащите столбцы и строки, содержащие отсутствующие значения

Удалите столбцы и строки, содержащие пропущенные значения в данных MCAR. Однако проблема с этим подходом заключается в потере информации. Рекомендуется удалить определенный столбец, если количество пропущенных значений в данных превышает 70–75 процентов. Кроме того, когда у нас есть большие наборы данных, мы можем удалять строки содержащие нулевые значения. Однако не рекомендуется, если процент пропущенных значений в наборе данных превышает 30 процентов.

#Drop the rows with at least one element missing
df.dropna(inplace = True)
# Drop the rows with all the elements missing
df.dropna(how='all',inplace = True)
# Drop the rows with missing values greater than two
df.dropna(thresh=2, inplace = True)
# Drop the rows with at least one missing value in the columns specified in the subset function
df.dropna(subset=['age', 'fare'])
# Drop the columns with at least one missing value
df.dropna(axis= 1 , inplace = True)
# Drop the columns containing all the elements missing
df.dropna(axis= 'columns',how = 'all', inplace = True)

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

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

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

from sklearn.impute import SimpleImputer
mean_imp = SimpleImputer( strategy='mean') 
# For Mode replace strategy with most_frequent
# For Median replace strategy with Medianmean_imp.fit(train)
train_df = mean_imp.transform(train)

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

from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
# define the imputer
imputer = SimpleImputer(strategy='mean')
# define the model
lda = LinearDiscriminantAnalysis()
# define the modeling pipeline
pipeline = Pipeline(steps=[('imputer', imputer),('model', lda)])
# define the cross validation procedure
kfold = KFold(n_splits=3, shuffle=True, random_state=1)
# evaluate the model
result = cross_val_score(pipeline, X, y, cv=kfold, scoring='accuracy')

3 Расчет с использованием k-NN

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

from sklearn.impute import KNNImputer
# define imputer
imputer = KNNImputer(n_neighbors=5, weights='uniform', metric='nan_euclidean')
# fit on the data set
imputer.fit(X)
# fit on the data set
imputer.fit(X)
# transform the data set
Xtrans = imputer.transform(X)

4 Множественное исчисление цепными уравнениями (MICE)

MICE - это метод множественного вменения для замены пропущенных значений в наборе данных механизмом пропущенных MAR. Он использует другие функции в данных, чтобы сделать лучший прогноз для каждого пропущенного значения. В этом алгоритме каждое пропущенное значение моделируется на основе наблюдаемых значений в данных. Чтобы узнать больше об алгоритме MICE, отметьте « алгоритм MICE для вменения отсутствующих значений в набор данных ». Этот алгоритм может быть реализован с использованием Итеративный импульс Scikit-learn.

from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer

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

X.corr()
lr  = LinearRegression()
imp = IterativeImputer(estimator = lr ,verbose = 2 ,max_iter = 30,tol = 1e-10,order = 'roman')
imp.fit(X)
imp.transform(X)

Заключение

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