Не удается снизить потери при выполнении анализа настроений с использованием Keras.

Вопрос или проблема

Я создал модель в Keras, которая предсказывает 4 настроения/эмоции на основе текстового ввода. Размер моих данных:

label_1 : 100.000
label_2 : 100.000
label_3 : 100.000
label_4 : 50.000

Валидационные данные: 45.000

Я установил веса классов: class_weight = {'label_1':1, 'label_2':1, 'label_3':1, 'label_1':2}

Я использовал scikit-learn для векторизации с помощью CountVectorizer. Для предварительной обработки я перевёл все в нижний регистр, удалил электронные почты, URL/ссылки и удалил стоп-слова.

Это моя модель:

model = Sequential()
model.add(Dense(50, input_dim = features.shape[1], activation = 'relu')) # входной слой требует параметр input_dim
model.add(Dense(100, activation = 'relu'))
model.add(Dense(50, activation = 'relu'))
model.add(Dropout(0.5))
model.add(Dense(4, activation='softmax'))


opt = SGD(lr = 0.001, momentum = 0.01)
model.compile(loss="categorical_crossentropy", optimizer = opt, metrics=['accuracy'])

es = EarlyStopping(monitor="val_loss", min_delta = 0.03, patience = 120, verbose=1, mode="auto")
history = model.fit(features, results, validation_split = 0.25, shuffle = True, class_weight = class_weight, epochs = 600, batch_size=512, verbose=2, callbacks=[es])

score = model.evaluate(x_test, y_test, batch_size=512)
print()
print(history.history.keys())
print()
print(score)
print('Тестовая потеря:', score[0],  'Тестовая точность:', score[1])

Тестовая потеря: 0.215 Тестовая точность: 0.900

Это графики точности и потерь:

введите описание изображения здесь

введите описание изображения здесь

Это мое предсказание:

validation_features = transformerVectoriser.transform(validation_features)
prediction = model.predict_classes(validation_features , batch_size=512) # делаем предсказание

Это матрица путаницы и отчет о точности:

[[11678   256  1181    23]
 [  477 12023   432    13]
 [ 1538   322 10947    18]
 [   16     9    17  6050]]


точность    полнота  f1-score   поддержка

0       0.85      0.89      0.87     13138
1       0.95      0.93      0.94     12945
2       0.87      0.85      0.86     12825
3       0.99      0.99      0.99      6092

точность                    0.90     45000
макро ср. 0.92   0.92      0.92     45000
взвешенная ср.  0.91  0.90    0.90     45000

Мой вопрос: как я могу уменьшить потери? Я пробовал изменить количество слоев, узлов и слоев выбрасывания, сменить оптимизаторы, скорость обучения и моментум, поменять количество эпох и размер пакета, и изменить максимальное количество слов (я пробовал с 4.000, 5.000, 6.000, 8.000, 10.000, 12.000)

Неважно, что я меняю, моя точность всегда около 87%-90% (и я считаю, что это хорошо), но моя потеря всегда около 0.21-0.24 (и мне это не нравится). На некоторых блогах по науке о данных я читал, что потеря должна быть меньше 0.1. Это правда? Каково допустимое значение потери для многоклассовой классификации?

У вас есть какие-либо советы?

Нет универсального значения потерь, которое вы можете или должны достичь. Кроме вашей модели, это будет сильно зависеть от данных, которые у вас есть.

Что является хорошим или плохим результатом, субъективно и зависит от вашего случая использования.

Это очень широкий вопрос о том, как улучшить результат нейронной сети, и вам следует быть более конкретным, но некоторые идеи, которые могут сработать в общем:

  1. Предобрабатывайте ваши данные иначе (то есть используйте TF-IDF или используйте текст как последовательность)
  2. Соберите больше данных (нейронные сети обычно предпочитают это, также ваш набор тестовых данных кажется небольшим)
  3. Используйте другого оптимизатора (то есть Adam)
  4. Используйте другую архитектуру (то есть некоторые RNN)
  5. Используйте другой алгоритм (то есть XGBoost)
  6. Используйте BatchNormalization
  7. Используйте некоторый обратный вызов, который изменяет вашу скорость обучения
  8. Настраивайте ваши параметры

Ответ или решение

Уменьшение потерь при анализе настроений с использованием Keras

Если вы столкнулись с проблемой неспособности снизить потери при выполнении анализа настроений с использованием Keras, эта статья предоставит полезные рекомендации и идеи, как улучшить вашу модель и повысить ее производительность.

1. Изначальные данные и баланс классов

Ваш набор данных выглядит следующим образом:

  • label_1: 100,000
  • label_2: 100,000
  • label_3: 100,000
  • label_4: 50,000

Следует отметить, что классы несбалансированы, поскольку последний класс содержит значительно меньше образцов. Вы уже применили веса классов с помощью class_weight, но это может потребовать дальнейших изменений. Попробуйте единообразно увеличить данные для label_4, чтобы сбалансировать набор данных, используя такие методы, как аугментация данных.

2. Подбор векторов и предобработка данных

Вы используете CountVectorizer для векторизации текста. Попробуйте использовать TF-IDF Vectorizer, который может улучшить представление текстовых данных. Кроме того, учитывайте:

  • Исправление ошибок/опечаток в текстах.
  • Удаление редких слов, которые могут нести мало информации.

Также возможно, стоит рассмотреть использование последовательного представления текста (например, LSTM или GRU) вместо стандартного векторного представления.

3. Модель и архитектура

Затем, по поводу вашей архитектуры модели:

  • Попробуйте использовать более сложные архитектуры, такие как LSTM или GRU, которые могут лучше захватывать контекст в текстах.
  • Используйте Dropout слои стратегически, чтобы избежать переобучения.
  • Рассмотрите возможность использования модели на основе Transformers, такой как BERT, которая показывает отличные результаты в задачах анализа настроений.

4. Гиперпараметры и оптимизация

Ваши текущие гиперпараметры могут потребовать изменения:

  • Попробуйте другие оптимизаторы, такие как Adam или RMSprop, которые могут улучшить сходимость. Эти оптимизаторы автоматически адаптируют скорость обучения.
  • Поэкспериментируйте с изменением learning rate и добавьте стратегии изменения скорости обучения через колбеки, такие как ReduceLROnPlateau.

5. Увеличение объема данных и улучшение выборки

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

  • Сбор дополнительных данных.
  • Использование методов аугментации.

6. Оценка производительности и метрики

Понимание потерь требует также интерпретации. Потери в 0.21 – 0.24 могут быть приемлемыми в зависимости от задачи и данных. На практике:

  • Оценка хорошей модели зависит от контекста и требований конкретной области применения.

Если ваша точность составляет около 90%, это уже хороший результат, но улучшение потер гипотетически возможно. Исследуйте возможности улучшения и подходы, обсужденные выше.

Заключение

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

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

Капча загружается...