Я использую пакет 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 другим способом, потому что он неправильно интерпретирует двоичный ввод. Либо так, либо мне нужно дать ему другие параметры.
Есть идеи?
источник
Ответы:
Один из способов справиться с этой ситуацией - изменить масштаб входных данных, чтобы их отклонения были примерно в одном масштабе. Этот совет обычно дается для регрессионного моделирования, но он действительно применим ко всем ситуациям моделирования, в которых используются переменные, измеренные в разных масштабах. Это потому, что дисперсия двоичной переменной часто сильно отличается от дисперсии непрерывной переменной. Гельман и Хилл (2006) рекомендуют масштабировать непрерывные входы на два стандартных отклонения, чтобы получить паритет с (немасштабированными) двоичными входами. Эта рекомендация также отражена в статье и посте в блоге .
Более конкретная рекомендация для нейронных сетей состоит в том, чтобы использовать «кодирование эффекта» для двоичных входов (то есть -1 и 1) вместо «фиктивного кодирования» (0 и 1), и сделать дополнительный шаг центрирования непрерывных переменных. Эти рекомендации взяты из обширного FAQ Уоррена Сарла, в частности из разделов «Почему бы не кодировать двоичные входы как 0 и 1?» и "Должен ли я стандартизировать входные переменные?" Суть, однако, та же:
Что касается неупорядоченных категориальных переменных - вы должны разбить их на двоичные показатели. Они просто не имеют смысла в противном случае.
источник