Вопрос или проблема
У меня есть DataFrame pandas на Python, представляющий супerset. Данные содержат много пропусков, которые я хочу заменить реальными значениями.
Супerset имеет:
- как числовые, так и категориальные данные
- некоторые пропуски для большинства атрибутов
- мультиклассовые атрибуты (атрибуты могут иметь несколько значений)
- не зависит от времени
- каждая строка – это уникальный человек
Было бы неплохо использовать машинное обучение для заполнения пропусков, есть ли какие-либо рекомендации по этому поводу?
(Я предполагаю, что могу преобразовать категориальные данные в числовые, если это необходимо)
Во-первых, заполнение столбца, в котором большинство значений являются пропусками, может не иметь смысла. Вам нужно посмотреть на природу бизнес-проблемы, с которой вы сталкиваетесь. Вы можете попробовать удалить эти столбцы. Вы можете удалить строки, которые содержат пропуски, если число пропусков для столбцов в этой строке ниже определенного порога (в зависимости от ваших данных, конечно). Используйте: dataset.dropna(inplace=True), чтобы достичь этого.
С учетом сказанного, есть несколько способов заполнить (импутировать) пропуски:
- Вы можете попробовать заполнить значения на основе среднего (или медианы или моды): dataset.fillna(dataset.mean(), inplace=True). Однако этот подход имеет свои ограничения, если ваш столбец нечисловой.
Если вы хотите использовать реализацию sklearn, попробуйте использовать метод Imputer.
from sklearn.preprocessing import Imputer
impute = Imputer(missing_values=”NaN”, strategy=’mean’, axis=0)
impute.fit(dataset)
dataset = impute.transform(dataset)
- Для категориальных столбцов попробуйте использовать fillna с наиболее частым значением в столбце:
dataset[column].fillna(value=df[‘column1’].value_counts().index[0], inplace=True)
Больше информации об этом методе можно найти здесь: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.fillna.html
- Попробуйте использовать KNN для заполнения недостающих значений. Есть пакет под названием fancyimpute, который позволит вам это сделать:
from fancyimpute import KNN
dataset = pd.DataFrame(KNN(number_of_neighbors).complete(dataset))
Вам нужно будет соответственно выбрать количество соседей. Также fancyimpute требует массив numpy в качестве входных данных.
Существует много других методов, но эти должны сработать.
Ответ или решение
Улучшение качества данных в процессе предварительной обработки: Импутация
В рамках предобработки данных одним из важнейших этапов является улучшение качества данных, что непосредственно связано с заполнением пропусков в вашем наборе данных. Ваша задача заключена в том, чтобы заменить отсутствующие значения на реальные, используя методы машинного обучения. Рассмотрим, как это можно эффективно сделать с помощью библиотеки pandas в Python.
Анализ данных перед импутацией
Перед тем как перейти к заполнению пробелов, важно оценить, какую ценность данные могут потерять в результате этого процесса. Например, может оказаться, что столбцы с высоким процентом пропущенных значений не содержат достаточной информации и их целесообразно удалить. Для этого вы можете использовать следующий код для удаления строк или столбцов с пропусками:
# Удаление строк с количеством пропусков более определенного порога
dataset.dropna(thresh=threshold, inplace=True)
# Удаление столбцов с пропусками
dataset.dropna(axis=1, inplace=True)
Методы импутации значений
-
Основные статистические методы
- Для числовых столбцов целесообразно использовать среднее, медиану или моду для заполнения пропусков. Например, для среднего значения:
dataset.fillna(dataset.mean(), inplace=True)
Этот метод довольно прост, но следует учитывать, что он может быть неприменим для категориальных данных.
-
Импутация с использованием модели
- Библиотека
sklearn
предлагает высокоуровневый инструментарий для импутации данных. РанееImputer
был рекомендуем, но он устарел в более новых версиях. Теперь предпочтителенSimpleImputer
:
from sklearn.impute import SimpleImputer imputer = SimpleImputer(strategy='mean') # для числовых данных dataset[numerical_columns] = imputer.fit_transform(dataset[numerical_columns])
- Библиотека
-
Заполнение для категориальных данных
- Для категориальных переменных наиболее часто используемым значением может быть хороший выбор:
dataset[column].fillna(value=dataset[column].mode()[0], inplace=True)
-
Использование K ближайших соседей (KNN)
- Для более сложной импутации можно использовать KNN. Библиотека
fancyimpute
предоставляет удобный интерфейс для реализации этого метода:
from fancyimpute import KNN dataset = pd.DataFrame(KNN(k=5).complete(dataset.values), columns=dataset.columns)
Здесь вы должны будете выбрать значение k с учетом особенностей вашего набора данных.
- Для более сложной импутации можно использовать KNN. Библиотека
Завершение процесса
Обязательно проверьте качество заполненных данных, используя описательную статистику и визуализацию. Например, можно связать наличие пропусков с другими признаками, чтобы понять влияние импутации на целевую переменную.
# Визуализация распределения после импутации
import seaborn as sns
import matplotlib.pyplot as plt
sns.histplot(dataset['numerical_column'], kde=True)
plt.show()
Заключение
Подход к заполнению пропусков в данных зависит от характера ваших данных и специфики бизнес-проблемы. Применение адекватных методов импутации может значительно улучшить качество манипуляций с данными и повысить точность модели. Выбор метода будет зависеть от типа данных и их распределения. Применяя вышеописанные техники, вы сможете создать полноценный и качественный набор данных, готовый к дальнейшему анализу и использованию в моделях машинного обучения.