SkLearn - Почему LabelEncoder (). Подходит только для тренировочных данных - PullRequest
0 голосов
/ 11 сентября 2018

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

В частности, на SkLearn, если я хочу LabelEncoder().fit только для данных обучения, есть два разных сценария:

  1. Тестовый набор имеет несколько новых меток по отношению к тренировочному набору.Например, тестовый набор имеет только метки ['USA', 'UK'], а тестовый набор имеет метки ['USA', 'UK', 'France'].Затем, как сообщалось в другом месте (например, Getting ValueError: y содержит новые метки при использовании Scelit Learn LabelEncoder ), вы получаете ошибку, если пытаетесь преобразовать набор тестов в соответствии с этим LabelEncoder(), потому чтоименно это встречает новый лейбл.

  2. Тестовый набор имеет те же ярлыки, что и обучающий набор.Например, как обучающий, так и тестовый набор имеют метки ['USA', 'UK', 'France'].Однако тогда LabelEncoder().fit только для обучающих данных по существу избыточно, поскольку тестовый набор имеет те же известные значения, что и обучающий набор.

Следовательно, в чем смысл LabelEncoder().fit только для данных обучения, а затем LabelEncoder().tranform для данных обучения и испытаний, если в случае (1) это приводит к ошибке, а если в случае (2) это избыточно?

Позвольте мне уточнить, что (довольно хорошо осведомленные) старшие ученые, работающие с данными, которых я видел в LabelEncoder().fit только для обучения данных, объяснили это тем, что набор тестов должен быть совершенно новым даже для самой простой модели, такой как кодировщик, ине следует смешивать в любом случае с данными тренировки.Они ничего не упоминали ни о производственных, ни о словарных целях.

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

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

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

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

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

0 голосов
/ 11 сентября 2018

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

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

В сценарии 1 вам нужно найти решение для обработки неизвестных меток. Один из популярных подходов - сопоставить каждый неизвестный ярлык с токеном unknown. В обработке естественного языка это называется проблемой «вне словаря», и часто используется вышеуказанный подход.

Чтобы сделать это и по-прежнему использовать LabelEncoder(), вы можете предварительно обработать свои данные и выполнить сопоставление самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...