python中的分层采样,有约束

时间:2019-05-07 15:18:10

标签: python pandas dataframe scikit-learn

我有一个带有观察结果的数据框

data = [['red', 1, 0.2], ['blue', 1, 0.5], ['green', 2, 0.8], ['blue', 2, 0.55], ['blue', 2, 0.52], ['red', 3, 0.15], ['green', 3, 0.85], ['red', 4, 0.12], ['purple', 4, 0.01]] 

df = pd.DataFrame(data, columns = ['label', 'signal', 'value']) 

   label    signal  value
0   red     1   0.20
1   blue    1   0.50
2   green   2   0.80
3   blue    2   0.55
4   blue    2   0.52
5   red     3   0.15
6   green   3   0.85
7   red     4   0.12
8   purple  4   0.01

我想对标签进行分层的k倍采样,但是我需要以这样一种方式进行操作,即不会将信号值拆分成多个折叠。我已经完成了一个仅利用字典和复杂检查的实现。我想知道是否有更简单的方法来解决这个问题?

K = 2的结果可能是:

batch 1
0   red     1   0.20
1   blue    1   0.50
5   red     3   0.15
6   green   3   0.85

batch 2
2  green    2   0.80
3   blue    2   0.55
4   blue    2   0.52
7   red     4   0.12
8   purple  4   0.01

第2批中有2个红色,1个蓝色,1个绿色和第2批中有1个红色,2个蓝色,1个绿色,1个紫色。在这种情况下,这两个批次在类内容方面是平衡的我想要的。

1 个答案:

答案 0 :(得分:1)

我认为您正在寻找scikit-learn中内置的GroupShuffleSplit函数: sklearn.model_selection.GroupShuffleSplit