Интуитивно понятная панель инструментов для классификации наборов данных с несколькими метками с использованием TensorFlow.

Мы используем набор данных обзоров музыкальных инструментов Amazon от Kaggle и создадим модель, которая будет классифицировать обзоры по трем категориям.

Анализ данных

Набор данных содержит 10 261 обзор инструментов из базы данных Amazon с рейтингом от 1 до 5.

Во-первых, давайте посмотрим количество отзывов в каждой категории.

Вот код Python для этого

data.hist()
plt.show()

Теперь давайте посмотрим, как часто встречаются слова в предложениях.

Вот код Python для этого

vectorizer = CountVectorizer()
vect_texts = vectorizer.fit_transform(list(data['reviewText']))
all_ngrams = vectorizer.get_feature_names()
num_ngrams = min(50, len(all_ngrams))
all_counts = vect_texts.sum(axis=0).tolist()[0]
all_ngrams, all_counts = zip(*[(n, c) for c, n in sorted(zip(all_counts, all_ngrams), reverse=True)])
ngrams = all_ngrams[:num_ngrams]
counts = all_counts[:num_ngrams]
idx = np.arange(num_ngrams)
plt.figure(figsize=(30, 30))
plt.bar(idx, counts, width=0.8)
plt.xlabel('N-grams')
plt.ylabel('Frequencies')
plt.title('Frequency distribution of ngrams')
plt.xticks(idx, ngrams, rotation=45)
plt.show()

Выполнив приведенный выше фрагмент кода, мы получим гистограмму наиболее часто встречающихся слов в нашем наборе данных.

Теперь давайте построим облако слов из 100 самых распространенных слов в наших данных обзоров.

Вот код Python для этого.

words=data['reviewText']
words=words.astype(str)
mostcommon = FreqDist(words).most_common(100)
wordcloud = WordCloud(width=1600, height=800, background_color='white').generate(str(mostcommon))
fig = plt.figure(figsize=(30,10), facecolor='white')
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis('off')
plt.title('Top 100 Most Common Words', fontsize=100)
plt.tight_layout(pad=0)
plt.show()

Выполнив приведенный выше фрагмент кода, мы получим облако слов из 100 самых распространенных слов, как показано ниже.

Теперь давайте предварительно обработаем наш набор данных, чтобы он использовался в качестве входных данных для нашей модели.

Предварительная обработка набора данных

Поскольку в нашем наборе данных есть пять меток для настроений со значениями [1,2,3,4,5], где 1 — отрицательное, а 5 — положительное, мы должны преобразовать его в три настроения: положительное, отрицательное и нейтральное.

После преобразования меток в значение трех настроений.

Теперь первая задача — преобразовать текстовые данные в целые, так как нам нужно вводить целочисленное значение в нашу модель.

Вот код Python для этого

tokenizer = Tokenizer ( num_words=1000, oov_token='<OOV>')
tokenizer.fit_on_texts(sentence)
word_index=tokenizer.word_index
sequences=tokenizer.texts_to_sequences(sentence)

Выполнив приведенный выше фрагмент кода, мы преобразовали наши текстовые данные в массив целых чисел, как показано ниже.

I used it to hold down the strings on my bass while I adjusted the truss rod. Worked perfectly for that purpose. Works for my four string bass
[4, 80, 7, 6, 237, 165, 2, 39, 13, 12, 140, 143, 4, 1462, 2, 1749, 1426, 389, 328, 9, 17, 655, 60, 9, 12, 722, 97, 140]

Теперь следующая задача — убедиться, что наш массив целых чисел имеет одинаковую длину, поскольку обзоры имеют разную длину, поэтому мы должны заполнить наш массив нулями, если длина обзоров меньше максимальной длины, и обрезать, если длина отзывов превышает максимальную длину.

Вот код Python для этого.

padded=pad_sequences(sequences,maxlen=120,truncating='post')

Выполнив приведенный выше фрагмент кода, мы преобразовали наш массив разной длины в единую длину 120, как показано ниже.

[4, 80, 7, 6, 2263, 4, 115, 810, 21, 39, 5, 2263, 4, 115, 248, 5, 6887, 12, 136, 323, 2, 934, 8, 148, 58, 4013, 352, 10, 472, 58, 2510, 10, 2, 21, 1902, 391, 148, 148, 9334]
  [   0    0    0    0    0    0    0    0    0    0    0    0    0    0     0    0    0    0    0    0    0    0    0    0    0    0    0    0     0    0    0    0    0    0    0    0    0    0    0    0    0    0     0    0    0    0    0    0    0    0    0    0    0    0    0    0     0    0    0    0    0    0    0    0    0    0    0    0    0    0     0    0    0    0    0    0    0    0    0    0    0    4   80    7     6 2263    4  115  810   21   39    5 2263    4  115  248    5 6887    12  136  323    2  934    8  148   58 4013  352   10  472   58 2510    10    2   21 1902  391  148  148 9334]

Теперь наши данные готовы в качестве входных данных для нашей модели, теперь давайте построим модель.

Модель здания

Мы построили нейронную сеть LSTM (тип RNN) для обучения модели.

Вот код Python для этого.

model = tf.keras.Sequential([
tf.keras.layers.Embedding(vocab_size, 16, input_length=max_length),
tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(32)),
tf.keras.layers.Dense(6, activation='sigmoid'),
tf.keras.layers.Dense(3, activation='sigmoid')
])
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])

Здесь последний слой модели имеет 3 нейрона, поскольку есть три класса: положительный, нейтральный и отрицательный.

Давайте посмотрим краткое описание нашей модели.

Model: "sequential_2" _________________________________________________________________ Layer (type)                 Output Shape              Param #    ================================================================= embedding_2 (Embedding)      (None, 120, 16)           160000     _________________________________________________________________ bidirectional_2 (Bidirection (None, 64)                12544      _________________________________________________________________ dense_4 (Dense)              (None, 6)                 390        _________________________________________________________________ dense_5 (Dense)              (None, 3)                 21         ================================================================= Total params: 172,955 Trainable params: 172,955 Non-trainable params: 0 _________________________________________________________________

Последний шаг — проверка нашей модели с помощью тестовых данных, давайте проверим модель.

Проверка модели

Мы проверили нашу модель с помощью тестовых данных, и показатель точности составил 0,8784 с числом эпох, равным 5.

Вывод

Мы внедрили LSTM в наш набор данных этикеток с несколькими классами, и достигнутая точность составляет около 87%.