#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)?