У меня есть необработанные данные, которые имеют около 20 столбцов (20 функций). Десять из них являются непрерывными данными, а 10 - категориальными. Некоторые из категориальных данных могут иметь около 50 различных значений (штаты США). После предварительной обработки данных 10 непрерывных столбцов превращаются в 10 подготовленных столбцов, а 10 категориальных значений становятся похожими на 200 однозначных закодированных переменных. Я обеспокоен тем, что, если я добавлю все эти 200 + 10 = 210 элементов в нейронную сеть, тогда элементы 200-one-hot (10 категориальных столбцов) будут полностью доминировать над 10-непрерывными объектами.
Возможно, один из методов - «сгруппировать» столбцы вместе или что-то в этом роде. Это действительная проблема, и есть ли какой-либо стандартный способ решения этой проблемы?
(Я использую Keras, хотя я не думаю, что это имеет большое значение.)
Ответы:
Вы можете кодировать категориальные переменные с помощью метода, отличного от one-hot. Бинарные или хеширующие кодеры могут быть подходящими для этого случая. Хеширование, в частности, хорошо, потому что вы кодируете все категории в одно представление для каждого вектора объекта, поэтому ни одна из них не доминирует над другой. Вы также можете указать размер окончательного представления, чтобы можно было хэшировать все категориальные переменные на 10 объектов и получить до 20 числовых объектов (наполовину непрерывных, наполовину категориальных).
И то, и другое реализовано в https://github.com/scikit-learn-contrib/categorical-encoding , или достаточно просто реализовать самостоятельно.
источник
Вы можете использовать вложение, чтобы преобразовать большое количество категориальных переменных в один вектор. Этот сжатый вектор будет распределенным представлением категориальных признаков. Категориальные входные данные будут преобразованы в относительно небольшой вектор длины N с N действительными числами, которые в некотором роде представляют N скрытых признаков, которые описывают все входные данные.
Рассмотрим большое количество слов в английском словаре. Если это число равно N, то мы могли бы представить каждое слово в виде вектора с горячим кодированием длины N. Однако слово-в-век способно собрать практически всю эту информацию в векторе длиной от 200 до 300.
источник