我在每个类中都有三个以上的元素,但是我收到了这个错误:“scikit-learn 中的类不能小于 k=3”

Posted

技术标签:

【中文标题】我在每个类中都有三个以上的元素,但是我收到了这个错误:“scikit-learn 中的类不能小于 k=3”【英文标题】:I have much more than three elements in every class, but I get this error: "class cannot be less than k=3 in scikit-learn" 【发布时间】:2013-02-02 10:10:50 【问题描述】:

这是我的目标(y):

target = [7,1,2,2,3,5,4,
      1,3,1,4,4,6,6,
      7,5,7,8,8,8,5,
      3,3,6,2,7,7,1,
      10,3,7,10,4,10,
      2,2,2,7]

我在执行时不知道为什么:

...
# Split the data set in two equal parts
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.5, random_state=0)

# Set the parameters by cross-validation
tuned_parameters = ['kernel': ['rbf'], 'gamma': [1e-3, 1e-4],
                 'C': [1, 10, 100, 1000],
                'kernel': ['linear'], 'C': [1, 10, 100, 1000]]

scores = ['precision', 'recall']

for score in scores:
    print("# Tuning hyper-parameters for %s" % score)
    print()

    clf = GridSearchCV(SVC(C=1), tuned_parameters)#scoring non esiste
    # I get an error in the line below
    clf.fit(X_train, y_train, cv=5)
...

我收到此错误:

Traceback (most recent call last):
  File "C:\Python27\SVMpredictCROSSeGRID.py", line 232, in <module>
clf.fit(X_train, y_train, cv=5)  #The minimum number of labels for any class cannot be less than k=3.
File "C:\Python27\lib\site-packages\sklearn\grid_search.py", line 354, in fit
return self._fit(X, y)
File "C:\Python27\lib\site-packages\sklearn\grid_search.py", line 372, in _fit
cv = check_cv(cv, X, y, classifier=is_classifier(estimator))
File "C:\Python27\lib\site-packages\sklearn\cross_validation.py", line 1148, in check_cv
cv = StratifiedKFold(y, cv, indices=is_sparse)
File "C:\Python27\lib\site-packages\sklearn\cross_validation.py", line 358, in __init__
" be less than k=%d." % (min_labels, k))
ValueError: The least populated class in y has only 1 members, which is too few. The minimum number of labels for any class cannot be less than k=3.

【问题讨论】:

【参考方案1】:

该算法要求您的训练集中至少有 3 个标签实例。虽然您的target 数组包含每个标签至少 3 个实例,但是当您在训练和测试之间拆分数据时,并非所有训练标签都有 3 个实例。

您要么需要合并一些类标签,要么需要增加训练样本来解决问题。

【讨论】:

您也可以传递“cv”参数,例如“KFold”。顺便说一句,你有哪个版本,我认为 StratifiedKFold(默认 cv)的输入验证在新版本的 sklearn 中变得不那么严格。不过,在解释结果时要小心。它们可能没有那么有意义。 @AndreasMueller,没有尝试过 StratifiedKFold 的输入验证。我一定会检查的。感谢您的建议。【参考方案2】:

如果您无法拆分测试集和训练集,并且在每个折叠中填充了足够多的每个类,请尝试更新 Scikit 库。

pip install -U scikit-learn

您将收到与警告相同的消息,因此您可以运行代码。

【讨论】:

以上是关于我在每个类中都有三个以上的元素,但是我收到了这个错误:“scikit-learn 中的类不能小于 k=3”的主要内容,如果未能解决你的问题,请参考以下文章

确定 UITableViewCell 中的 UIButton

来自 Siebel 的 SOAP 请求在每个元素中都有命名空间

JPA 表继承和对象映射

IBOutlet 在 IBDesignable 类中为零

使用 JS 在每个页面中都有相同的导航栏

JS 函数 - 比较 2 个对象数组(每个数组中都有数组对象)