Интуитивно понятная панель инструментов для классификации наборов данных с несколькими метками с использованием 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%.