Классификация нейронной сети не учится - PullRequest
0 голосов
/ 25 февраля 2020

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

Так что это проблема двоичной классификации, я пытаюсь решить эту задачу с помощью нейронной сети с прямой связью.

Но сеть не может научиться, на самом деле, точность никогда не меняется во время обучения.

Я объясню все, что я сделал:

В частности, набор данных состоит из:

  • 65673 строк и 22 столбцов.

Один из этих столбцов является целевым классом со значениями (0,1), а остальные 21 являются предикторами. Набор данных сбалансирован таким образом:

  • 44% данных (почти 29470 строк принадлежит классу 1)
  • 56% данных (почти 36203 строк относятся к классу 0 )

Все данные находятся в диапазоне (0,1), так как они были нормализованы.

Например, просто отображая заголовок набора данных: enter image description here

Как можно видеть, есть также значения NaN, но я не могу удалить его, поскольку внутри других столбцов есть значение 0.

Взгляд также в среднем, стандартное отклонение, мин, макс каждого столбца: enter image description here

Я решил провести корреляционный анализ своих данных и получил:

enter image description here

Поскольку цель состоит в том, чтобы классифицировать (или предсказать) целевое значение, как показано в матрице корреляции, столбцы [s, t, u, v, z ], похоже, не коррелирует с целевым столбцом. Кроме того, столбцы:

  • [o, m] коррелированы на 0,99
  • [q, r] коррелированы на 0,95

Поэтому я также удалил столбец o и столбец q.

И я получил такую ​​ситуацию:

enter image description here

После этого я разделил набор данных, чтобы взять целевой столбец и столбец предикторов :

X= dataset.iloc[:,1:dataset.shape[1]]
y= dataset.iloc[:,0]

И создал и установил модель:

from keras.optimizers import Adam
from keras.layers import ReLU

model = Sequential()

model.add(Dense(X.shape[1], kernel_initializer='random_uniform',input_shape=(X.shape[1],)))
model.add(ReLU())
model.add(Dropout(0.1))
model.add(Dense(8))
model.add(ReLU())
model.add(Dropout(0.1))
model.add(Dense(4))
model.add(ReLU())
model.add(Dropout(0.1))
model.add(Dense(1, activation='sigmoid'))


opt = Adam(lr=0.00001, beta_1=0.9, beta_2=0.999, amsgrad=False)
model.compile(loss="binary_crossentropy", optimizer = opt, metrics=["accuracy"])
model.fit(X,y, batch_size=64, epochs=100, validation_split=0.25)

Результаты, которые я получил, всегда таковы:

Поезд на 49254 образцах, проверка на 16419 выборок

эпоха 1/100 49254/49254 [=============================] - 5 с 100 мс / шаг - потеря: 0,6930 - cc: 0,5513 - val_loss: 0,6929 - val_a cc: 0,5503

Epoch 2/100 49254/49254 [=========== ===================] - 2s 48us / step - потеря: 0.6927 - a cc: 0.5516 - val_loss: 0.6926 - val_a cc: 0.5503

Epoch 3/100 49254/49254 [==============================] - 2s 48us / step - потеря: 0.6925 - a cc: 0.5516 - val_loss: 0.6924 - val_a cc: 0.5503

Epoch 4/100 49254/49254 [================= =============] - 2s 48us / step - потеря: 0.6922 - cc: 0.5516 - val_loss: 0.6921 - val_a cc: 0.5503 * 10 78 *

Epoch 5/100 49254/49254 [=============================] - 2s 47us / step - потеря: 0.6920 - a cc: 0.5516 - val_loss: 0.6919 - val_a cc: 0.5503

Epoch 6/100 49254/49254 [=============== ===============] - 2s 47us / step - потеря: 0.6917 - a cc: 0.5516 - val_loss: 0.6917 - val_a cc: 0.5503

Epoch 7/100 49254/49254 [====================================] - 2s 48us / step - потеря: 0.6915 - a cc: 0,5516 - val_loss: 0,6914 - val_a cc: 0,5503

Epoch 8/100 49254/49254 [===================== =========] - 2s 49us / step - потеря: 0.6913 - a cc: 0.5516 - val_loss: 0.6912 - val_a cc: 0.5503

Epoch 9/100 49254/49254 [==============================] - 2 с 48 мкс / шаг - потеря: 0,6911 - cc: 0,5516 - val_loss : 0.6910 - val_a cc: 0.5503

Epoch 10/100 49254/49254 [========================== ===] - 2 с 48 мкс / шаг - потеря: 0,6909 - a cc: 0,5516 - val_loss: 0,6908 - val_a cc: 0,5503

. , .

Epoch 98/100 49254/49254 [=============================] - 2s 49us / шаг - потеря: 0,6878 - a cc: 0,5516 - val_loss: 0,6881 - val_a cc: 0,5503

Epoch 99/100 49254/49254 [==============================] - 2s 49us / step - потеря: 0.6878 - a cc: 0.5516 - val_loss: 0.6881 - val_a cc: 0.5503

Epoch 100/100 49254/49254 [================= =============] - 2 с 49 мкс / шаг - потеря: 0,6878 - cc: 0,5516 - val_loss: 0,6881 - val_a cc: 0,5503

Как вы можете видеть, точность всегда остается неизменной, это единственная модель, в которой я могу видеть некоторые изменения в функции потерь.

Что я пытался сделать:

  • Использование Sigmoid функция активации во всех слоях
  • Увеличение количества узлов и количества скрытых слоев
  • Добавление штрафа l2 во всех слоях
  • Использование разной скорости обучения (от 0,01 до 0,000001 )
  • Уменьшить или увеличить batch_size

Но во всех случаях результат был одинаковым или даже хуже.

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

Я не знаю, что я могу сделать, чтобы решить эту проблему, я пытался понять, связана ли проблема с весами сети или проблема в самих данных.

Поскольку этот набор данных был построен путем взятия выборки строк данных разных дней, может быть, лучше использовать RNN?

Также о нормализации Правильно ли их нормализовать в соответствии с нормализацией min_max?

Кто-то может помочь мне лучше понять эту проблему? Большое спасибо.

1 Ответ

1 голос
/ 25 февраля 2020

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

Как минимум, сделайте следующее:

  • Увеличьте скорость обучения до 0,001
  • Увеличьте количество нейронов до 16, 32 (и почему бы не добавить третью слой 64)

Вы также можете увеличить выпадение до 0,5, потому что 0,1 недостаточно. Это не источник ваших проблем, однако. Я бы, конечно, попытался определить оптимальную стратегию вменения, чтобы справиться с пропущенными значениями.

...