Тренируйте Tfidf-Vectors с помощью кераса и получайте слова (которые вызвали спам или ветчину) - PullRequest
0 голосов
/ 12 марта 2020

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

У меня есть куча texts и преобразовать их в tfidf-vector с sklearn - довольно основа c. Но теперь я хотел бы использовать keras для обучения вместо модели sklearn (Это также отлично работает - Примечание: я преобразовываю разреженную матрицу в np.array())

Так что после моя модель обучена, я хочу увидеть, какие words каждого text привели к соответствующей классификации. Скажите, какие слова вызвали ham, а какие слова вызвали spam.

Я знаю, что мне нужно каким-то образом получить матрицу весов или что-то еще ... прогнать текст через алгоритм и посмотреть, какие слова "вызвали" соответствующая классификация. Любая помощь / советы приветствуются; -)

from sklearn.feature_extraction.text import CountVectorizer
count = CountVectorizer()

from sklearn.feature_extraction.text import TfidfTransformer
tfidf = TfidfTransformer(use_idf=True, norm='l2', smooth_idf=True)
x_train = tfidf.fit_transform(count.fit_transform(doc_training))

# to make sparse matrix work on my system I convert it to np.array
x_train = x_train.toarray()
x_train = np.array(x_tr, dtype='float32')

input_x = Input(shape=(input_dim,), dtype='float32')
x = Dense(10, input_dim=input_dim, activation='relu')(input_x )
preds = Dense(1, activation='sigmoid',name='output')(x)

model = Model(input_x, preds)

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

model.fit(x_train, y_train, validation_data=(x_vals, y_vals), epochs=epoch, batch_size=batch)

Редактировать: Я обнаружил, что мой вопрос не так тривиален, как я думал. Стандартный классификатор sklearn использует только один слой. Здесь я использовал два.

Так что я мог бы построить такую ​​модель, как:

input_x = Input(shape=(input_dim,), dtype='float32')
preds = Dense(1, activation='sigmoid',name='output')(input_x )

model = Model(input_x , preds)

Из которой я мог бы вручную получить веса:

weights_preds, bias_preds = model.get_weights()
h= x_train.dot(weights_preds) + bias_preds 
z = 1/(1 + np.exp(-h))  # sigmoid

Итак, я предполагаю, что для одной выборки я мог бы просто ранжировать результат, используя веса. Чем выше вес, тем больше слово способствует тому, чтобы быть классифицированным как 1. Но как мне это сделать для модели со вторым relu слоем?

...