Проведите кросс-валидацию методом 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