матрица путаницы показывает единственный результат - PullRequest
0 голосов
/ 07 августа 2020

Я выполняю классификацию настроений глубокого обучения с положительными и отрицательными результатами, используя перчатку в качестве вложения слов. После обучения я пытаюсь создать матрицу путаницы, используя тестовые данные. однако он дает только 1 числовой выход. Ниже приведен код обучения и тестирования.

Код обучения:

import pandas as pd
import numpy as np
import re
import nltk
from nltk.corpus import stopwords

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.core import Activation, Dropout, Dense
from keras.layers import Flatten
from keras.layers import GlobalMaxPooling1D
from keras.layers.embeddings import Embedding
from sklearn.model_selection import train_test_split
from keras.preprocessing.text import Tokenizer

movie_reviews = pd.read_csv("/content/drive/My Drive/automobile.csv")

movie_reviews.isnull().values.any()

movie_reviews.shape
movie_reviews.head()

movie_reviews["tweet"][3]

import seaborn as sns

sns.countplot(x='Overall_Sentiment', data=movie_reviews)

def preprocess_text(sen):
    # Removing html tags
    sentence = remove_tags(sen)

    # Remove punctuations and numbers
    sentence = re.sub('[^a-zA-Z]', ' ', sentence)

    # Single character removal
    sentence = re.sub(r"\s+[a-zA-Z]\s+", ' ', sentence)

    # Removing multiple spaces
    sentence = re.sub(r'\s+', ' ', sentence)

    return sentence

TAG_RE = re.compile(r'<[^>]+>')

def remove_tags(text):
    return TAG_RE.sub('', text)

X = []
sentences = list(movie_reviews['tweet'])
for sen in sentences:
    X.append(preprocess_text(sen))

y = movie_reviews['Overall_Sentiment']

y = np.array(list(map(lambda x: 1 if x=="positive" else 0, y)))


X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=42)

tokenizer = Tokenizer(num_words=5000)
tokenizer.fit_on_texts(X_train)

X_train = tokenizer.texts_to_sequences(X_train)
X_test = tokenizer.texts_to_sequences(X_test)

# Adding 1 because of reserved 0 index
vocab_size = len(tokenizer.word_index) + 1

maxlen = 100

X_train = pad_sequences(X_train, padding='post', maxlen=maxlen)
X_test = pad_sequences(X_test, padding='post', maxlen=maxlen)

from numpy import array
from numpy import asarray
from numpy import zeros

embeddings_dictionary = dict()
glove_file = open('/content/drive/My Drive/glove.6B.100d.txt', encoding="utf8")

for line in glove_file:
    records = line.split()
    word = records[0]
    vector_dimensions = asarray(records[1:], dtype='float32')
    embeddings_dictionary [word] = vector_dimensions
glove_file.close()


embedding_matrix = zeros((vocab_size, 100))
for word, index in tokenizer.word_index.items():
    embedding_vector = embeddings_dictionary.get(word)
    if embedding_vector is not None:
        embedding_matrix[index] = embedding_vector

model = Sequential()
embedding_layer = Embedding(vocab_size, 100, weights=[embedding_matrix], input_length=maxlen , trainable=False)
model.add(embedding_layer)

model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))

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

print(model.summary())


history = model.fit(X_train, y_train, batch_size=128, epochs=6, verbose=1, validation_split=0.2)

%matplotlib inline
from matplotlib import pyplot as plt

score = model.evaluate(X_test, y_test, verbose=1)
print("Test Score:", score[0])
print("Test Accuracy:", score[1])

plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train','test'], loc='upper left')
plt.show()

plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])

plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train','test'], loc='upper left')
plt.show()

Код тестирования:

from sklearn.metrics import confusion_matrix

score, acc = model.evaluate(X_test, y_test,
                       batch_size=128, verbose=2)


new_prediction = model.predict(X_test)
print(confusion_matrix(y_test, np.argmax(new_prediction,axis=1)))

Вывод:

[[19924]]

Спасибо заранее!

1 Ответ

0 голосов
/ 07 августа 2020

Проблема в том, что ваши y_test и new_prediction содержат только один класс. Пример:

import numpy as np
from sklearn.metrics import confusion_mat

y_test = np.array([0,0,0,0,0])
y_pred = np.array([0,0,0,0,0])

print(confusion_matrix(y_test, y_pred))

Вывод:

[[5]]

Решение: Как только y_test или new_prediction содержат более одного класса, результат выглядит более как матрица путаницы.

y_test = np.array([0,0,0,0,0,1,1,1,1,1])
y_pred = np.array([0,0,0,1,1,1,0,1,1,1])
print(confusion_matrix(y_test, y_pred))

вывод:

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