2012-02-20 3 views

ответ

25

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

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

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

+0

Я просто хотел отметить, что randomforest отлично справляется с нанными значениями –

+0

Это все еще в случае с GBM? Есть ли причина, по которой версия для изучения scikit не отражает кодирование в R, которое изящно издает недостающие значения? Это одна из привлекательных особенностей этого алгоритма, и я бы хотел, чтобы он был закодирован как таковой в scikit. –

+0

@B_Miner: это касается практически всех оценок scikit-learn. Отсутствие обработки значений выполняется отдельно от обучения, но два могут быть объединены с использованием «Pipeline». –

11

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

AFAIK алгоритм никогда не будет создавать разделение на решение «isnan» или «ismissing». Алгоритм будет игнорировать функцию на определенном уровне дерева, если функция имеет только одно известное значение, а остальные значения функции - nan/unknown.

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

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

+0

Отличная идея использовать значения «явно вне диапазона» для отсутствующих значений. Это должно хорошо работать для деревьев принятия решений. – pansen

3

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

+2

Ссылка больше не действительна. Я думаю, что текущий URL-адрес: http://docs.orange.biolab.si/reference/rst/Orange.feature.imput.html. – JustAC0der

+0

Да, вы правы. Исправлена. –

8

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

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

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

8

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

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

+1

Правда. Кроме того, во многих случаях данные могут быть очень сильно NULL (скажем, 20% каждой строки заполнено). Метод, основанный на DT, должен иметь возможность размыть его - и если он будет использоваться правильно, модель может быть намного лучше, чем одна с вмененными данными. – user48956

+0

@Johnny V Что вы подразумеваете под «моделью с отдельным правилом»? – KouchakYazdi

+0

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

1

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

1

Когда вы сталкиваетесь с отсутствующими значениями функций ввода, первый порядок ведения бизнеса заключается не в том, как приписывать недостающие. Самый важный вопрос - ПОЧЕМУ СЛЕДУЕТ. Если у вас нет четкого и окончательного ума, какова истинная реальность данных, вы можете ограничить желание притеснять. Прежде всего, речь идет не о технике или упаковке.

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

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

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

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

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

Смежные вопросы