Огромное несоответствие в результатах прогнозирования классификации в модели CNN Keras - PullRequest
0 голосов
/ 17 февраля 2020

Я обучил модель CNN с Keras с df из 921 rows x 10165 columns Каждый ряд представляет собой образец с 10160 функциями. Затем я использовал предварительно обученную модель для прогнозирования.

Я удостоверился, что данные обучения были хорошо сбалансированы: около 50% образцов с меткой 0, а остальные 50% с меткой 1. Точность модели выглядит достойно, но проблема при прогнозировании.

Таким образом, входные данные выглядят так:

X = df.iloc[:,0:10160]  
X = X.to_numpy()                      
X = X.reshape([X.shape[0], X.shape[1],1]) 
X_train_1 = X[:,0:10080,:]
X_train_2 = X[:,10080:10160,:].reshape(921,80)      
Y = df.iloc[:,10163:10165]
Y = Y.to_numpy()

, и я предсказал количество выборок с предсказанной меткой '1' (для label_1) с кодом:

prediction = pd.DataFrame(model.predict([X_train_1,X_train_2])) 
prediction['label_1'] = ['0' if x < 0.5 else '1' for x in prediction['prob']]

prediction[prediction['label_1'] == '1'].shape[0]/921

Вторая строка кода вычисляет долю выборок с label_1 ==1 из всех выборок. Проблема заключается в том, что, учитывая, что входные данные имеют сбалансированное число 1 и 0, я ожидал, что доля составляет около 50% или около того, но рассчитанная доля находится в диапазоне 0.08 ~ 0.98 (если нет более экстремальный) с огромным несоответствием. Что могло пойти не так?

1 Ответ

0 голосов
/ 17 февраля 2020

Используйте model.predict_classes() вместо. В противном случае вы получаете вероятности.

prediction = pd.DataFrame(model.predict_classes([X_train_1,X_train_2])) 
prediction[prediction['label_1'] == '1'].shape[0]/921

Если вы используете функциональный API, используйте np.argmax():

np.argmax(model.predict([X_train_1,X_train_2]), axis=1)

Тогда вам понадобятся предсказания, которые вам нужны, так как 0 и 1 вместо вероятностей.

...