我有一只熊猫dataframe
,其中数据的排列方式如下:
filename label
0 4456723 0
1 4456723_01 0
2 4456723_02 0
3 ab43912 1
4 ab43912_01 1
5 ab43912_03 1
... ... ...
我想将此dataframe
随机分成training
和validation
组。虽然这样做会引起泄漏,因为这些文件是略有变化的图像,但以不同的名称表示,例如ab43912, ab43912_01, ab43912_03
,都是相同的图像,但都有一些变化。
有没有一种有效的方法可以将这些文件分组,然后进行不引起泄漏的分割?
答案 0 :(得分:2)
您可以手动手动选择约80%的唯一文件句柄。
df = pd.DataFrame({'filename': list('aaabbbcccdddeeefff')})
df['filename'] = df['filename'] + ['', '_01', '_02']*6
# Get the unique handles
files = df.filename.str.split('_').str[0]
# Randomly select ~80%.
m = files.isin(np.random.choice(files.unique(), int(files.nunique()*0.8), replace=False))
# Split
train, test = df.loc[m], df.loc[~m]
实际上,由于N较小,我们进行了2 / 3-1 / 3的分配
train
:
filename
0 a
1 a_01
2 a_02
6 c
7 c_01
8 c_02
12 e
13 e_01
14 e_02
15 f
16 f_01
17 f_02
test
:
filename
3 b
4 b_01
5 b_02
9 d
10 d_01
11 d_02