Проведите кросс-валидацию методом StratifiedKFold. Оцените среднее качество модели на пяти блоках кросс-валидации.

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import KFold
 
# импортируйте модель KNeighborsClassifier
from sklearn.neighbors import KNeighborsClassifier
 
# импортируйте классы для кодирования и масштабирования 
from sklearn.preprocessing import OneHotEncoder, StandardScaler
 
# импортируйте функцию F1-меры для оценки качества модели
from sklearn.metrics import f1_score
 
# создание константы RANDOM_STATE
RANDOM_STATE = 42
 
# загрузка данных из CSV-файла в датафрейм pandas
df = pd.read_csv('music_genre_2_classes_imbalanced_v2.csv')
X = df.drop(columns='music_genre')
y = df.music_genre
 
# формирование тренировочной и тестовой выборок со стратификацией
# подготовка данных выполнена функцией, все операции в скрытом прекоде
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.25, random_state=RANDOM_STATE, stratify=y)
 
X_train, X_test = prepare_data(X_train, X_test)
 
# создайте экземпляр StratifiedKFold с пятью блоками
# используйте перемешивание данных и зафиксируйте random_state
s_kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=RANDOM_STATE) 
 
# список для сохранения оценок точности
f1 = []
 
# обучите и проверьте модель с помощью кросс-валидации
for train_index, test_index in s_kfold.split(X_train, y_train):
    # разделите данные на тренировочную и валидационную выборки
    X_train_cv, X_test_cv = X_train.iloc[train_index], X_train.iloc[test_index]
    y_train_cv, y_test_cv = y_train.iloc[train_index], y_train.iloc[test_index]
 
    # инициализация и обучение модели на кросс-валидационной выборке
    model = KNeighborsClassifier()
    model.fit(X_train_cv, y_train_cv)
 
    # оцените качество модели во время кросс-валидации
    y_pred = model.predict(X_test_cv)
    f1_metric = f1_score(y_test_cv, y_pred, pos_label='Rock')
 
    # сохраните оценки точности
    f1.append(f1_metric)
 
# обучите модель на всех тренировочных данных
model.fit(X_train, y_train)
 
# оцените качество модели на тестовой выборке
y_pred = model.predict(X_test)
f1_test = f1_score(y_test, y_pred, pos_label='Rock')
 
# усредните оценки качества после кросс-валидации
mean_f1 = sum(f1) / len(f1)
 
# вывод результатов
print(f"[Кросс-валидация] Все значения F1-score: {[round(x,2) for x in f1]}")
print(f"[Кросс-валидация] Среднее значение F1-score: {mean_f1:.2f}")
print(f"[Тестовая выборка] F1-score: {f1_test:.2f}")

Результат
[Кросс-валидация] Все значения F1-score: [0.84, 0.84, 0.85, 0.82, 0.84]
[Кросс-валидация] Среднее значение F1-score: 0.84
[Тестовая выборка] F1-score: 0.86