Почему моя нейронная сеть предсказывает только один класс (двоичная классификация)? - PullRequest
0 голосов
/ 01 июля 2019

У меня проблемы с моим ANN.Это только предсказание «0».Набор данных является несбалансированным (10: 1), ХОТЯ, я занизил выборку учебного набора данных, поэтому я не уверен в том, что происходит.Я получаю 92-93% точности на сбалансированном тренировочном наборе, хотя при тестировании (на несбалансированном тестовом наборе) он просто предсказывает нули.Не уверены, куда идти отсюда.Все помогает.Данные были подвергнуты оперативному кодированию и масштабированию.

#create 80/20 train-test split
train, test = train_test_split(selection, test_size=0.2)

# Class count
count_class_0, count_class_1 = train.AUDITED_FLAG.value_counts()

# Divide by class
df_class_0 = train[train['AUDITED_FLAG'] == 0]
df_class_1 = train[train['AUDITED_FLAG'] == 1]

df_class_0_under = df_class_0.sample(count_class_1)
train_under = pd.concat([df_class_0_under, df_class_1], axis=0)

print('Random under-sampling:')
print(train_under.AUDITED_FLAG.value_counts())

train_under.AUDITED_FLAG.value_counts().plot(kind='bar', title='Count (target)');

Random under-sampling:
1.0    112384
0.0    112384

#split features and labels 
y_train = np.array(train_under['AUDITED_FLAG'])
X_train = train_under.drop('AUDITED_FLAG', axis=1)
y_test = np.array(test['AUDITED_FLAG'])
X_test = test.drop('AUDITED_FLAG', axis=1)
y_train = y_train.astype(int)
y_test = y_test.astype(int)


# define model
model = Sequential()
model.add(Dense(6, input_dim=179, activation='relu'))
model.add(Dense(30, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# fit model
history = model.fit(X_train, y_train, epochs=5, batch_size=16, verbose=1)

#validate
test_loss, test_acc = model.evaluate(X_test, y_test)

# evaluate the model
_, train_acc = model.evaluate(X_train, y_train, verbose=0)
_, test_acc = model.evaluate(X_test, y_test, verbose=0)

print('Train: %.3f, Test: %.3f' % (train_acc, test_acc))
print('test_acc:', test_acc)

# plot history
pyplot.plot(history.history['acc'], label='train')
#pyplot.plot(history.history['val_acc'], label='test')

Поезд: 0,931, Тест: 0,921

#preds
y_pred = model.predict(X_test)
y_pred_bool = np.argmax(y_pred, axis=1)

# #plot confusion matrix 
y_actu = pd.Series(y_test, name='Actual')
y_pred_bool = pd.Series(y_pred_bool, name='Predicted')

print(pd.crosstab(y_actu, y_pred_bool))

'' '

Predicted       0
Actual           
0           300011
1            28030

1 Ответ

1 голос
/ 01 июля 2019

Это не правильно:

y_pred_bool = np.argmax(y_pred, axis=1)

Argmax используется только с категориальными кросс-энтропийными потерями и выходами softmax. Для двоичных выходов перекрестной энтропии и сигмовидной формы вы должны округлить выходные данные, что эквивалентно прогнозированию порогового значения> 0,5:

y_pred_bool = np.round(y_pred)

Это то, что Keras делает для вычисления двоичной точности.

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