Какой из 3 классов соответствует выходу model.predict ()? - PullRequest
2 голосов
/ 07 марта 2020

Когда я загружаю обученную модель и добавляю в нее новые данные для прогнозирования (model.predict (texttr)), я получаю:

[[0.3345264  0.33339804 0.33207548]]

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

                text  sent
1     Textstring1...     1
2     Textstring2...     2
3     Textstring3...     0
4     Textstring4...     0
5     Textstring5...     2

Как я могу сказать, какой класс (отправлено, значение поезда) соответствует полученному результату? Соответствует ли приведенное выше значение 0,3345264 отправленному 0 в качестве ответа от модели?

Вот некоторые детали модели и ее конфигурации:

 model = tf.keras.Sequential([
            tf.keras.layers.Embedding(VOC, EMB_SIZE),
            tf.keras.layers.GlobalAveragePooling1D(),
            tf.keras.layers.Dense(node1,activation='relu'),
            tf.keras.layers.Dropout(dropout),
            tf.keras.layers.Dense(3, activation='softmax')])

 model.compile(optimizer='adadelta',
              loss='sparse_categorical_crossentropy',
              metrics=['sparse_categorical_accuracy'])

Заранее спасибо.

Обновление Edit2: я использовал токенизатор примерно так, чтобы создать train_seqs:

      tokenizer = tf.keras.preprocessing.text.Tokenizer(
            num_words=WORDS
          , oov_token='<UNK>')
        tokenizer.fit_on_texts(train_df['text'])


    #convert text data to numerical indexes
        train_seqs=tokenizer.texts_to_sequences(train_df['text'])
        test_seqs=tokenizer.texts_to_sequences(test_df['text'])

#pad data up to SEQ_LEN (note that we truncate if there are more than SEQ_LEN tokens)
    train_seqs=tf.keras.preprocessing.sequence.pad_sequences(
       train_seqs
       , maxlen=SEQ_LEN
       , padding="post")
    test_seqs=tf.keras.preprocessing.sequence.pad_sequences(
       test_seqs
       , maxlen=SEQ_LEN
       , padding="post")

train_seqs
Out[12]: 
array([[ 144,    8,   46, ...,   42,    3, 1734],
       [   6,  315,  277, ...,   44, 2247, 2095],
       [   5,   18,  162, ...,  159,   56, 1483],
       ...,
       [   9,  132,   76, ...,  194,  234, 1628],
       [ 660,   66,    7, ...,    0,    0,    0],
       [ 514,  879,  126, ...,    6,   68,  590]], dtype=int32)

train_df['sent'].values
Out[13]: array([1, 0, 2, ..., 0, 1, 0])

history = model.fit(train_seqs, train_df['sent'].values
                    , batch_size=BATCH_SIZE
                    , epochs=EPOCHS
                    , validation_split=0.2
                    , callbacks=callbacks)

1 Ответ

3 голосов
/ 07 марта 2020

Если я правильно понимаю, вы хотите предсказать столбец sent, который представляется категориальной переменной, значения которой могут быть 0, 1 или 2. Ваш последний слой состоит из 3 нейронов (с активацией softmax), так что у вас будет 3 выхода на вывод. Я полагаю, что вы использовали что-то вроде One Hot Encoding для базовых выводов правды. Порядок прогнозов будет таким же, как и в вашем One Hot Encoder.

Как вы подготовили выходные данные истинности набора данных?

ОБНОВЛЕНИЕ:

Это на самом деле хороший вопрос, так как нет много документации по этому поводу. Я искал и нашел похожий вопрос по SO, поэтому я попросил более подробную информацию здесь :

В случае использования sparse_categorical_crossentropy, категория, которую вы присвоили число 0 на самом деле класс 0; категория, которую вы присвоили номеру 1, фактически является классом 1; и так далее. Например, если вы используете LabelEncoder из sklearn, вы можете узнать это сопоставление через атрибут .classes_ (см. Документацию и примеры).

Надеюсь, это поможет!

...