ValueError: n_splits=10 不能大于每个类的成员数

Posted

技术标签:

【中文标题】ValueError: n_splits=10 不能大于每个类的成员数【英文标题】:ValueError: n_splits=10 cannot be greater than the number of members in each class 【发布时间】:2018-06-27 01:24:42 【问题描述】:

我正在尝试运行以下代码:

from sklearn.model_selection import StratifiedKFold 
X = ["hey", "join now", "hello", "join today", "join us now", "not today", "join this trial", " hey hey", " no", "hola", "bye", "join today", "no","join join"]
y = ["n", "r", "n", "r", "r", "n", "n", "n", "n", "r", "n", "n", "n", "r"]

skf = StratifiedKFold(n_splits=10)

for train, test in skf.split(X,y):  
    print("%s %s" % (train,test))

但我收到以下错误:

ValueError: n_splits=10 cannot be greater than the number of members in each class.

我看过这里scikit-learn error: The least populated class in y has only 1 member,但我仍然不确定我的代码有什么问题。

我的列表的长度都是 14 print(len(X)) print(len(y))

我的部分困惑是我不确定 members 的定义是什么以及 class 在这种情况下是什么。

问题:如何解决错误?什么是会员?什么是班级? (在这种情况下)

【问题讨论】:

请查看我的答案以了解错误的解释。但是为了解决这个问题,我需要知道你为什么使用 StratifiedKFold,而不是其他任何东西。你的目标是什么? 我有一个包含 2163 条推文的列表,我标记为“n”和“r”(我更正了上面的错字……不包括 "y")。我想用更短的Xy 列表来复制错误。这个想法是对数据集执行 10 折交叉验证。这就是为什么我想使用n_split = 10。我使用分层是因为有 2000 个n 和 163 个y。我认为保持这些比率的一致是可取的 嗯,好的。在这种情况下,在原始数据集上使用 StratifiedKFold 应该可以工作。 【参考方案1】:

分层的意思是保持每一折中每一类的比例。因此,如果您的原始数据集有 3 个类别,比例分别为 60%、20% 和 20%,那么分层将尝试在每个折叠中保持该比例。

在你的情况下,

X = ["hey", "join now", "hello", "join today", "join us now", "not today",
     "join this trial", " hey hey", " no", "hola", "bye", "join today", 
     "no","join join"]
y = ["n", "r", "n", "r", "r", "n", "n", "n", "n", "y", "n", "n", "n", "y"]

您共有 14 个样本(成员)的分布:

class    number of members         percentage
 'n'        9                        64
 'r'        3                        22
 'y'        2                        14

因此 StratifiedKFold 将尝试在每个折叠中保持该比率。现在您已经指定了 10 个折叠 (n_splits)。所以这意味着在一个单一的折叠中,对于类“y”保持比例,至少 2 / 10 = 0.2 个成员。但是我们不能提供少于 1 个成员(样本),所以这就是它在那里抛出错误的原因。

如果你设置了n_splits=2 而不是n_splits=10,那么它会起作用,因为'y' 的成员数将是2 / 2 = 1。要使n_splits = 10 正常工作,你每个班级至少需要 10 个样本。

【讨论】:

您使用什么命令来获取摘要编号?班级人数百分比 @Michael 对于这个例子,我是手动计算的。对于更大的数组,您可以使用具有此类功能的 pandas 或 numpy。 好极了,是的,我想知道这些模块是否像 R 中那样具有汇总功能 这个答案确实是最合适的!面临同样的问题!

以上是关于ValueError: n_splits=10 不能大于每个类的成员数的主要内容,如果未能解决你的问题,请参考以下文章

Colab 中的 TensorFlow 错误 - ValueError: Shapes (None, 1) 和 (None, 10) 不兼容

Python Scikit Learn 错误:ValueError:“找到样本数量不一致的输入变量:[4, 10]”

sklearn ShuffleSplit 出现“__init__() 参数 'n_splits' 的多个值”错误

ValueError: int() 以 10 为底的无效文字:''

错误:__init__() 有一个意外的关键字参数“n_splits”

ValueError: int() 以 10 为底的无效文字:'196.41'