Нейронная сеть регрессии, когда выход несбалансирован - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь выполнить регрессию с использованием нейронной сети для прогнозирования одного выхода из 146 входных функций.

Я применил стандартное масштабирование ко всем входам и выходам.

Я отслеживаю среднюю абсолютную ошибку после тренировки, и она неоправданно высока в поездах, валидации и тестовых наборах (я даже не переоснащаюсь).

Я подозреваю, что это связано с тем, что выходная переменная очень не сбалансирована (см. Гистограмму). Из гистограммы можно увидеть, что большинство выборок сгруппированы около 0, но есть и другая небольшая группа выборок около -5.

Гистограмма несбалансированного выхода

Это код создания модели:

input = Input(batch_shape=(None, X.shape[1]))
layer1 = Dense(20, activation='relu')(input)
layer1 = Dropout(0.3)( layer1)
layer1 = BatchNormalization()(layer1)
layer2 = Dense(5, activation='relu',
               kernel_regularizer='l2')(layer1)
layer2 = Dropout(0.3)(layer2)
layer2 = BatchNormalization()(layer2)
out_layer = Dense(1, activation='linear')(layer2)
model = Model(inputs=input, outputs=out_layer)
model.compile(loss='mean_squared_error', optimizer=optimizers.adam() 
, metrics=['mae'])

Это сводка модели:

Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 146)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 20)                2940      
_________________________________________________________________
dropout_1 (Dropout)          (None, 20)                0         
_________________________________________________________________
batch_normalization_1 (Batch (None, 20)                80        
_________________________________________________________________
dense_2 (Dense)              (None, 5)                 105       
_________________________________________________________________
dropout_2 (Dropout)          (None, 5)                 0         
_________________________________________________________________
batch_normalization_2 (Batch (None, 5)                 20        
_________________________________________________________________
dense_3 (Dense)              (None, 1)                 6         
=================================================================
Total params: 3,151
Trainable params: 3,101
Non-trainable params: 50
_________________________________________________________________

Глядя на фактические предсказания модели, большая ошибка в основном происходит для выборок с истинным выходным значением около -5 (небольшая группа выборок).

Я перепробовал много конфигураций для гиперпараметров, но все равно ошибка очень высока.

Я вижу много предложений по выполнению классификации нейронных сетей на несбалансированных данных, но что можно сделать с регрессией? Мне кажется странным, что регрессионная нейронная сеть не изучает это правильно. Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 04 января 2019

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

0 голосов
/ 04 сентября 2018

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

Вы должны провести некоторое исследование того, что люди делают, чтобы предсказать редкие события или классифицировать входы, когда некоторые классы редки. Например. эта дискуссия может быть полезна: https://www.reddit.com/r/MachineLearning/comments/412wpp/predicting_rare_events_how_to_prevent_machine/

Некоторые стратегии, которые вы можете попробовать, включают

  • Удаление большинства примеров тренировок с нулевым результатом, чтобы ваши тренировочные данные были более сбалансированными
  • Создание или приобретение большего количества ненулевых обучающих примеров
  • Использование другого алгоритма машинного обучения (кто-то по указанной мной ссылке рекомендует повысить. Интересно, получите ли вы хорошие результаты от использования остаточной структуры нейронной сети, которая в чем-то похожа на повышение)
  • Перестройка или изменение масштаба данных для увеличения веса редких значений

Надеюсь, это поможет!

...