Нейронные сети: одна горячая переменная подавляющая непрерывная?

13

У меня есть необработанные данные, которые имеют около 20 столбцов (20 функций). Десять из них являются непрерывными данными, а 10 - категориальными. Некоторые из категориальных данных могут иметь около 50 различных значений (штаты США). После предварительной обработки данных 10 непрерывных столбцов превращаются в 10 подготовленных столбцов, а 10 категориальных значений становятся похожими на 200 однозначных закодированных переменных. Я обеспокоен тем, что, если я добавлю все эти 200 + 10 = 210 элементов в нейронную сеть, тогда элементы 200-one-hot (10 категориальных столбцов) будут полностью доминировать над 10-непрерывными объектами.

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

(Я использую Keras, хотя я не думаю, что это имеет большое значение.)

user1367204
источник
Рассматривали ли вы использовать две (или более) последовательных моделей, а затем объединить их? У каждой модели есть входные данные, которые лучше соответствуют данным по мере их поступления (в отличие от смешивания их как колбасы). Цели одинаковы, но вы делаете два набора обучающих данных, каждый из которых подается независимо во время подгонки. Сразу после слияния появляется ваш последний выходной слой, так что последний слой принимает решение о том, какая модель лучше всего подходит для конкретных образцов. От keras.io: keras.io/getting-started/sequential-model-guide
photox
Как раз то, что я искал. Спасибо за помощь.
user1367204
Я попробовал это, и val_loss ансамбля (model_1, model_2) был выше, чем val_loss model_1 и выше, чем val_loss model_2.
user1367204
Вы действительно попробовали это и решили, что эта проблема действительно возникает? какие тесты вы делали, чтобы проверить этот момент? каковы были результаты?
Хью Перкинс

Ответы:

5

Вы можете кодировать категориальные переменные с помощью метода, отличного от one-hot. Бинарные или хеширующие кодеры могут быть подходящими для этого случая. Хеширование, в частности, хорошо, потому что вы кодируете все категории в одно представление для каждого вектора объекта, поэтому ни одна из них не доминирует над другой. Вы также можете указать размер окончательного представления, чтобы можно было хэшировать все категориальные переменные на 10 объектов и получить до 20 числовых объектов (наполовину непрерывных, наполовину категориальных).

И то, и другое реализовано в https://github.com/scikit-learn-contrib/categorical-encoding , или достаточно просто реализовать самостоятельно.

Уилл Макгиннис
источник
4

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

Рассмотрим большое количество слов в английском словаре. Если это число равно N, то мы могли бы представить каждое слово в виде вектора с горячим кодированием длины N. Однако слово-в-век способно собрать практически всю эту информацию в векторе длиной от 200 до 300.

ХОЛОДНЫЕ БОБЫ
источник