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

Что такое значения NaN?

NaN или Not a Number - специальные значения в массивах DataFrame и numpy, которые представляют собой отсутствие значения в ячейке. В языках программирования они также представлены, например в Python они представлены как значение None.

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

Чем опасно значение NaN?

Значения NaN опасны по двум причинам:

  • Изменение некоторых показателей в виде средних или медианных значений, что дает ученым неверную информацию.
  • Алгоритмы, реализованные в sklearn, не могут работать с наборами данных, которые имеют такие значения (попробуйте реализовать TreeDecsisionClassifier в наборе данных о сердечных заболеваниях).

Как с ними бороться?

Итак, если значения NaN настолько опасны для работы специалистов по данным, что нам с ними делать? Есть несколько решений:

  • Чтобы стереть строки со значениями NaN. Но это не лучший выбор, потому что таким образом мы теряем информацию, особенно когда мы работаем с небольшими наборами данных.
  • Для вменения значений NaN с помощью определенных методов или значений. Эта статья относится к этим методам.

Есть много способов приписать эти пробелы, и в большинстве случаев специалисты по данным, особенно новички, их не знают. Вот как это сделать:

  • Введите им определенные значения.
  • Внести с помощью специальных показателей, например среднего или медианного.
  • Внести с использованием метода: MICE или KNN.

Итак, давайте посмотрим, как работают все методы и как они влияют на набор данных.

Эксперимент!

Чтобы проверить каждый метод, я выбрал набор данных под названием Набор данных Iris - возможно, самый распространенный набор данных для тестирования в машинном обучении. Я также пробовал эти методы на более крупных и сложных наборах данных, но для некоторых алгоритмов выполнение вменения занимало слишком много времени.

Сначала я сгенерировал для каждого столбца функций в этом наборе данных 15 случайных и уникальных индексов от 0 до 149. Используя эти индексы (для каждого столбца они были сгенерированы отдельно), я изменил значения столбцов на NaN.

И после применения каждого метода к этим значениям NaN я использовал среднеквадратичную ошибку (MSE), чтобы проверить «точность» каждого метода.

Итак, начнем.

Метод 1: Расчет с конкретными значениями.

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

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

Как видите, заполнение значений NaN нулем сильно влияет на столбцы, в которых значение 0 невозможно. Это сильно повлияет на пространство в зависимости от используемых алгоритмов, особенно KNN и TreeDecissionClassifier.

Подсказка: мы можем проверить, является ли ноль хорошим выбором, применив функцию .describe () к нашему фреймворку данных. Если минимальное значение равно 0, это может быть хорошим выбором, если нет, вам следует выбрать другой вариант.

Метод 2: вменение показателей.

Вменения метрик - это способ заполнить значения NaN некоторыми специальными метриками, которые зависят от ваших данных: например, средним или медианным.

Среднее значение - это сумма значения в серии, деленная на количество всех значений в серии. Это один из наиболее часто используемых типов показателей в статистике. Но почему мы приписываем значения NaN среднему значению? Среднее имеет очень интересное свойство, оно не изменится, если вы добавите в ряд еще несколько средних значений.

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

Среднее значение делит числа на 2 половины с равным количеством выборок. Иногда в статистическом анализе медиана более информативна, чем среднее значение, потому что она не так сильно искажена новыми значениями. В нормальном распределении (которого на самом деле не существует) среднее и медианное значения равны.

Из-за того, что нормальных распределений нет, в большинстве случаев среднее значение и медианное значение очень близки друг к другу.

Из приведенного выше графика видно, как работает медиана. Если вы внимательно посмотрите, все звезды (значение, которое было условно) выровнены по 2 ортогональным линиям (5,6 для sepal_lenght и 3,0 для sepal_width).

Метод 3: присвоение KNN

Этот алгоритм вменения очень похож на KNearesNeighbours из sklearn. Он находит k выборок из набора данных, ближайших к выборке со значением NaN, и присваивает ему среднее значение этих выборок.

Этот метод реализован в библиотеках impyute и sklearn (когда я начинал писать эту статью, я не знал о реализации sklearn.)

На графике выше мы видим критическую ошибку - размещение образца из красного класса в сине-зеленой зоне (это известная реализация с 3 соседями).

Метод 4: приписывание MICE

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

Мы видим, что на графике выше это не сильно влияет на представление набора данных на 2D-графике. Но почему?

Вменения KNN и MICE используют весь набор данных для замены значения NaN, в то время как медиана и среднее значение используют только столбец с пропущенным значением, поэтому последние 2 алгоритма не сильно влияют на структуру набора данных и не изменяют его информацию.

Но что говорят цифры?

Последнее слово за цифрами. Чтобы узнать, насколько хорошо работают упомянутые выше методы, я использую MSE (среднеквадратичную ошибку). Я вычислил значения MSE между исходными значениями и теми, которые были рассчитаны.

В приведенной выше таблице показаны MSE для каждого метода (в KNN и MICE я использовал 2 версии: одна включает целевое значение (с y), а вторая не включает его).

Ниже показано, какой алгоритм работал лучше всего для какого столбца.

  • sepal_length - MICE_y
  • sepal_width - KNN4_y
  • petal_length - MICE
  • petal_width - MICE

Как я и думал, в большинстве случаев MICE работал хорошо.

Последние слова!

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

Спасибо за чтение!