May 9, 2022

Заполнение пропусков по ближайшим соседям

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

import numpy as np
import pandas as pd
df = pd.DataFrame([[12, np.nan, 24], [1, 2, 3], [6, 3, np.nan], [1, 6, 8]])
df

Для заполнения воспользуемся классом KNNImputer из модуля sklearn.impute:

from sklearn.impute import KNNImputer

imp = KNNImputer(n_neighbors=2)
imp.fit_transform(df)

В качестве метрики для вычисления ближайших точек используется nan_euclidean (подробнее описывал здесь). Первое значение заполнено 4.5, так как это среднее между вторыми координатами для второй и третьей точек:

from sklearn.metrics.pairwise import nan_euclidean_distances

nan_euclidean_distances(X=[df.iloc[0]], Y=df.iloc[1:]) 

А 5.5 - это среднее между третьими координатами первой и третьей точек:

nan_euclidean_distances(X=[df.iloc[2]], Y=df.drop(2))

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

Масштабирование:

1. RobustScaler

2. StandardScaler

Кодирование категорий:

1. OneHotEncoder

2. OrdinalEncoder