Заменить пропущенные значения в категориальных данных

Предположим, у меня есть столбец с категориальными данными "красный", "зеленый", "синий" и пустые ячейки.

red
green
red
blue
NaN

Я уверен, что NaN принадлежит к красно-зеленому синему цвету. Должен ли я заменить NaN на среднее значение цветов или это слишком сильное предположение? Это будет

col1 | col2 | col3
  1      0     0
  0      1     0
  1      0     0
  0      0     1
 0.5    0.25  0.25

Или даже масштабировать последний ряд, но сохраняя соотношение, чтобы эти значения оказали меньшее влияние? Какова лучшая практика?

 0.25  0.125  0.125

3 ответа

Решение

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

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

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

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

Библиотека Scikit-Learn обеспечивает Imputer() класс предварительной обработки, который можно использовать для замены отсутствующих значений. Поскольку это категориальные данные, использование среднего значения в качестве значения замены не рекомендуется. Ты можешь использовать

from sklearn.preprocessing import Imputer
imp = Imputer(missing_values='NaN', strategy='most_frequent', axis=0)

Класс Imputer работает непосредственно с массивом NumPy вместо DataFrame.

И последнее, но не менее важное: алгоритм ALL ML не может обрабатывать пропущенные значения. Разные реализации ML тоже разные.

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

GLRM могут быть использованы из H2O, который обеспечивает связывание для Python и R.

Другие вопросы по тегам