Модель Keras не предсказывает значения в тестовом наборе - PullRequest
0 голосов
/ 10 июля 2020

Я создаю модель Keras, чтобы предсказать, выберет ли пользователь определенный продукт или нет (бинарная классификация).

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

Мой набор данных выглядит примерно так:

train_dataset
    
customer_id id  target  customer_num_id
0   TCHWPBT 4   0         1
1   TCHWPBT 13  0         1
2   TCHWPBT 20  0         1
3   TCHWPBT 23  0         1
4   TCHWPBT 28  0         1
... ... ... ... ...
1631695 D4Q7TMM 849 0   7417
1631696 D4Q7TMM 855 0   7417
1631697 D4Q7TMM 856 0   7417
1631698 D4Q7TMM 858 0   7417
1631699 D4Q7TMM 907 0   7417

Я разделил его на наборы Train / Val, используя:

from sklearn.model_selection import train_test_split

Train, Val = train_test_split(train_dataset, test_size=0.1, random_state=42, shuffle=False)

После разделения набора данных я выбираю функции, которые используются при обучении и проверке модели:

train_customer_id = Train['customer_num_id']
train_vendor_id = Train['id']
train_target = Train['target']

val_customer_id = Val['customer_num_id']
val_vendor_id = Val['id']
val_target = Val['target']

... И запускаю модель:

epochs = 2

for e in range(epochs):
  print('EPOCH: ', e)
  model.fit([train_customer_id, train_vendor_id], train_target, epochs=1, verbose=1, batch_size=384)
  
  prediction = model.predict(x=[train_customer_id, train_vendor_id], verbose=1, batch_size=384)
  train_f1 = f1_score(y_true=train_target.astype('float32'), y_pred=prediction.round())
  print('TRAIN F1: ', train_f1)

  val_prediction = model.predict(x=[val_customer_id, val_vendor_id], verbose=1, batch_size=384)
  val_f1 = f1_score(y_true=val_target.astype('float32'), y_pred=val_prediction.round())
  print('VAL F1: ', val_f1)

EPOCH: 0
1468530/1468530 [==============================] - 19s 13us/step - loss: 0.0891
TRAIN F1:  0.1537511577647422
VAL F1:  0.09745762711864409
EPOCH:  1
1468530/1468530 [==============================] - 19s 13us/step - loss: 0.0691
TRAIN F1:  0.308748569645272
VAL F1:  0.2076433121019108

Точность проверки, похоже, со временем улучшается, и модель предсказывает как единицы, так и нули:

    prediction = model.predict(x=[val_customer_id, val_vendor_id], verbose=1, batch_size=384)
    np.unique(prediction.round())

    array([0., 1.], dtype=float32)

Но когда я пытаюсь предсказать набор тестов, модель предсказывает 0 для всех значений:

prediction = model.predict(x=[test_dataset['customer_num_id'], test_dataset['id']], verbose=1, batch_size=384)
np.unique(prediction.round())

array([0.], dtype=float32)

Набор тестовых данных похож на наборы для обучения и проверки, и он был исключен во время обучения, как и набор для проверки, но модель не может выводить значения, отличные от 0.

Вот какие тестовые данные набор выглядит так:

 test_dataset
    
         customer_id    id  customer_num_id
    0     Z59FTQD      243      7418
    1     0JP29SK      243      7419
    ... ... ... ...
    1671995 L9G4OFV    907      17414
    1671996 L9G4OFV    907      17414
    1671997 FDZFYBA    907      17415

Кто-нибудь знает, в чем может быть проблема?

EDIT: текст набора данных стал более читаемым

1 Ответ

0 голосов
/ 10 июля 2020

Обратите внимание на распределение ваших данных. Я вижу в показанных вами примерах данных, что все цели равны нулю. Учтите, что если большинство пользователей не выбирают продукт, то, если модель всегда предсказывает 0, в большинстве случаев он будет правильным. Таким образом, точность может быть повышена за счет чрезмерной подгонки к классу большинства (0).

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

Кроме того, я не уверен, как выглядит ваша модель, но вы тренируетесь только для двух эпох, поэтому у него может не хватить времени на обобщение данных, и в зависимости от того, насколько глубока ваша модель, может потребоваться намного больше времени на обучение

...