Обучите модель 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