- Вопрос или проблема
- Ответ или решение
- Уменьшение потерь при анализе настроений с использованием Keras
- 1. Изначальные данные и баланс классов
- 2. Подбор векторов и предобработка данных
- 3. Модель и архитектура
- 4. Гиперпараметры и оптимизация
- 5. Увеличение объема данных и улучшение выборки
- 6. Оценка производительности и метрики
- Заключение
Вопрос или проблема
Я создал модель в 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. Это правда? Каково допустимое значение потери для многоклассовой классификации?
У вас есть какие-либо советы?
Нет универсального значения потерь, которое вы можете или должны достичь. Кроме вашей модели, это будет сильно зависеть от данных, которые у вас есть.
Что является хорошим или плохим результатом, субъективно и зависит от вашего случая использования.
Это очень широкий вопрос о том, как улучшить результат нейронной сети, и вам следует быть более конкретным, но некоторые идеи, которые могут сработать в общем:
- Предобрабатывайте ваши данные иначе (то есть используйте TF-IDF или используйте текст как последовательность)
- Соберите больше данных (нейронные сети обычно предпочитают это, также ваш набор тестовых данных кажется небольшим)
- Используйте другого оптимизатора (то есть Adam)
- Используйте другую архитектуру (то есть некоторые RNN)
- Используйте другой алгоритм (то есть XGBoost)
- Используйте BatchNormalization
- Используйте некоторый обратный вызов, который изменяет вашу скорость обучения
- Настраивайте ваши параметры
Ответ или решение
Уменьшение потерь при анализе настроений с использованием 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 может быть достигнута различными способами. Постоянно экспериментируйте и комбинируйте различные подходы для достижения наилучших результатов. Важно помнить, что сохранение баланса между точностью и потерями — это искусство, требующее тщательной настройки и понимания данных.