我正在根据组值在训练和测试集中分割一些数据。如何才能获得平衡的数据?在
为了解决二元分类任务,我有100个样本,每个样本都有一个唯一的ID一个主题和一个标签(1或0)。在
为了避免在一个人物识别任务中退化,我需要同一个主题不能同时出现在训练和测试集中。在
受试者的数量少于样本数量(57),一些受试者只出现在一个样本中,而在许多具有相同或不同标签的样本中。在
我可以简单地用sklearn的gropKfold来做,但我希望我的数据是平衡的(或者至少接近平衡)
我尝试使用以下代码:
n_shuffles = 2
group_k_fold = GroupKFold(n_splits=5)
for i in range(n_shuffles):
X_shuffled, y_shuffled, groups_shuffled = shuffle(idx, labels, subjects, random_state=i)
splits = group_k_fold.split(X_shuffled, y_shuffled, groups_shuffled)
for train_idx, val_idx in splits:
X = perezDataFrame.loc[perezDataFrame['ID'].isin(X_shuffled[train_idx]),AU_names].values
X = preprocessing.normalize(X, norm='l2')
y = perezDataFrame.loc[perezDataFrame['ID'].isin(X_shuffled[train_idx]),'label'].values
XTest = perezDataFrame.loc[perezDataFrame['ID'].isin(X_shuffled[val_idx]),AU_names].values
XTest = preprocessing.normalize(XTest, norm='l2')
yTest = perezDataFrame.loc[perezDataFrame['ID'].isin(X_shuffled[val_idx]),'label'].values
其中idx、subjects和labels分别是ID、subjects和labels的列表。在
但数据非常不平衡。在
我也试过了:
^{pr2}$但这不是Kfold,所以我不能保证同一个样品只保留一个折。在
所以我不认为有一个默认的scikit learn crossvalidator可以实现您想要的,但是应该可以创建一个。在
我的方法是循环检查所有的科目,然后贪婪地将他们分配到测试集中的一部分,这取决于分配对折叠的大小以及目标类比率的改善程度。在
我生成了一些与您的问题类似的示例数据:
然后我们可以使用下面的代码片段进行赋值
^{pr2}$并验证它是否如我们预期的那样工作:
变量命名可以在这里和那里得到改进,但总的来说,我认为这种方法可以解决您的问题。在
在scikit-learn兼容的crossvalidator中实现这一点看起来像这样,尽管它需要更多的重新设计。在
相关问题 更多 >
编程相关推荐