В настоящее время я застрял с проблемой, которую я не могу получить в моей голове ..
У меня есть куча 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 слоем?