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

Почему необходимо иметь дело с отсутствующими данными?

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

Причины отсутствия значений

Вы когда-нибудь задумывались, почему некоторые записи в наборе данных отсутствуют?

Ниже приведены некоторые из возможных объяснений отсутствия данных:

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

Загрузить в набор данных

Этот набор данных был получен с http://archive.ics.uci.edu/ml/machine-learning-databases/credit-screening/crx.data с некоторыми изменениями.

import pandas as pd
df = pd.read_csv("creditApprovalUCI.csv")
df

Это дает нам следующий результат:

Давайте выясним, сколько значений каждой переменной отсутствует, и расположим их в порядке возрастания:

df.isnull().sum().sort_values(ascending=True)

Вот что выдает приведенный выше код:

Мы использовали методы isnull() и sum() в пандах, чтобы выяснить, сколько наблюдений пропущено для каждой переменной.

Удалить недостающие данные

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

Чтобы избавиться от строк, в которых отсутствует хотя бы одно значение в строке, введите следующее:

df_clean=df.dropna()
df_clean

Это приводит к чистому DataFrame, в котором отсутствуют какие-либо отсутствующие данные, и, как мы видим в нижней части вывода DataFrame, теперь осталось всего 564 строки (из начальных 690 строк).

Вменение с использованием среднего или медианы

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

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

# Import the required library
from sklearn.model_selection import train_test_split from sklearn.impute import SimpleImputer

При вменении средних и медианных значений средние или медианные значения должны рассчитываться с использованием переменных в наборе поездов; следовательно, давайте разделим данные на наборы поездов и наборы тестов вместе с их соответствующими целями, сохранив только числовые переменные:

X_train, X_test, y_train, y_test = train_test_split(
df[['A2', 'A3', 'A8', 'A11','A14','A15','A16']], data['A16'], test_size=0.3,random_state=42
)

Давайте проверим, сколько из этих значений отсутствует в наборе поездов:

X_train.isnull().sum()

Используя функцию SimpleImputer(), доступную в scikit-learn, давайте создадим преобразователь медианного вменения:

simple_imputer = SimpleImputer(strategy='median')

Чтобы выполнить вменение среднего, нам нужно указать SimpleImputer() использовать стратегию среднего, которая выглядит следующим образом:

simple_ imputer = SimpleImputer (стратегия = «среднее»).

Давайте настроим SimpleImputer(), чтобы он мог узнать медианные значения переменных, подгоняя его к набору поездов:

simple_imputer.fit(X_train)

Давайте заполним пробелы медианами вместо пропущенных значений:

X_train = simple_imputer.transform(X_train)
X_test  = simple_imputer.transform(X_test)

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

Давайте проверим данные поезда, чтобы увидеть, есть ли пропущенное значение.

pd.DataFrame(data=X_train,columns = ['A2', 'A3', 'A8', 'A11','A14','A15','A16']).isnull().sum()

SimpleImputer() возвращает массивы NumPy. Мы можем преобразовать массив в фрейм данных, используя pd.DataFrame(X_train, columns = [‘A2’, ‘A3’, ‘A8’, ‘A11’, ‘A14’, ‘A15’, ‘A16’]).

Применение либо режима, либо частого вменения категории

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

`# Load the dataset
import pandas as pd
df = pd.read_csv("creditApprovalUCI.csv")

Создайте набор поездов и тестовый набор из исходного набора данных и сохраните только категориальные переменные:

Используйте функцию SimpleImputer(), доступную в scikit-learn, для создания частого импутера категории:

simple_imputer = SimpleImputer(strategy='most_frequent')

Подберите импутер к набору поездов, чтобы он изучил наиболее часто встречающиеся значения:

simple_imputer.fit(X_train)

Ниже приведены значения, которые чаще всего встречаются импутером для категориальных столбцов: A1,A4,A5,A6,A7,A9,A10,A12,A13.

>>> simple_imputer.statistics_
Output :
array(['b', 'u', 'g', 'c', 'v', 't', 'f', 'f', 'g'], dtype=object)

Замените отсутствующие значения частыми категориями:

X_train = simple_imputer.transform(X_train)
X_test = simple_imputer.transform(X_test)

Мы можем убедиться, что в данных нет пропущенных значений.

pd.DataFrame(data=X_train,columns=['A1','A4', 'A5', 'A6', 'A7','A9','A10','A12','A13']).isnull().sum()

Обратите внимание, что SimpleImputer() возвращает массив NumPy, а не кадр данных pandas.

A1     0 
A4     0 
A5     0 
A6     0 
A7     0 
A9     0 
A10    0 
A12    0 
A13    0 
dtype: int64

Мы разделили данные на обучающие и тестовые наборы, но сохранили только категориальные переменные, чтобы scikit-learn мог заполнить недостающие значения. Затем мы настраиваем SimpleImputer() и используем в стратегии наиболее часто встречающийся метод вменения. С помощью метода fit() импутер изучил и сохранил в своем атрибуте statistics_ категории, которые использовались чаще всего. С помощью метода transform() изученная статистика использовалась для заполнения отсутствующих значений в обучающих и тестовых наборах. Этот метод возвращал массивы NumPy.

Замена отсутствующих данных случайным числом

Процесс замены отсутствующих данных произвольными значениями — это то, что подразумевается под термином «вменение произвольных чисел». При работе с положительными распределениями часто используются значения 999, 9999 или -1. Этот подход хорошо работает с переменными, имеющими числовые значения.

# Load the data
import pandas as pd
df = pd.read_csv("creditApprovalUCI.csv")

Создайте два разных набора данных, один для обучения и один для тестирования, сохранив при этом только числовые переменные:

X_train, X_test, y_train, y_test = train_test_split(
    data[['A2', 'A3', 'A8', 'A11']], data['A16'], test_size=0.3,
    random_state=42
)

Настройте SimpleImputer() таким образом, чтобы он заменял 99 любыми отсутствующими значениями:

simple_imputer = SimpleImputer(strategy='constant', fill_value=99)

Примечание-› Если ваш набор данных содержит категориальные переменные, SimpleImputer() также добавит 99 к любым отсутствующим значениям в этих переменных, если таковые имеются.

Подгоним импьютер к набору поездов:

simple_imputer.fit(X_train)

Заменим отсутствующие значения на 99:

X_train = simple_imputer.transform(X_train)
X_test = simple_imputer.transform(X_test)

Надеюсь, эта статья оказалась для вас полезной и вы узнали что-то новое ❤

Похлопайте, если вам понравилась эта статья, и подпишитесь на другие материалы, подобные этой.

Другие статьи:









Ссылка :

Поваренная книга по разработке функций Python, автор Соледад Галли