我有一个主题数据集,每个熊猫数据框中都有许多行(每次测量都是一行,一个主题可能测量几次)。我想将数据分为训练和测试集,但由于所有受试者的测量值都是相关的(不能将同一受试者放入训练和测试中),因此我不能随机进行分割。您会如何爱上它?我有一个熊猫数据框,每个对象都有不同数量的测量值。

编辑:我的数据包括每一行的主题号,我想尽可能地接近0.8 / 0.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]

10-04 21:57
查看更多