Keras объединяет прогнозирование класса с метками - PullRequest
1 голос
/ 24 июня 2019

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

После обучения модели и генерации прогнозов - keras просто выводит массив значений безуказание метки класса.

Как лучше объединить их, чтобы мой API мог возвращать значимые результаты потребителю?

Пример

y = pd.get_dummies(df_merged.eventId)
y

2CBC9h3uple1SXxEVy8W    GiiFxmfrUwBNMGgFuoHo    e06onPbpyCucAGXw01mM
12  1                   0                       0
13  1                   0                       0
14  1                   0                       0

prediction = model.predict(pred_test_input)
prediction
array([[0.5002058 , 0.49697363, 0.50251794]], dtype=float32)

Желаемый результат: {results: { 2CBC9h3uple1SXxEVy8W: 0.5002058, ...}

РЕДАКТИРОВАТЬ: Добавление модели в соответствии с комментарием - но это всего лишь игрушечная модель.

model = Sequential()
model.add(
  Embedding(
    input_dim=embeddings_index.shape[0],
    output_dim=embeddings_index.shape[1],
    weights=[embeddings_index],
    input_length=MAX_SEQ_LENGTH,
    trainable=False,
  )
)
model.add(LSTM(300))
model.add(Dense(units=len(y.columns), activation='sigmoid'))
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])

РЕДАКТИРОВАНИЕ 2 - добавление y.

Итак, мой yв следующем формате:

eventId
123
123
234
...

Затем я использую y = pd.get_dummies(df_merged.eventId), чтобы преобразовать это во что-то, что модель может потреблять, и хотел бы добавить eventIds обратно к прогнозам.

Ответы [ 2 ]

2 голосов
/ 24 июня 2019

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

model.compile(loss='binary_crossentropy', optimizer='sgd', metrics=['accuracy'])

Тогда важно сказать, что точность keras не учитывает классификацию по нескольким меткам, поэтому это будет вводящая в заблуждение метрика. Более подходящими показателями являются точность / отзыв для каждого класса.

Чтобы получить прогнозы класса, вы должны портировать прогнозы каждого класса, и это порог, который вы должны настраивать (он не должен быть одинаковым для каждого класса), например, так:

class_names = y.columns.tolist()
pred_classes = {}
preds = model.predict(pred_test_input)

thresh = 0.5
for i in range(num_classes):
    if preds[i] > thresh:
        pred_classes[class_name[i]] = preds[i]

При этом будет выведен словарь pred_classes с классами, превышающими пороговое значение, и будет включен показатель достоверности.

0 голосов
/ 24 июня 2019

Для задачи классификации мы склонны заканчиваться слоем Softmax, который дает нам распределение вероятностей по различным классам.

Подумайте об изменении архитектуры вашей модели на что-то вроде:

model = Sequential()
model.add(
  Embedding(
    input_dim=embeddings_index.shape[0],
    output_dim=embeddings_index.shape[1],
    weights=[embeddings_index],
    input_length=MAX_SEQ_LENGTH,
    trainable=False,
  )
)
model.add(LSTM(300))
model.add(Dense(units=len(y.columns), activation='sigmoid'))
model.add(Softmax(3))

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

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