Что мне делать? Я захотел улучшить f1-score, переписав свой ноутбук. Но на строке "trainer.train()" от меня потребовали некий API ключ
Вот мой код:
!pip install transformers datasets torch

import numpy as np
from typing import List, Tuple
import torch
from transformers import BertTokenizer, BertForSequenceClassification
from transformers import Trainer, TrainingArguments
from sklearn.metrics import classification_report
from datasets import load_dataset

# Функция, которая загружает набор данных под названием sib200, а именно его части: обучающий, валидационный и тестовый наборы
def load_sib200_ru() -> Tuple[Tuple[List[str], List[int]], Tuple[List[str], List[int]], Tuple[List[str], List[int]], List[str]]:

    # Загрузка данных: обучающего набора текста и соответствующих категорий из набора данных
    trainset = load_dataset('Davlan/sib200', 'rus_Cyrl', split='train')
    X_train = trainset['text']
    y_train = trainset['category']
    
    # Загрузка данных: валидационного набора текста и соответствующих категорий из набора данных
    valset = load_dataset('Davlan/sib200', 'rus_Cyrl', split='validation')
    X_val = valset['text']
    y_val = valset['category']
    
    # Загрузка данных: тестового набора текста и соответствующих категорий из набора данных
    testset = load_dataset('Davlan/sib200', 'rus_Cyrl', split='test')
    X_test = testset['text']
    y_test = testset['category']

    # Проверка категорий: Программа проверяет, что все категории из валидационного и тестового наборов содержатся в обучающем наборе. 
    # Если нет, выдается ошибка.
    categories = set(y_train)
    unknown_categories = set(y_val) - categories
    if len(unknown_categories) > 0:
        err_msg = f'The categories {unknown_categories} are represented in the validation set, but they are not represented in the training set.'
        raise RuntimeError(err_msg)
    unknown_categories = set(y_test) - categories
    if len(unknown_categories) > 0:
        err_msg = f'The categories {unknown_categories} are represented in the test set, but they are not represented in the training set.'
        raise RuntimeError(err_msg)

    # Перевод категорий в индексы: После этого категории переводятся в индексы 
    # (например, если категории "sport", "politics", "economy", они могут быть представлены как 0, 1, 2).
    categories = sorted(list(categories))
    y_train = [categories.index(it) for it in y_train]
    y_val = [categories.index(it) for it in y_val]
    y_test = [categories.index(it) for it in y_test]

    # Возвращаемое значение: Функция возвращает три кортежа (для обучения, валидации и тестирования) и список всех категорий.
    return (X_train, y_train), (X_val, y_val), (X_test, y_test), categories

# Эта функция нормализует входной текстовый строку s с помощью spaCy
def normalize_text(s: str, nlp_pipeline: spacy.Language) -> str:

    # Обработка текста: Текст обрабатывается с использованием модели spaCy, создавая объект doc.
    doc = nlp_pipeline(s)

    # Лемматизация и удаление пунктуации: В цикле фильтруются токены, удаляются пунктуационные знаки и выполняется лемматизация. 
    # Числовые токены заменяются на <NUM>.
    lemmas = [('<NUM>' if token.like_num else token.lemma_.lower()) for token in filter(lambda it1: not it1.is_punct, doc)]
    
    # Возврат нормализованного текста: Если после обработки получены леммы, они соединяются в строку и возвращаются. 
    # Если нет лемм, возвращается пустая строка.
    if len(lemmas) == 0:
        return ''
    return ' '.join(lemmas)

def prepare_data_for_bert(train_data, val_data, test_data):
    tokenizer = BertTokenizer.from_pretrained('DeepPavlov/rubert-base-cased')
    
    train_encodings = tokenizer(train_data[0], truncation=True, padding=True, max_length=128)
    val_encodings = tokenizer(val_data[0], truncation=True, padding=True, max_length=128)
    test_encodings = tokenizer(test_data[0], truncation=True, padding=True, max_length=128)

    return train_encodings, val_encodings, test_encodings

class TextDataset(torch.utils.data.Dataset):
    def __init__(self, encodings, labels):
        self.encodings = encodings
        self.labels = labels

    def __getitem__(self, idx):
        item = {key: torch.tensor(val[idx]) for key, val in self.encodings.items()}
        item['labels'] = torch.tensor(self.labels[idx])
        return item

    def __len__(self):
        return len(self.labels)

# Загрузка данных
train_data, val_data, test_data, classes_list = load_sib200_ru()

# Подготовка данных для BERT
train_encodings, val_encodings, test_encodings = prepare_data_for_bert(train_data, val_data, test_data)

# Создание наборов данных
train_dataset = TextDataset(train_encodings, train_data[1])
val_dataset = TextDataset(val_encodings, val_data[1])

# Инициализация модели
model = BertForSequenceClassification.from_pretrained('DeepPavlov/rubert-base-cased', num_labels=len(classes_list))

# Настройка аргументов для обучения
training_args = TrainingArguments(
    output_dir='./results',
    num_train_epochs=3,
    per_device_train_batch_size=16,
    per_device_eval_batch_size=64,
    warmup_steps=500,
    weight_decay=0.01,
    logging_dir='./logs',
    logging_steps=10,
    evaluation_strategy="epoch",
)

# Создание объекта Trainer
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=val_dataset,
)

# Обучение модели
trainer.train()

# Оценка модели на валидационном наборе
val_predictions = trainer.predict(val_dataset)
y_pred_val = np.argmax(val_predictions.predictions, axis=1)
print("Validation Classification Report:")
print(classification_report(val_data[1], y_pred_val, target_names=classes_list))

# Оценка модели на тестовом наборе
test_dataset = TextDataset(test_encodings, test_data[1])
test_predictions = trainer.predict(test_dataset)
y_pred_test = np.argmax(test_predictions.predictions, axis=1)
print("Test Classification Report:")
print(classification_report(test_data[1], y_pred_test, target_names=classes_list))