我提出这个问题,理由不多:
The least populated class in y has only 1 member, which is too few. The minimum number of labels for any class cannot be less than 2. --我删除了每个标签中类计数<2的类。我不知道为什么会出现这个错误。
所以,我想自己去实施分层抽样。在此,我需要帮助破译问题的原因,并在多标签分类中实施分层抽样,以便在培训期间也能很好地适用于个别批次。
发布于 2018-06-13 11:52:47
这里的错误似乎是因为您需要训练和测试数据(因此需要两个数据集),这意味着每个类必须出现在每个数据集中。这意味着每个类必须至少有两个样本。它是实现train_test_split的人的设计选择。我想从技术上讲,这可能不是stratified。
您可以看到它是在SciKit学习源代码中在class StratifiedShuffleSplit中实现的:
classes, y_indices = np.unique(y, return_inverse=True)
n_classes = classes.shape[0]
class_counts = np.bincount(y_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.")np.unique查找y中每个类的索引。因为选项return_inverse=True被传递,它返回一个索引数组,该数组将允许对输入数组y进行完全重构。这意味着,要获得存在的类的总数,您需要使用np.bincount;创建class_counts。
最后的检查是class_counts是否小于要创建的数据集的数量。如果是的话,那么您就不能对数据创建一个正确的分层分割--因此您将得到一个错误。
至于如何创建自己的版本:我实现分层抽样的一种方法是使用直方图,更具体地说,使用NumPy的histogram函数。对于连续标签(即非离散类),它工作得很好--而且我没有考虑多标签问题,所以您可能不得不调整我的建议,允许它满足您的需要。
其主要思想是将标签分割成一个直方图的回收箱,然后从这些垃圾箱中随机抽取样本,并选择允许重复。这正是解决类中<2个标签的具体问题的部分。我意识到这并不能具体地回答你的问题,但也许它会给你一些新的想法。
如果复制没有意义,或者在您的实验中被严格禁止,那么您可以考虑以某种方式合并较小的类,这样每个类就有>2个标签。这可能比删除它们更有用,但它是否可行将取决于您的数据。
发布于 2019-05-24 14:53:53
您可以在技能库中使用多标签数据分层。
发布于 2019-07-10 14:47:41
这是因为分层的性质。stratify参数将其设置为拆分数据,以便将test_size数据量分配给每个类。在这种情况下,您没有足够的类标签来保持一个(或多个)类的数据分割率等于test_size。
https://datascience.stackexchange.com/questions/33076
复制相似问题