Как разбить набор данных для обучения / тестирования, где некоторые строки зависят?

У меня есть набор данных субъектов, и у каждого из них есть ряд строк в моем кадре данных панд (каждое измерение является строкой, и субъект может измерять несколько раз). Я хотел бы разделить свои данные на обучающие и тестовые наборы, но я не могу разделить случайно, потому что все измерения объекта являются зависимыми (не могу поместить один и тот же объект в тренировку и тестирование). Как бы вы решили это? У меня есть датафрейм 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

Идентификатор темы - это группы.

Другие вопросы по тегам