【发布时间】:2019-07-14 19:14:59
【问题描述】:
我有以下数据:
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 你能举个例子吗?过去我非常依赖 sklearn,以至于我完全不知道如何以其他方式进行拆分。
-
我可以想到两种方法,但这取决于您的完整数据集。 1)假设您在数据集中有 10 条记录,然后根据 groupid 对数据集进行排序,然后只使用 train = df.iloc[:8,:], test = df.iloc[8:,:] 2)使用条件子集。就像制作组列表一样。对于考试- a = [5,6] 并使用 df['groupid].isin(a)
-
@AdityaKansal 数据大小约为 4 GB。我可以使用 sklearn 的 GroupShuffleSplit 之类的东西吗?
-
另外,您应该使用 K-folding 进行训练和测试。在这里,您将数据分成 k(通常 k=10)随机集,然后循环 k 次,每次使用 (k-1) 集进行训练,使用 1 集进行测试。 (每个循环一个不同的)这将确保所有数据都用于训练、测试。
标签: python-3.x pandas machine-learning grouping train-test-split