Разделите исходный датасет на тренировочную и тестовую выборки стратификацией по целевому признаку.
import matplotlib.pyplot as plt
import pandas as pd
# импортируйте функцию для разбиения датасета на выборки
from sklearn.model_selection import train_test_split
# создание константы 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,
random_state=RANDOM_STATE, stratify=y
)
# визуализация баланса целевого признака в выборках
fig, ax = plt.subplots(1,3, figsize=(12,4))
y.value_counts().plot(kind='bar', ax=ax[0], rot=0)
ax[0].set_title("Исходный датасет")
y_train.value_counts().plot(kind='bar', ax=ax[1], rot=0)
ax[1].set_title("Train")
y_test.value_counts().plot(kind='bar', ax=ax[2], rot=0)
ax[2].set_title("Test")
plt.show()
Результат
Отлично, баланс не пострадал!