Нейронная сеть предсказывает только один класс — двоичная классификация и сбалансированный набор данных

#machine-learning #keras #neural-network #classification

#машинное обучение #keras #нейронная сеть #классификация

Вопрос:

Цель моей работы — предсказать, будет ли доходность за три месяца по данной акции превышать рыночную (соответственно классы 1 и 0), используя фундаментальные данные в качестве характеристик. Два класса лишь слегка несбалансированы: 0: 7835 наблюдений и 1: 9933 наблюдений (то есть 44,1% и 55,9%). Проблема в том, что моя простая модель предсказывает только положительный класс для всех экземпляров. Как решить проблему? Я уже пытался настроить некоторые гиперпараметры (размер пакета, скорость обучения, количество слоев, количество нейронов на слой), но лучшее, чего я достиг, — это прогнозирование 99% для положительного класса и 1% для другого класса.

Код следующий:

 scaler = MinMaxScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

model = Sequential()
model.add(Dense(10, activation='relu', input_dim=np.array(X_train).shape[1]))
model.add(Dense(10, activation='relu'))
model.add(Dense(1, activation='sigmoid')) 

model.compile(loss='binary_crossentropy', 
         optimizer='adam',
         metrics=['accuracy']) 

history = model.fit(X_train, np.array(y_train), epochs=50)

score = model.evaluate(X_test, y_test, verbose = 1)
  

Входные данные следующие:

 X_train

array([[8.22558113e-01, 2.57404768e-06, 1.89754460e-11, ...,
    1.77373849e-05, 5.68104337e-01, 4.07611328e-04],
   [8.22565854e-01, 2.57497415e-06, 1.33213703e-11, ...,
    1.77373846e-05, 5.68070546e-01, 4.07805946e-04],
   [8.22541701e-01, 2.57229903e-06, 1.36541830e-11, ...,
    1.77373842e-05, 5.30571708e-01, 4.07568375e-04],
   ...,
   [8.22567337e-01, 2.57182629e-06, 1.36476410e-11, ...,
    1.77373846e-05, 5.68054845e-01, 4.07615103e-04],
   [8.22535352e-01, 2.57212835e-06, 1.36486715e-11, ...,
    1.77373849e-05, 5.68030190e-01, 4.07519838e-04],
   [8.22535480e-01, 2.57180477e-06, 1.36460472e-11, ...,
    1.77373837e-05, 5.68007221e-01, 4.07568375e-04]])

y_train

array([[0],
   [1],
   [1],
   ...,
   [1],
   [0],
   [0]])
  

Комментарии:

1. Не могли бы вы распечатать первые несколько строк в y_train? binary_crossentropy требует, чтобы входные данные выдавались как это .

2. Ничто в этом фрагменте кода не вызывает проблемы. Я только что проверил локально. Есть идеи, что еще здесь может быть виновато?

3. Может быть, слишком шумные входные данные? Однако те же данные, которые подаются в лесной классификатор, выдают сбалансированный прогноз.

4. Вы пытались предоставить последнему слою два нейрона и использовать функцию активации softmax. Вам также потребуется одно горячее кодирование меток, чтобы получить вероятности для каждого класса.

5. Как я должен преобразовать вектор метки (формы (14312, 1)) в массив формы (Нет, 2)?