объединение структурированных и текстовых данных в задаче классификации с использованием кера - PullRequest
0 голосов
/ 05 сентября 2018

Следующий код является очень простым примером использования встраивания слов для предсказания меток (см. Ниже). Пример взят из здесь .

from numpy import array
from keras.preprocessing.text import one_hot
from keras.preprocessing.sequence import pad_sequences
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers.embeddings import Embedding

# define documents
docs = ['Well done!',
        'Good work',
        'Great effort',
        'nice work',
        'Excellent!',
        'Weak',
        'Poor effort!',
        'not good',
        'poor work',
        'Could have done better.']

# define class labels
labels = array([1,1,1,1,1,0,0,0,0,0])

# integer encode the documents
vocab_size = 50
encoded_docs = [one_hot(d, vocab_size) for d in docs]
print(encoded_docs)

# pad documents to a max length of 4 words
max_length = 4
padded_docs = pad_sequences(encoded_docs, maxlen=max_length, padding='post')
print(padded_docs)

# define the model
model = Sequential()
model.add(Embedding(vocab_size, 8, input_length=max_length))
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))

# compile the model
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])

# summarize the model
print(model.summary())

# fit the model
model.fit(padded_docs, labels, epochs=50, verbose=0)

# evaluate the model
loss, accuracy = model.evaluate(padded_docs, labels, verbose=0)
print('Accuracy: %f' % (accuracy*100))

Допустим, мы структурировали данные следующим образом:

hours_of_revision = [10, 5, 7, 3, 100, 0, 1, 0.5, 4, 0.75]

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

Просто интересно, можно ли включить это в модель для использования текста и структурированных данных?

1 Ответ

0 голосов
/ 06 сентября 2018

Да, это возможно с помощью Functional API от Keras. Все, что вам нужно, это дополнительный ввод для hours_of_revision, который соединяется с вложениями из текстовых данных перед переходом к окончательному классификатору.

Сначала масштабируйте дополнительные данные:

# additional data
hours_of_revision = [10, 5, 7, 3, 100, 0, 1, 0.5, 4, 0.75]

import numpy as np
# Scale the data
mean = np.mean(hours_of_revision)
std = np.std(hours_of_revision)
hours_of_revision = (hours_of_revision - mean)/std
hours_of_revision

Сборка модели с использованием функционального API:

# Build model
from keras.layers import Input, Embedding, Flatten, Dense, Concatenate
from keras.models import Model
# Two input layers
integer_input = Input((max_length, ))
revision_input = Input((1,))

# Embedding layer for the words
embedding = Embedding(vocab_size, 8, input_length=max_length)(integer_input)
embedding_flat = Flatten()(embedding)

# Concatenate embedding with revision
combined_data = Concatenate()([embedding_flat, revision_input])
output = Dense(1, activation='sigmoid')(combined_data)

# compile the model - pass a list of input tensors
model = Model(inputs=[integer_input, revision_input], outputs=output)
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])

# fit the model - pass list of input data
model.fit([padded_docs, hours_of_revision], labels, epochs=50, verbose=0)

Дополнительные примеры использования функционального API для моделей с несколькими входами и несколькими выходами см. В Документах Keras .

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