Отсутствующие значения в машинном обучении - PullRequest
28 голосов
/ 20 февраля 2012

Возможно ли иметь пропущенные значения в scikit-learn?Как они должны быть представлены?Я не смог найти никакой документации об этом.

Ответы [ 7 ]

29 голосов
/ 21 февраля 2012

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

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

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

15 голосов
/ 11 июля 2013

Хотелось бы привести простой пример, но я обнаружил, что RandomForestRegressor не изящно обрабатывает NaN. Производительность становится все хуже и хуже при добавлении функций с увеличением процента NaN. Функции, которые имеют «слишком много» NaN, полностью игнорируются, даже если они указывают на очень полезную информацию.

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

Я пробовал различные методы вменения для решения этой проблемы (замените средним / медианным, прогнозируйте пропущенные значения с использованием другой модели и т. Д.), Но результаты были неоднозначными.

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

12 голосов
/ 15 июля 2015

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

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

например:

df['xvariable_missing'] = np.where(df.xvariable.isna(),1,0)
df.xvariable = df.xvariable.fillna(df.xvariable.median())
9 голосов
/ 02 августа 2013

Я столкнулся с очень похожей проблемой при запуске RandomForestRegressor для данных. Наличие значений NA выбрасывало «нан» для прогнозов. Из-за прокручивания нескольких обсуждений Документация Бреймана рекомендует два решения для непрерывных и категориальных данных соответственно.

  1. Рассчитайте медиану данных из столбца (Feature) и используйте это (непрерывные данные)
  2. Определите наиболее часто встречающуюся категорию и используйте ее (Категорические данные)

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

3 голосов
/ 13 июля 2013

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

2 голосов
/ 23 октября 2017

Я сталкиваюсь с этой проблемой.В практическом случае я нашел в R пакет с именем missForest, который может хорошо справиться с этой проблемой, вменяя пропущенное значение и значительно улучшив мой прогноз.

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

Аналогичная опция в python: Foretive_imputer

.
1 голос
/ 11 января 2018

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

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

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

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

На практике, если у вас большое количество входных функций, у вас, вероятно, не может быть «хорошей» стратегии для вменения в конце концов.С точки зрения чистого вменения, лучшая практика не является однозначной.То, что в конкурсе RF, в значительной степени означает использование RF для вменения перед моделированием с ним.

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

...