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