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

В этом блоге мы будем использовать библиотеку thesklearn.impute для обработки отсутствующих данных во фрейме данных panda.

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

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

Помимо SimpleImputer, модуль sklearn.impute также включает другие классы для более продвинутых методов, таких как KNNImputer, который заполняет пропущенные значения, просматривая k-ближайших соседей, или IterativeImputer, который использует модели машинного обучения для прогнозирования пропущенных значений на основе другие функции в наборе данных.

Давайте обсудим каждый из них с практическим кодированием на Python.

0 . Импорт библиотек и создание фрейма данных

import numpy as np 
import pandas as pd
# explicitly require this experimental feature for Importing Interative Imputer
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import SimpleImputer, KNNImputer, IterativeImputer, MissingIndicator

data = pd.DataFrame({
    'A': [1, 2, np.nan, 4],
    'B': [5, np.nan, 7, 8],
    'C': [9, np.nan, 4, 4]
})

print(data)

1. Простой Импьютер

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

1.1. Средняя стратегия

Здесь отсутствующие значения были заменены средним значением соответствующих столбцов.
Пример. Для столбца «А» среднее значение равно (1+2+4)/3 = 2,333
Таким образом, отсутствующее значение было заменено. с 2.333

simp_imputer_mean = SimpleImputer(strategy='mean')
data_simp_imp_mean = pd.DataFrame(simp_imputer_mean.fit_transform(data), columns=data.columns)
print(data_simp_imp_mean)

1.2. Медианная стратегия

Здесь отсутствующие значения были заменены медианой соответствующих столбцов.
Пример: для столбца «B» список равен [5,7,8], поэтому 7 становится медианой.
Таким образом, отсутствующее значение заменили на 7

simp_imputer_median = SimpleImputer(strategy='median')
data_simp_imp_median = pd.DataFrame(simp_imputer_median.fit_transform(data), columns=data.columns)
print(data_simp_imp_median)

1.3. Самая распространенная стратегия

Здесь отсутствующие значения были заменены наиболее часто встречающимся значением соответствующих столбцов.
Пример. Для столбца «C» наиболее часто встречающимся значением является 4.
Таким образом, отсутствующее значение было заменено на 4.

simp_imputer_mfreq = SimpleImputer(strategy='most_frequent')
data_simp_imp_mfreq = pd.DataFrame(simp_imputer_mfreq.fit_transform(data), columns=data.columns)
print(data_simp_imp_mfreq)

1.4. Постоянная стратегия

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

simp_imputer_const = SimpleImputer(strategy='constant',fill_value=99)
data_simp_imp_const = pd.DataFrame(simp_imputer_const.fit_transform(data), columns=data.columns)
print(data_simp_imp_const)

2. КННИмпьютер

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

Мы можем настроить параметры «n_neighbors» в соответствии с нашими требованиями. Для вычисления среднего значения потребуется среднее значение n ближайших точек в наборе данных.

knn_imputer = KNNImputer(n_neighbors=2)
data_imp_knn = pd.DataFrame(knn_imputer.fit_transform(data), columns=data.columns)
print(data_imp_knn)

knn_imputer = KNNImputer(n_neighbors=3)
data_imp_knn = pd.DataFrame(knn_imputer.fit_transform(data), columns=data.columns)
print(data_imp_knn)

knn_imputer = KNNImputer(n_neighbors=5)
data_imp_knn = pd.DataFrame(knn_imputer.fit_transform(data), columns=data.columns)
print(data_imp_knn)

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

3. Итеративный импьютер

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

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

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

iter_imputer = IterativeImputer(max_iter=5, random_state=0)
data_imp_iter = pd.DataFrame(iter_imputer.fit_transform(data), columns=data.columns)
print(data_imp_iter)

iter_imputer = IterativeImputer(max_iter=10, random_state=0)
data_imp_iter = pd.DataFrame(iter_imputer.fit_transform(data), columns=data.columns)
print(data_imp_iter)

4. Индикатор отсутствия

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

indicator = MissingIndicator(features='all')
missing_values = indicator.fit_transform(data)
data_indicator = pd.concat([data, pd.DataFrame(missing_values, columns=['A_missing', 'B_missing', 'C_missing'])], axis=1)
print(data_indicator)

Репозиторий GitHub для Notebook: Sk-Learn-Imputer

Спасибо за прочтение :)