我正在处理多标签数据,并希望使用分层抽样。假设我有10个类别,我们称它们为'ABCDEFGHIJ'。我有一个数据框,其中有10列对应于每个标签,包含有关条目的其他信息。我可以在n_entry * 10矩阵中提取那些10列,我将其称为label_values。
例如,label_values的一行如[0,0,1,1,0,0,0,0,0,0],这一行表示该条目具有标签C和标签D。
我想将我的数据拆分成训练集和验证集,并且希望在训练集和验证集中有相同比例的每个标签。为了进行拆分,我以前使用Sklearn train_test_split函数(在需要分层之前),它恰好有一个stratify参数。当前行为是将多标签行为转换为多类行为(我们认为[A,B]是与A类和B类完全不同的新品牌)。因此,有一些只有1个元素的类别,这会触发错误:
我的解决办法是覆盖此方法以删除此检查。这有效,我在训练和验证之间获得了更好的标签重新分配。然而,我的其中一个具有2个元素的标签完全在训练集中。这正常吗?
另一个问题:这是处理此问题的正确方式吗?还是您认为有更好的方法来获取多标签的分层训练测试拆分?
例如,label_values的一行如[0,0,1,1,0,0,0,0,0,0],这一行表示该条目具有标签C和标签D。
我想将我的数据拆分成训练集和验证集,并且希望在训练集和验证集中有相同比例的每个标签。为了进行拆分,我以前使用Sklearn train_test_split函数(在需要分层之前),它恰好有一个stratify参数。当前行为是将多标签行为转换为多类行为(我们认为[A,B]是与A类和B类完全不同的新品牌)。因此,有一些只有1个元素的类别,这会触发错误:
ValueError("The least populated class in y has only 1"
" member, which is too few. The minimum"
" number of groups for any class cannot"
" be less than 2.")
来自sklearn/model_selection/_split.py文件中的StratifiedShuffleSplit类的_iter_indices方法:
if np.min(class_counts) < 2:
raise ValueError("The least populated class in y has only 1"
" member, which is too few. The minimum"
" number of groups for any class cannot"
" be less than 2.")
我的解决办法是覆盖此方法以删除此检查。这有效,我在训练和验证之间获得了更好的标签重新分配。然而,我的其中一个具有2个元素的标签完全在训练集中。这正常吗?
另一个问题:这是处理此问题的正确方式吗?还是您认为有更好的方法来获取多标签的分层训练测试拆分?