我已经上传了一个虚拟数据集,df.head()
:
它总共有4 个类df.object.value_counts():
human 23
car 13
cat 5
dog 3
我想对K-Fold多类对象检测数据集进行正确的验证分割。
初步方法
为了实现正确的 k 倍验证分割,我考虑了object counts和 的数量bounding box。据我了解,K-fold拆分策略主要取决于数据集(元信息)。但现在对于这些数据集,我尝试了如下操作:
skf = StratifiedKFold(n_splits=3, shuffle=True, random_state=101)
df_folds = main_df[['image_id']].copy()
df_folds.loc[:, 'bbox_count'] = 1
df_folds = df_folds.groupby('image_id').count()
df_folds.loc[:, 'object_count'] = main_df.groupby('image_id')['object'].nunique()
df_folds.loc[:, 'stratify_group'] = np.char.add(
df_folds['object_count'].values.astype(str),
df_folds['bbox_count'].apply(lambda x: f'_{x // 15}').values.astype(str)
)
df_folds.loc[:, 'fold'] = 0
for fold_number, (train_index, val_index) in enumerate(skf.split(X=df_folds.index, y=df_folds['stratify_group'])):
df_folds.loc[df_folds.iloc[val_index].index, 'fold'] = fold_number
拆分后,我检查了它是否正常工作。到目前为止看起来还不错。
所有的褶皱都包含分层k-fold
样本,len(df_folds[df_folds['fold'] == fold_number].index)
并且彼此之间没有交集,set(A).intersection(B)
其中A
和B
是两个褶皱的指数值(image_id
)。但问题似乎是这样的:
Fold 0 has total: 18 + 2 + 3 = 23 bbox Fold 1 has total: 2 + 11 = 13 bbox Fold 2 has total: 5 + 3 = 8 bbox
但是,我无法确定这是否是完成此类任务的正确方法。我想要一些建议。上面的方法可以吗?或者有什么问题吗?或者有更好的方法!任何形式的建议将不胜感激。谢谢。
三国纷争
弑天下
繁星coding
相关分类