【发布时间】:2019-04-22 01:39:15
【问题描述】:
我正在处理多标签数据,我想使用分层抽样。假设我有 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 函数(在我需要分层之前),它恰好有一个参数分层。当前的行为是将 multi_label 行为变成多类行为(我们认为 [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.")
来自 StratifiedShuffleSplit 类的 _iter_indices 的 sklearn/model_selection/_split.py:
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 个元素的标签完全在训练集中。这正常吗?
其他问题:这是解决此问题的好方法,还是您认为有更好的方法可以在 multi_label 中对 train_test_split 进行分层?
【问题讨论】:
标签: python scikit-learn