fbpx

Несоответствие результатов нейронной сети

369 просмотра
0
0 Комментариев

Есть нейронная сеть определяющая тональность отзывов о фильмах(хороший/плохой). Использовал датасет imdb Для взвешивания терминов использовал TF-IDF. Тип сети — многослойный персептрон. Суть проблемы — на выходе сеть выдает точность 87% на тестовых данных. После работы сети я подал ту же тестовую выборку на уже обученную сеть для проверки результата и получил в итоге 9237 несоответствий, что почти 40%, но никак не 13. Откуда такое расхождение?
Модель сети:

from pathlib import Path
import pandas as pd
from keras.models import Sequential
from keras.layers import Embedding, Dense, Dropout, Activation
from keras.preprocessing.text import Tokenizer, text_to_word_sequence
from keras import optimizers
 
def flatten(iterable, types_to_flatten=(list, tuple)):
    for it in iterable:
        if isinstance(it, types_to_flatten):
            yield from flatten(it)
        else:
            yield it
 
def get_data(path):
    p = Path(path)
    train = pd.concat([pd.read_csv(f, sep='\t', index_col=0)
                       for f in p.glob('train_???.tsv*')],
                      ignore_index=True)
    test = pd.concat([pd.read_csv(f, sep='\t', index_col=0)
                      for f in p.glob('test_???.tsv*')],
                      ignore_index=True)
    return ((train['Text'], train['Sentiment']),
           (test['Text'], test['Sentiment']))
 
# read data
(X_train, y_train), (X_test, y_test) = get_data(r'D:\download\NLP')
 
# build vocabulary
t = Tokenizer(num_words=10000)
t.fit_on_texts(X_train)
t.fit_on_texts(X_test)
 
 
# build a model
model = Sequential()
model.add(Dense(100, activation='relu', input_dim=10000))
model.add(Dropout(0.25))
model.add(Dense(50,activation = 'relu'))
model.add(Dense(1, activation='sigmoid'))
optimiz = optimizers.Adam(lr=0.0001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(loss = 'binary_crossentropy',optimizer = optimiz ,metrics = ['accuracy'])
 
# convert texts to TF-IDF matrices
X_train = t.texts_to_matrix(X_train, mode='tfidf')
X_test = t.texts_to_matrix(X_test, mode='tfidf')
 
# fit the model
hist = model.fit(X_train,y_train,validation_data = (X_test,y_test),epochs = 5,batch_size = 64)

Так проверяю результат:

X1=X_test.values.tolist()
X2=y_test.values.tolist()
 
X3 = np.asarray(X2)
t.fit_on_texts(X1)
X = t.texts_to_matrix(X1, mode='tfidf')
 
X3=X3.tolist()
X3=np.asarray(X3)
 
X4=list(flatten(np.round(model.predict(X)).tolist()))
X4=np.asarray(X4)
 
(X4 != X3).sum()

В результате 9237 несоответствий.


Добавить комментарий

1 Ответы

Python Опубликовано 20.03.2019
0

После данных строк:

# convert texts to TF-IDF matrices
X_train = t.texts_to_matrix(X_train, mode='tfidf')
X_test = t.texts_to_matrix(X_test, mode='tfidf')

X_train, X_test — уже векторизированы и готовы к тому чтобы подавать их напрямую модели.

Что (главное зачем?) делает следующий код я не понимаю:

X1=X_test.values.tolist()
X2=y_test.values.tolist()
 
X3 = np.asarray(X2)
t.fit_on_texts(X1)
X = t.texts_to_matrix(X1, mode='tfidf')


Если скормить модели X_test без повторных преобразований, то точность модели будет ожидаемая:

# predict values
In [17]: pred = np.round(model.predict(X_test))
 
# flatten `pred` to 1D vector
In [18]: pred = pred.ravel()
 
# number of mistakes (wrong predictions)
In [19]: (pred != y_test).sum()
Out[19]: 3106
 
# model's accuracy
In [20]: (pred == y_test).mean()
Out[20]: 0.87576

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up