【问题标题】:How to split a dataset to train/test where some rows are dependent?如何拆分数据集以训练/测试某些行依赖的位置?
【发布时间】:2018-02-09 08:39:35
【问题描述】:

我有一个主题数据集,每个主题在我的 pandas 数据框中都有许多行(每次测量都是一行,一个主题可以测量几次)。我想将我的数据拆分为训练集和测试集,但我不能随机拆分,因为所有主题的测量值都是依赖的(不能将同一主题放入训练和测试中)。你会如何重新喜欢这个?我有一个 pandas 数据框,每个主题都有不同数量的测量值。

编辑:我的数据包括每一行的主题编号,我希望尽可能接近 0.8/0.2。

【问题讨论】:

  • 不幸的是我不能。我可以举个例子:3个受试者的数据,受试者1测量3次,受试者2测量4次,受试者3测量3次。总共 10 行,我想将它们尽可能地分开,比如 0.8/0.2。因此,培训将包括 2 名受试者进行 7 次测量,而测试将包括 1 名受试者进行 3 次测量。
  • 你怎么知道一个主题从哪里开始和停止?是否有列,或者它们是多索引的?
  • 在我上面的编辑中,我有一列带有主题编号,这样你就可以知道每一行是哪个主题。

标签: python pandas train-test-split


【解决方案1】:

考虑数据框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]

【讨论】:

  • 感谢您的回答。问题是并非所有主题都具有相同的行数。您如何将其包含在 0.8/0.2 训练/测试目标中?
猜你喜欢
  • 2018-06-04
  • 2019-03-15
  • 1970-01-01
  • 1970-01-01
  • 2019-05-01
  • 2017-02-20
  • 2016-02-27
  • 1970-01-01
  • 2022-06-25
相关资源
最近更新 更多