Регрессионная модель Keras с 3 выходами дает точные результаты только для одного - PullRequest
2 голосов
/ 09 апреля 2019

Я пытаюсь запустить нейронную сеть, используя keras в python, который имеет в качестве входов 2 значения и выходы 3. Входы представляют собой собственные частоты, а выходы представляют эквивалентную ледяную нагрузку. Проблема в том, что после того, как модель завершает свое обучение, кажется, что она обучена только для прогнозирования одного входа, а не всех трех. Модель является регрессией, а не классификацией. Здесь я представляю свой код

seed = 9
np.random.seed(seed)
# import dataset
dataset=np.loadtxt("Final_test_matrix_new_3_digits.csv", delimiter=",")
# Define dataset
Y=dataset[:, 0:3]
X=dataset[:, 3:5]
#Categorize data
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.3, 
random_state = seed)
# create model
model = Sequential()
model.add(Dense(12, input_dim=2,activation='relu'))
model.add(Dense(8, init='uniform', activation='relu'))
model.add(Dense(8, init='uniform', activation='relu'))
model.add(Dense(3, init='uniform', activation='relu'))
# compile the model
model.compile(loss='mean_squared_logarithmic_error', optimizer='adam', 
metrics=['accuracy'])
# checkpoint
filepath="weights.best_12_8_8_neurons.hdf5"
checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, 
save_best_only=True, mode='max')
callbacks_list = [checkpoint]
# fit the model
history=model.fit(X_train, Y_train, validation_split=0.1, epochs=100000, 
batch_size=10,callbacks=callbacks_list)
# evaluate the model
scores = model.evaluate(X_test, Y_test)
print ("Accuracy: %.2f%%" %(scores[1]*100))

Точность модели, согласно Python, составляет 65%, но этот факт не влияет на точность выходов, поскольку точность второго выхода ниже, чем первого, а точность третьего выхода равна почти 0. Основная цель кода - создать регрессионную модель, в которой все выходные данные будут иметь одинаковую точность. Далее показаны точность модели, потери модели и прогнозы для каждого из выходных сигналов соответственно: Model loss model accuracy Output 1 prediction Output 2 prediction Output 3 prediction

1 Ответ

0 голосов
/ 09 апреля 2019

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

В качестве обходного пути вы можете увеличить количество узлов в ваших Dense(8) слоях, что будет зависеть от дисперсии ваших данных.

Затем необходимо проверить классы меньшинства и адаптировать следующий код (методика избыточной выборки синтетического меньшинства):

from imblearn.over_sampling import SMOTE

sm = SMOTE()
x_train2, y_train2 = sm.fit_sample(X_train, Y_train)

Обратите внимание, что этот код работает только для двоичных выходов, поэтому следует выполнить горячее кодированиеваши 3 класса и применять его класс 0 и класс 1, затем класс 0 и класс 2, удаляя двойную избыточную выборку из класса ноль.Затем вы запускаете свою модель нейронной сети, увеличивая validation_split до 0,2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...