Вопрос или проблема
У меня есть файл Excel, который содержит два столбца: один с текстовыми фразами и другой, который сообщает мне классификацию от ‘CS1’ до ‘CS8’. Текст выглядит так:
"НЕ ПАГТО ПРОВЕНТОС АПОСЕНТАДОРИЯ ЭСПЕЦИАЛ СЕРВИДОРЕС САУДЕ, НОЯБРЬ/2024. ССЫЛКА. СЧЕТ 033/2024. ВКЛЮЧАЕТ РЕФОРМУ ШКОЛ."
Я уже очистил в другом файле, и в целом файл содержит 72 текста с df.shape = (72, 2)
.
Точность остается ниже 50%, но мне нужно, чтобы она была выше.
файл clean_text.py:
import re
def clean_text(text):
text = re.sub(r'\d{1,4}/\d{4}', '', text)
text = re.sub(r'\d+', '', text)
text = re.sub(r'[^\w\s]', '', text)
text = text.lower()
return text
файл main.py:
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Input
from tensorflow.keras.optimizers import Adam
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import classification_report, accuracy_score
from transformers import TFAutoModel, AutoTokenizer
import joblib
import pandas as pd
from nltk.corpus import stopwords
import re
from clean_text import clean_text
df = pd.read_excel("DADOS PARA CLASSIFICAÇÃO MULTICLASSE.xlsx", sheet_name="TREINAMENTO")
df['EMPENHO'] = df['EMPENHO'].apply(clean_text)
descriptions = df['EMPENHO'].tolist()
labels = df['CLASSE SINTETICA'].tolist()
print(f"Амостры: {df.shape}")
label_encoder = LabelEncoder()
labels_encoded = label_encoder.fit_transform(labels)
vect = TfidfVectorizer()
X = vect.fit_transform(descriptions).toarray()
X_train, X_test, y_train, y_test = train_test_split(X, labels_encoded, test_size=0.2, random_state=42)
model = Sequential([
Input(shape=(X_train.shape[1],)),
Dense(128, activation='relu'),
Dropout(0.3),
Dense(64, activation='relu'),
Dropout(0.3),
Dense(len(label_encoder.classes_), activation='softmax')
])
model.compile(optimizer=Adam(learning_rate=1e-4), loss="sparse_categorical_crossentropy", metrics=['accuracy'])
accuracy = 0
while accuracy < 0.90:
print("Тренировка модели...")
emp_train = model.fit(X_train, y_train, epochs=100, batch_size=16, validation_split=0.2, verbose=0)
y_pred = np.argmax(model.predict(X_test), axis=-1)
accuracy = accuracy_score(y_test, y_pred)
print(f"Точность: {accuracy * 100:.2f}%")
joblib.dump(vect, "vectorizer.pkl")
joblib.dump(label_encoder, "label_encoder.pkl")
model.save("empenho_model.keras")
print("Модель успешно обучена и сохранена!")
Я пробовал использовать BERT и PyTorch, но этот способ был лучше для меня.
Ответ или решение
В сложившейся ситуации, вы пытаетесь обучить многоклассовую модель для текстовой классификации, имея весьма ограниченный набор данных, всего 72 примера. Основная проблема заключается в том, что точность модели остается ниже 50%, однако требуется ее повысить. Рассмотрим теоретическую основу проблемы, примененные методы, а также предложим варианты решения.
Теория
Обучение модели машинного обучения с небольшим объемом данных представляет собой существенный вызов. Это связано с высокой вероятностью переобучения, когда модель начинает "запоминать" данные, вместо того чтобы "извлекать" закономерности. Основная задача — усилить обобщающую способность модели и повысить ее производительность на вневыборочных данных.
Пример
В приведенном вами решении используется нейронная сеть с плотными слоями для классификации текстов, предварительно преобразованных посредством TF-IDF векторов. Однако, когда данные ограничены, такие алгоритмы могут быть неэффективными. Вы упомянули, что пробовали использовать BERT и PyTorch, но предпочли более простую реализацию на Keras и TensorFlow.
Применение
-
Тонкая настройка подготовки данных:
- Убедитесь, что данные качественно очищены. Возможно, нужно адаптировать функцию
clean_text
, чтобы учитывать специфические термины и выражения в вашем тексте. - Проверьте, используется ли коррекция дисбаланса классов, так как малые классы могут быть недостаточно представлены.
- Убедитесь, что данные качественно очищены. Возможно, нужно адаптировать функцию
-
Увеличение данных (Data Augmentation):
- Рассмотрите возможность применения методов увеличения данных: перефразирование текстов, добавление синонимов или генерация новых примеров с помощью языковых моделей, таких как GPT.
-
Применение других подходов к векторизации:
- Попробуйте более сложные методы векторизации, такие как эмбеддинги слов (word embeddings), например, Word2Vec или GloVe.
- Обратитесь к предварительно обученным моделям трансформеров, таким как BERT, которые привыкли давать лучшие результаты на задачах NLP.
-
Тонкая настройка модели:
- Поменяйте архитектуру сети: добавьте дополнительные слои, измените количество нейронов или используйте регуляризацию (например, L2-регуляризацию) для борьбы с переобучением.
- Изучите гиперпараметры обучения (размер батча, скорость обучения) для улучшения сходимости.
-
Кросс-валидация:
- Примените кросс-валидацию (например, K-блочную) для более надежной оценки производительности модели.
-
Смешанные методы и ансамблирование:
- Смешивайте результаты нескольких моделей (ансамблирование) для улучшения общей точности.
Отдавая дань малым наборам данных, крайне важно тщательно продумывать каждый шаг — от предварительной обработки данных и выбора архитектуры модели до метода обучения и оценки результатов. Поиск оптимальной комбинации этих факторов может значительно повысить точность вашего решения.