Мне нужно обучить многоклассовую модель, но у меня небольшой набор данных.

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

У меня есть файл 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.

Применение

  1. Тонкая настройка подготовки данных:

    • Убедитесь, что данные качественно очищены. Возможно, нужно адаптировать функцию clean_text, чтобы учитывать специфические термины и выражения в вашем тексте.
    • Проверьте, используется ли коррекция дисбаланса классов, так как малые классы могут быть недостаточно представлены.
  2. Увеличение данных (Data Augmentation):

    • Рассмотрите возможность применения методов увеличения данных: перефразирование текстов, добавление синонимов или генерация новых примеров с помощью языковых моделей, таких как GPT.
  3. Применение других подходов к векторизации:

    • Попробуйте более сложные методы векторизации, такие как эмбеддинги слов (word embeddings), например, Word2Vec или GloVe.
    • Обратитесь к предварительно обученным моделям трансформеров, таким как BERT, которые привыкли давать лучшие результаты на задачах NLP.
  4. Тонкая настройка модели:

    • Поменяйте архитектуру сети: добавьте дополнительные слои, измените количество нейронов или используйте регуляризацию (например, L2-регуляризацию) для борьбы с переобучением.
    • Изучите гиперпараметры обучения (размер батча, скорость обучения) для улучшения сходимости.
  5. Кросс-валидация:

    • Примените кросс-валидацию (например, K-блочную) для более надежной оценки производительности модели.
  6. Смешанные методы и ансамблирование:

    • Смешивайте результаты нескольких моделей (ансамблирование) для улучшения общей точности.

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

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

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