Подтвердить что ты не робот

Отсутствующие ценности в обучении машинам scikits

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

например:

df['xvariable_missing'] = np.where(df.xvariable.isna(),1,0)
df.xvariable = df.xvariable(df.xvariable.median())

Ответ 4

Я столкнулся с очень похожими проблемами при запуске RandomForestRegressor по данным. Присутствие значений NA выбрасывало "nan" для предсказаний. При прокрутке нескольких обсуждений документация Бреймана рекомендует два решения для непрерывных и категориальных данных соответственно.

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

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

Ответ 5

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

Ответ 6

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

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

Аналогичная опция в Python - предикатив

Ответ 7

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

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

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

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

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

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