Я строю классификационную нейронную сеть для классификации двух разных классов.
Так что это проблема двоичной классификации, я пытаюсь решить эту задачу с помощью нейронной сети с прямой связью.
Но сеть не может научиться, на самом деле, точность никогда не меняется во время обучения.
Я объясню все, что я сделал:
В частности, набор данных состоит из:
- 65673 строк и 22 столбцов.
Один из этих столбцов является целевым классом со значениями (0,1), а остальные 21 являются предикторами. Набор данных сбалансирован таким образом:
- 44% данных (почти 29470 строк принадлежит классу 1)
- 56% данных (почти 36203 строк относятся к классу 0 )
Все данные находятся в диапазоне (0,1), так как они были нормализованы.
Например, просто отображая заголовок набора данных: ![enter image description here](https://i.stack.imgur.com/eE0Av.png)
Как можно видеть, есть также значения NaN, но я не могу удалить его, поскольку внутри других столбцов есть значение 0.
Взгляд также в среднем, стандартное отклонение, мин, макс каждого столбца: ![enter image description here](https://i.stack.imgur.com/s4hjV.png)
Я решил провести корреляционный анализ своих данных и получил:
![enter image description here](https://i.stack.imgur.com/mDPuY.png)
Поскольку цель состоит в том, чтобы классифицировать (или предсказать) целевое значение, как показано в матрице корреляции, столбцы [s, t, u, v, z ], похоже, не коррелирует с целевым столбцом. Кроме того, столбцы:
- [o, m] коррелированы на 0,99
- [q, r] коррелированы на 0,95
Поэтому я также удалил столбец o и столбец q.
И я получил такую ситуацию:
![enter image description here](https://i.stack.imgur.com/qzAfJ.png)
После этого я разделил набор данных, чтобы взять целевой столбец и столбец предикторов :
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?
Кто-то может помочь мне лучше понять эту проблему? Большое спасибо.