Как разбить набор данных для обучения / тестирования, где некоторые строки зависят?
У меня есть набор данных субъектов, и у каждого из них есть ряд строк в моем кадре данных панд (каждое измерение является строкой, и субъект может измерять несколько раз). Я хотел бы разделить свои данные на обучающие и тестовые наборы, но я не могу разделить случайно, потому что все измерения объекта являются зависимыми (не могу поместить один и тот же объект в тренировку и тестирование). Как бы вы решили это? У меня есть датафрейм Pandas, и у каждого субъекта разное количество измерений.
Изменить: Мои данные включают в себя номер темы для каждой строки, и я хотел бы разделить как можно ближе к 0,8/0,2.
2 ответа
Рассмотрим кадр данных df
с колонкой user_id
идентифицировать пользователей.
df = pd.DataFrame(
np.random.randint(5, size=(100, 4)), columns=['user_id'] + list('ABC')
)
Вы хотите идентифицировать уникальных пользователей и случайно выбрать некоторых. Затем разделите ваш фрейм данных, чтобы объединить всех тестовых пользователей в один и обучить пользователей в другом.
unique_users = df['user_id'].unique()
train_users, test_users = np.split(
np.random.permutation(unique_users), [int(.8 * len(unique_users))]
)
df_train = df[df['user_id'].isin(train_users)]
df_test = df[df['user_id'].isin(test_users)]
Это должно примерно разделить ваши данные на 80/20.
Однако, если вы хотите сохранить его максимально сбалансированным, вы должны добавлять пользователей постепенно.
unique_users = df['user_id'].unique()
target_n = int(.8 * len(df))
shuffled_users = np.random.permutation(unique_users)
user_count = df['user_id'].value_counts()
mapping = user_count.reindex(shuffled_users).cumsum() <= target_n
mask = df['user_id'].map(mapping)
df_train = df[mask]
df_test = df[~mask]
Стратифицированная группа kfold от sklearn может удовлетворить ваши потребности:
https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedGroupKFold.html
Идентификатор темы - это группы.