Разделите данные для бинарной классификации на тренировочную, валидационную и тестовую выборки. Сэмплируйте тренировочные и валидационные данные методом RandomOverSampler.

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

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

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

# сформируйте тренировочную, валидационную и тестовую выборки в соотношении 3-1-1 
# стратифицируйте данные и зафиксируйте random_state
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)

# выведите на экран три столбчатых диаграммы с распределением целевого признака
# отложите на них исходные данные, тренировочную и валидационную  выборки
fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(12,4))
pd.Series(y).value_counts().plot(kind='bar', rot=0, ax=axes[0])
pd.Series(y_train_sampled).value_counts().plot(kind='bar', rot=0, ax=axes[1] )
pd.Series(y_valid_sampled).value_counts().plot(kind='bar', rot=0, ax=axes[2] )

axes[0].set_title('Исходные данные')
axes[1].set_title('train после сэмплирования')
axes[2].set_title('valid после сэмплирования')
plt.show()

Результат

p1

Теперь пора посмотреть, как с такими данными справится модель.