У меня есть проблема классификации с категориальными и числовыми данными. Проблема, с которой я сталкиваюсь, заключается в том, что мои категориальные данные не являются фиксированными, это означает, что у нового кандидата, метка которого я хочу предсказать, может быть новая категория, которая ранее не наблюдалась.
Например, если мои категорические данные были sex
единственно возможными этикетки не было бы female
, male
и other
, независимо от того , что. Однако моя категориальная переменная такова city
, что у человека, которого я пытаюсь предсказать, появится новый город, которого мой классификатор никогда не видел.
Мне интересно, есть ли способ провести классификацию в этих терминах или мне следует повторить тренинг с учетом этих новых категориальных данных.
city
в число на основе какой-либо функции? Какcity' = f(latitude, longitude)
таким образом, вы можете создать новое значение для любого городаОтветы:
Это очень хороший вопрос; На самом деле эта проблема существует уже давно, и я пока не нашел идеального решения. Еще более чем рад поделиться своим опытом:
Используйте другие методы кодирования . Может быть, попробуйте узнать больше о других методах, которые устойчивы к этой проблеме, по крайней мере в настоящее время, как целевое кодирование, хеширование (см. Некоторые ссылки ниже). Если вы используете Python, есть хороший пакет, предлагающий варианты кодирования mant. Вы можете быть удивлены, увидев, что другие простые методы часто работают просто отлично.
Восстанови свою модель . Теоретически, при обучении ваш поезд / набор должен был иметь такое же распределение (в основном это рассматривается как целевое распределение, но может быть верно и для переменных). Теперь, когда в игру вступают новые предметы, ваше тестовое (невидимое) распределение данных изменилось. Тогда лучше переучить модель еще раз, чтобы эти новые города были учтены.
Поместите недавно добавленные подкатегории (и наименее часто встречающиеся) в другие . Хотя более ранняя точка теоретически верна, весьма вероятно, что распределение тестов (этой конкретной категории) не изменится столь кардинально в большинстве случаев, например, очень немногие элементы входят в число категорий в обучающем наборе. Возможно, как и в вашем случае, у вас может быть 100 городов в черте города, и лишь немногие новые появляются со временем. Что я хотел бы рассмотреть, так это посмотреть на X-квантиль «давайте» этой конкретной категории и поместить наименее частые в подкатегорию « Другие» . Предполагая, что ваша недавно добавленная точка данных очень мала, она очень сильно уйдет в другиегруппа. Делая это, вы, безусловно, потеряете уровень детализации, но еще раз смысл обучения заключается в том, что не только ваша модель изучает обучающие данные, но, что наиболее важно, уметь очень хорошо обобщать невидимые данные и, если эти новые добавленные категории являются точками данных, группировка их в группу Других не повредит.
Другие недавние, но еще не зрелые решения, такие как Cat2Vec (заимствованный из Word2Vec от NLP) или Similarity Encoding . Это совсем недавно, проверьте документ для первого и его github и пример (на основе Word2Vec) в Kaggle, и этот документ для последнего и его реализации . Идея первого заключается в преобразовании категорий в векторы. Как бы я ни говорил, действительно имеет смысл работать, но у меня нет опыта его использования. Последний, так называемый dirty_cat , выглядит довольно перспективным и простым в использовании. Достоверно ли иметь невидимую кардинальную категорию в ваших данных испытаний, мне неясно!
PS: Я хотел бы добавить, что идея города с географическим местоположением, приведенная в первом комментарии, действительно хороша, и она на самом деле не сложна, поскольку они представляют собой множество API-интерфейсов Python, например, от Google или HERE, которые позволяют вам это делать. Но следует отметить, что это просто способ создания новых функций и, конечно же, их нельзя заменить самой городской функцией.
Интересные ссылки для проверки первого , второго , третьего , четвертого (без определенного порядка!)
Все вышеперечисленные пункты являются практическими решениями, достаточно конкретно теоретически правильными и, безусловно, подлежат дальнейшему обсуждению. И я более чем счастлив узнать больше.
источник
Простейшая вещь, которую нужно сделать (обычно это хорошее место для начала) - просто закодировать ваши города одним касанием, где каждый город становится отдельной функцией и имеет значения либо 1 (человек из этого города), либо 0 (не из этот город). Если в тестовом наборе появляется новый город, которого нет в обучающем наборе, у этого человека будут только 0 для всех городов в обучающем наборе. Это может показаться странным, но, если этот город не находится в тренировочном комплексе, тогда не должно быть никакого веса, если человек находится в этом городе.
Следующим шагом будет то, что предложил Мохаммад Атар, и получить представление о географической близости к другим городам в вашем тренировочном комплексе. Это будет намного сложнее, поэтому я позволю кому-то еще прокомментировать это.
источник
Вы должны проверить Vowpal Wabbit , который обрабатывает очень хорошо новые функции, используя трюк хеширования и адаптивные скорости обучения.
Он не только не потерпит крах, когда появятся новые функции (в поезде или во время тестирования), но также начнет обновлять свои веса. Кроме того, это быстро. Он реализует только варианты линейной модели, поэтому вы ограничены в этой части. Очень мощный инструмент, чтобы знать о
источник