Улучшение качества данных как часть предобработки: Импутация

Вопрос или проблема

У меня есть DataFrame pandas на Python, представляющий супerset. Данные содержат много пропусков, которые я хочу заменить реальными значениями.

Супerset имеет:

  • как числовые, так и категориальные данные
  • некоторые пропуски для большинства атрибутов
  • мультиклассовые атрибуты (атрибуты могут иметь несколько значений)
  • не зависит от времени
  • каждая строка – это уникальный человек

Было бы неплохо использовать машинное обучение для заполнения пропусков, есть ли какие-либо рекомендации по этому поводу?

(Я предполагаю, что могу преобразовать категориальные данные в числовые, если это необходимо)

Во-первых, заполнение столбца, в котором большинство значений являются пропусками, может не иметь смысла. Вам нужно посмотреть на природу бизнес-проблемы, с которой вы сталкиваетесь. Вы можете попробовать удалить эти столбцы. Вы можете удалить строки, которые содержат пропуски, если число пропусков для столбцов в этой строке ниже определенного порога (в зависимости от ваших данных, конечно). Используйте: dataset.dropna(inplace=True), чтобы достичь этого.

С учетом сказанного, есть несколько способов заполнить (импутировать) пропуски:

  1. Вы можете попробовать заполнить значения на основе среднего (или медианы или моды): 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)

  1. Для категориальных столбцов попробуйте использовать 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

  1. Попробуйте использовать 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)

Методы импутации значений

  1. Основные статистические методы

    • Для числовых столбцов целесообразно использовать среднее, медиану или моду для заполнения пропусков. Например, для среднего значения:
    dataset.fillna(dataset.mean(), inplace=True)

    Этот метод довольно прост, но следует учитывать, что он может быть неприменим для категориальных данных.

  2. Импутация с использованием модели

    • Библиотека sklearn предлагает высокоуровневый инструментарий для импутации данных. Ранее Imputer был рекомендуем, но он устарел в более новых версиях. Теперь предпочтителен SimpleImputer:
    from sklearn.impute import SimpleImputer
    
    imputer = SimpleImputer(strategy='mean')  # для числовых данных
    dataset[numerical_columns] = imputer.fit_transform(dataset[numerical_columns])
  3. Заполнение для категориальных данных

    • Для категориальных переменных наиболее часто используемым значением может быть хороший выбор:
    dataset[column].fillna(value=dataset[column].mode()[0], inplace=True)
  4. Использование K ближайших соседей (KNN)

    • Для более сложной импутации можно использовать KNN. Библиотека fancyimpute предоставляет удобный интерфейс для реализации этого метода:
    from fancyimpute import KNN
    
    dataset = pd.DataFrame(KNN(k=5).complete(dataset.values), columns=dataset.columns)

    Здесь вы должны будете выбрать значение k с учетом особенностей вашего набора данных.

Завершение процесса

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

# Визуализация распределения после импутации
import seaborn as sns
import matplotlib.pyplot as plt

sns.histplot(dataset['numerical_column'], kde=True)
plt.show()

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...