+---------+------------+-----------+-----------+
| note_id | subject_id | category | note |
+---------+------------+-----------+-----------+
| 1 | 1 | ECG | blah ... |
| 2 | 1 | Discharge | blah ... |
| 3 | 1 | Nursing | blah ... |
| 4 | 2 | Nursing | blah ... |
| 5 | 2 | Nursing | blah ... |
| 6 | 3 | ECG | blah ... |
+---------+------------+-----------+-----------+
有多个类别,它们不是平衡的,因此我需要确保训练、验证和测试集中所有类别的比例与原始数据集中的比例相同。这部分很好解决,我可以使用来自sklearn库的StratifiedShuffleSplit。
然而,我还需要确保每个主题的观察结果没有分散在训练、验证和测试数据集中。为了确保我的训练模型在验证/测试时从未见过该主题,给定主题中的所有观测结果都需要在同一个集合中。例如,主题ID 1的每个观测结果应该在训练集中。
我无法想出一种方法来确保通过类别分层拆分,防止跨数据集污染(欠缺更好的说法),确保60:20:20的拆分并确保数据集以某种方式被混洗。感谢任何帮助!
编辑:
我现在已经学会了通过sklearn
的GroupShuffleSplit
函数按类别分组并在数据集拆分时保持组在一起。因此,我需要的是一个结合了分层和分组洗牌拆分的方法,即不存在的StratifiedGroupShuffleSplit
。Github问题:https://github.com/scikit-learn/scikit-learn/issues/12076
n_splits=int(1/desired_test_ratio)
。之后,你可以随机选择任何一个创建的折叠。如果你还想要训练-验证分割,可以在相应的训练分割中重复该过程,并使用相应的desired_val_ratio
。 - Juan Manuel Ortiz