Используйте пользовательскую метрику для оценки предсказаний модели заданного класса. Она практически сформирована в прекоде, вам осталось правильно применить 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.