Используйте пользовательскую метрику для оценки предсказаний модели заданного класса. Она практически сформирована в прекоде, вам осталось правильно применить make_scorer().

Оцените качество модели пользовательской метрикой для классов Rock и Classical с помощью кросс-валидации. Выберите лучшую модель для каждого из классов.

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.metrics import make_scorer

# импортируйте модели LogisticRegression, KNeighborsClassifier, SVC
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC

# импортируйте классы для кодирования и масштабирования 
from sklearn.preprocessing import OneHotEncoder, StandardScaler

# создание константы 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)

# создаём функцию для расчёта точности предсказаний каждого класса
def custom_metric(y_true, y, label):
	# выделяем все объекты нужного класса в датасете
	mask = y_true==label
  # сравниваем фактические и предсказанные значения
	correct = y_true[mask] == y[mask]
  # вычисляем долю верных ответов к числу наблюдений в классе 
	metric = correct.sum()/mask.sum()
	return metric

# инициализируйте логистическую регрессию, kNN и SVM
# используйте class_weight='balanced', если у модели есть такая опция
# для kNN выберите n_neighbors=100
# не забудьте зафиксировать random_state для регрессии и SVM
model_lr = LogisticRegression(class_weight='balanced', random_state=RANDOM_STATE)
model_knn = KNeighborsClassifier(n_neighbors=100)
model_svm = SVC(class_weight='balanced', random_state=RANDOM_STATE)

# создайте список с моделями
models = [model_lr, model_knn, model_svm]

# создайте пользовательскую метрику для оценки точности предсказания каждого класса
scorer_rock = make_scorer(custom_metric, label='Rock')
scorer_classical = make_scorer(custom_metric, label='Classical')

# проверьте качество модели кросс-валидацией каждой модели
for model in models:
    result_rock = cross_val_score(model, X_train, y_train, cv=3, scoring=scorer_rock)
    result_classical = cross_val_score(model, X_train, y_train, cv=3, scoring=scorer_classical)
    print(f"==={type(model).__name__}===")
    print(f"Среднее значение Accuracy для класса 'Classical': {result_classical.mean():.2f}")
    print(f"Среднее значение Accuracy для класса 'Rock': {result_rock.mean():.2f}")
    print()

Результат
===LogisticRegression===
Среднее значение Accuracy для класса 'Classical': 0.92
Среднее значение Accuracy для класса 'Rock': 0.96

===KNeighborsClassifier===
Среднее значение Accuracy для класса 'Classical': 0.93
Среднее значение Accuracy для класса 'Rock': 0.91

===SVC===
Среднее значение Accuracy для класса 'Classical': 0.92
Среднее значение Accuracy для класса 'Rock': 0.97

Кросс-валидация показала, что для каждого класса подходит своя модель:

  • лучшая модель для предсказания рок-музыки — SVM.
  • лучшая модель для предсказания классической музыки — kNN.