Занимаясь анализом больших данных, я обнаружил препятствие, которое может разрушить любой процесс анализа данных. Это препятствие известно как значения 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, а не только один столбец.