Как бороться со смесью двоичных и непрерывных входов в нейронных сетях?

14

Я использую пакет nnet в R, чтобы попытаться построить ANN для прогнозирования цен на недвижимость для квартир (личный проект). Я новичок в этом и не имею математического образования, поэтому, пожалуйста, держись со мной.

У меня есть входные переменные, которые являются двоичными и непрерывными. Например, некоторые двоичные переменные, которые изначально были да / нет, были преобразованы в 1/0 для нейронной сети. Другие переменные являются непрерывными, как Sqft.

Образец входных данных

Я нормализовал все значения по шкале 0-1. Может быть Bedroomsи Bathroomsне следует нормализовать, поскольку их диапазон составляет всего 0-4?

Эти смешанные входы представляют проблему для ANN? Я получил хорошие результаты, но при ближайшем рассмотрении веса, которые ANN выбрал для определенных переменных, кажется, не имеют смысла. Мой код ниже, какие-либо предложения?

ANN <- nnet(Price ~ Sqft + Bedrooms + Bathrooms + Parking2 + Elevator + 
            Central.AC + Terrace + Washer.Dryer + Doorman + Exercise.Room + 
            New.York.View,data[1:700,], size=3, maxit=5000, linout=TRUE, decay=.0001)

ОБНОВЛЕНИЕ: Основываясь на комментариях ниже относительно разделения двоичных входных данных на отдельные поля для каждого класса значений, мой код теперь выглядит следующим образом:

ANN <- nnet(Price ~ Sqft + Studio + X1BR + X2BR + X3BR + X4BR + X1Bath
        + X2Bath + X3Bath + X4bath + Parking.Yes + Parking.No + Elevator.Yes + Elevator.No 
        + Central.AC.Yes + Central.AC.No + Terrace.Yes + Terrace.No + Washer.Dryer.Yes 
        + Washer.Dryer.No + Doorman.Yes + Doorman.No + Exercise.Room.Yes + Exercise.Room.No 
        + New.York.View.Yes + New.York.View.No + Healtch.Club.Yes + Health.Club.No,
    data[1:700,], size=12, maxit=50000, decay=.0001)

Скрытых узлов в приведенном выше коде 12, но я пробовал диапазон скрытых узлов от 3 до 25, и все они дают худшие результаты, чем исходные параметры, которые я имел выше в исходном опубликованном коде. Я также попробовал это с линейным выводом = true / false.

Я предполагаю, что мне нужно передать данные в nnet другим способом, потому что он неправильно интерпретирует двоичный ввод. Либо так, либо мне нужно дать ему другие параметры.

Есть идеи?

ChrisArmstrong
источник
1
Стандартный способ использования двоичных или категориальных данных в качестве входных данных нейронной сети состоит в расширении поля до векторов-индикаторов. Например, если у вас есть поле, которое может принимать значения 1,2 или 3, то значение 1 будет расширено до [1,0,0], 2 -> [0,1,0] и 3 -> [ 0,0,1]. Вещественный вклад обычно сохраняется как есть.
user1149913
1
Теперь, когда вы упомянули об этом, я, кажется, вспомнил, что читал это где-то во время поиска ответа. Так как источник информации находится в CSV-файле, мне действительно нужно добавить столбцы для размещения новых полей для каждого двоичного ввода? Например, если вход в спальню колеблется от 0 до 4, используя приведенный выше пример, я бы создал 4 дополнительных столбца (всего 5, так как «0» означает «студия»), а кондо 3BR будет выражено как 0,0,0,1 , 0?
ChrisArmstrong

Ответы:

8

Один из способов справиться с этой ситуацией - изменить масштаб входных данных, чтобы их отклонения были примерно в одном масштабе. Этот совет обычно дается для регрессионного моделирования, но он действительно применим ко всем ситуациям моделирования, в которых используются переменные, измеренные в разных масштабах. Это потому, что дисперсия двоичной переменной часто сильно отличается от дисперсии непрерывной переменной. Гельман и Хилл (2006) рекомендуют масштабировать непрерывные входы на два стандартных отклонения, чтобы получить паритет с (немасштабированными) двоичными входами. Эта рекомендация также отражена в статье и посте в блоге .

Более конкретная рекомендация для нейронных сетей состоит в том, чтобы использовать «кодирование эффекта» для двоичных входов (то есть -1 и 1) вместо «фиктивного кодирования» (0 и 1), и сделать дополнительный шаг центрирования непрерывных переменных. Эти рекомендации взяты из обширного FAQ Уоррена Сарла, в частности из разделов «Почему бы не кодировать двоичные входы как 0 и 1?» и "Должен ли я стандартизировать входные переменные?" Суть, однако, та же:

Вклад входа будет сильно зависеть от его изменчивости относительно других входов.

Что касается неупорядоченных категориальных переменных - вы должны разбить их на двоичные показатели. Они просто не имеют смысла в противном случае.

shadowtalker
источник
1
Но смотрите также stats.stackexchange.com/questions/398779/… и stats.stackexchange.com/questions/231285/…
kjetil b halvorsen