如何基于组ID生成训练集和测试集?

33

我有以下数据:

pd.DataFrame({'Group_ID':[1,1,1,2,2,2,3,4,5,5],
          'Item_id':[1,2,3,4,5,6,7,8,9,10],
          'Target': [0,0,1,0,1,1,0,0,0,1]})

   Group_ID Item_id Target
0         1       1      0
1         1       2      0
2         1       3      1
3         2       4      0
4         2       5      1
5         2       6      1
6         3       7      0
7         4       8      0
8         5       9      0
9         5      10      1

我需要根据“Group_ID”将数据集分割成训练集和测试集,使80%的数据进入训练集,20%进入测试集。

也就是说,我的训练集需要看起来像这样:

    Group_ID Item_id Target
0          1       1      0
1          1       2      0
2          1       3      1
3          2       4      0
4          2       5      1
5          2       6      1
6          3       7      0
7          4       8      0

以及测试集:

Test Set
   Group_ID Item_id Target
8         5       9      0
9         5      10      1

有什么最简单的方法可以做到这一点吗?据我所知,sklearn中的标准test_train_split函数不支持按组分割,并且还可以指示分割的大小(例如80/20)。


你尝试过什么?使用随机选择可能有效。 - Rob
@Rob,你能提供一个例子吗?我过去太依赖sklearn了,以至于我完全不知道如何以其他方式进行拆分。 - Negative Correlation
1
我能想到两种方法,但这取决于你的完整数据集。1)假设你的数据集有10条记录,那么就按照groupid对数据集进行排序,然后只需使用train = df.iloc[:8,:],test = df.iloc[8:,:] 2)使用条件子集。比如制作一个组列表,例如a = [5,6],并使用df['groupid'].isin(a)。 - Aditya Kansal
@AdityaKansal 这份数据大约有4GB大小。我能否使用类似sklearn的GroupShuffleSplit这样的工具? - Negative Correlation
此外,您应该在训练和测试中使用K折交叉验证。这是将数据随机分成k个集合(通常k=10),然后循环k次,在每次循环中使用(k-1)个集合进行训练,1个集合进行测试(每次循环使用不同的集合)。这将确保所有数据都被用于训练和测试。 - Rob
1个回答

72

我找到了答案,这个方法似乎有效:

from sklearn.model_selection import GroupShuffleSplit 

splitter = GroupShuffleSplit(test_size=.20, n_splits=2, random_state = 7)
split = splitter.split(df, groups=df['Group_Id'])
train_inds, test_inds = next(split)

train = df.iloc[train_inds]
test = df.iloc[test_inds]

10
应该改为n_splits=1吗?尽管使用n_splits=2仍然可以实现,但会生成一个从未使用的额外数据集。 - Iakov Davydov
1
拆分的数量决定了训练集和测试集的相对大小。如果想要50:50,则需要使用n_splits=2,80:20则使用n_splits=5等。 - David Waterworth
如果我们想要分割数据集时保持整个组的完整性,但同时又想进行分层(以保持类别的相同比例),该如何混合使用组内分割和分层分割方法呢? - skan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接