Как я могу сделать классификацию с категориальными данными, которые не являются фиксированными?


10

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

Например, если мои категорические данные были sexединственно возможными этикетки не было бы female, maleи other, независимо от того , что. Однако моя категориальная переменная такова city, что у человека, которого я пытаюсь предсказать, появится новый город, которого мой классификатор никогда не видел.

Мне интересно, есть ли способ провести классификацию в этих терминах или мне следует повторить тренинг с учетом этих новых категориальных данных.


1
Вы можете преобразовать cityв число на основе какой-либо функции? Как city' = f(latitude, longitude)таким образом, вы можете создать новое значение для любого города
Мохаммад Атар

@MohammadAthar здесь дал идеальное решение, надеюсь, что ОП видит это!
Франческо Пегораро

Ответы:


11

Это очень хороший вопрос; На самом деле эта проблема существует уже давно, и я пока не нашел идеального решения. Еще более чем рад поделиться своим опытом:

  • Избегайте горячего кодирования, насколько это возможно (вопреки тому, что было предложено выше). Причина в том, что это не сработает. Модель с функциями горячего кодирования работает только тогда, когда все эти подуровни были в обучающих данных. Модель не сможет делать предсказания, если она не будет настроена вручную. Если вы выполните поиск, вы обнаружите, что многие люди столкнулись с этой проблемой при разделении своих данных на поезд / тест, и столкнулись с проблемой того, что некоторые подуровни определенной функции не присутствовали в обучающем разделении и впоследствии не смогли сделать прогноз на тесте. Кроме того, если у вас очень много основных характеристик (например, ваш город с, скажем, 200 названиями городов), это излишне увеличит размерность ваших данных! Если по каким-то причинам вам может понадобиться выполнить горячее кодирование, просто помните об этом.
  • Используйте другие методы кодирования . Может быть, попробуйте узнать больше о других методах, которые устойчивы к этой проблеме, по крайней мере в настоящее время, как целевое кодирование, хеширование (см. Некоторые ссылки ниже). Если вы используете Python, есть хороший пакет, предлагающий варианты кодирования mant. Вы можете быть удивлены, увидев, что другие простые методы часто работают просто отлично.

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

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

  • Другие недавние, но еще не зрелые решения, такие как Cat2Vec (заимствованный из Word2Vec от NLP) или Similarity Encoding . Это совсем недавно, проверьте документ для первого и его github и пример (на основе Word2Vec) в Kaggle, и этот документ для последнего и его реализации . Идея первого заключается в преобразовании категорий в векторы. Как бы я ни говорил, действительно имеет смысл работать, но у меня нет опыта его использования. Последний, так называемый dirty_cat , выглядит довольно перспективным и простым в использовании. Достоверно ли иметь невидимую кардинальную категорию в ваших данных испытаний, мне неясно!

PS: Я хотел бы добавить, что идея города с географическим местоположением, приведенная в первом комментарии, действительно хороша, и она на самом деле не сложна, поскольку они представляют собой множество API-интерфейсов Python, например, от Google или HERE, которые позволяют вам это делать. Но следует отметить, что это просто способ создания новых функций и, конечно же, их нельзя заменить самой городской функцией.

Интересные ссылки для проверки первого , второго , третьего , четвертого (без определенного порядка!)

Все вышеперечисленные пункты являются практическими решениями, достаточно конкретно теоретически правильными и, безусловно, подлежат дальнейшему обсуждению. И я более чем счастлив узнать больше.


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

Удовольствие Адитья. Это тоже еще одна отличная идея. Я не знаю о новой «кодировке сходства», возможно, они делают одно и то же. Проверьте их учебник. Также отметим, что нужно быть осторожным, какую кластеризацию использовать для категориальных данных, таких как k-моды, ведь их расстояния не имеют значения, аналогичного числовым значениям.
TwinPenguins

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

Добро пожаловать. О переподготовке: буквально это означает начать все сначала, смешать все ваши данные, убедившись, что у вас есть новые данные, и начать обучение заново. Другой момент, о котором вы упомянули, что у вас нет истинного ярлыка для этой конкретной новой точки данных: это совсем другая история для себя. То, что вы могли бы сделать, чтобы пометить эту точку данных, - это посмотреть, как наиболее похожая точка данных, и взять метку оттуда, как очень простой алгоритм KNN.
TwinPenguins

4

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

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


Начинать с простого и расти оттуда - отличный совет!
Escachator

0

Вы должны проверить Vowpal Wabbit , который обрабатывает очень хорошо новые функции, используя трюк хеширования и адаптивные скорости обучения.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.