Обучите модель kNN на данных для бинарной классификации и оцените F1-мерой её качество на:

  • сэмплированной валидационной выборке,
  • не сэмплированной валидационной выборке,
  • тестовой выборке.
import pandas as pd
import matplotlib
from sklearn.model_selection import train_test_split

# импортируйте из библиотеки imblearn класс RandomOverSamper
from imblearn.over_sampling import RandomOverSampler

# импортируйте модель kNN для классификации
from sklearn.neighbors import KNeighborsClassifier

# импортируем классы для кодирования OHE и масштабирования 
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

# формирование тренировочной, валидационной и тестовой выборок в соотношении 3-1-1 (60%-20%-20%)
X_train, X_test_valid, y_train, y_test_valid = train_test_split(X, y, \
test_size=0.4, \
random_state=RANDOM_STATE, stratify=y)

X_valid, X_test, y_valid, y_test = train_test_split(X_test_valid, \
y_test_valid, \
test_size=0.5, \
random_state=RANDOM_STATE, stratify=y_test_valid)

X_train, X_valid, X_test = prepare_data(X_train, X_valid, X_test)

# создаём экземпляр класса RandomOverSampler с фиксированным random_state
sampler = RandomOverSampler(random_state=RANDOM_STATE)

# сэмплируем данные
X_train_sampled, y_train_sampled = sampler.fit_resample(X_train, y_train)
X_valid_sampled, y_valid_sampled = sampler.fit_resample(X_valid, y_valid)


# инициализируйте модель kNN и обучите её на тренировочной выборке
model = KNeighborsClassifier()
model.fit(X_train_sampled, y_train_sampled)

# посчитайте F1-меру на валидационной сэмплированной выборке
y_pred_valid_sampled = model.predict(X_valid_sampled)
f1_valid_sampled = f1_score(y_valid_sampled, y_pred_valid_sampled, pos_label='Rock')
print('Проверка модели на сэмплированной валидационной выборке: F1 =', round(f1_valid_sampled,2))

# посчитайте F1-меру на валидационной не сэмплированной выборке
y_pred_valid = model.predict(X_valid)
f1_valid = f1_score(y_valid, y_pred_valid, pos_label='Rock')
print('Проверка модели на НЕ сэмплированной валидационной выборке: F1 =', round(f1_valid,2))

# посчитайте F1-меру на тестовой выборке
y_pred_test = model.predict(X_test)
f1_test = f1_score(y_test, y_pred_test, pos_label='Rock')
print('Проверка модели на тестовой выборке: F1 =', round(f1_test,2))

Результат
Проверка модели на сэмплированной валидационной выборке: F1 = 0.93
Проверка модели на НЕ сэмплированной валидационной выборке: F1 = 0.82
Проверка модели на тестовой выборке: F1 = 0.82