在作为SVC包装器的自定义估算器上使用GridSearchCV时,出现错误:
“ ValueError:类数必须大于一;必须有1个类”
定制估算器的目的是将gridsearch参数添加到估算器,并且看起来工作正常。
使用调试器,我发现确实为估计器提供了仅一类的训练集,因此出现了两种可能性:
估计器应处理仅一类的集合
GridSearchCV都不应该给出仅一类的集合
当我从SVC.fit调用中得到一个错误,并且似乎SVC不应接收仅一类的集合时,我认为这是第二个选择。但是我查看了GridSearchCV的实现,但是没有发现它可以检查是否存在仅一类折叠或为什么折叠会失败的地方。
我在交叉验证中使用了网格搜索来进行嵌套的交叉验证:
gs = GridSearchCV(clf.gs_clf.get_gs_clf(), parameter_grid, cv=n_inner_splits, iid=False)
gs.fit(*clf.get_train_set(X, y, train_index))
最佳答案
正如您在问题中已经提到的那样,问题在于交叉验证拆分不包括第二类数据。这可能是由于您的数据存在不平衡类问题,当执行分层的n_inner_splits
折叠时,会错过此欠采样类。
为了克服这个问题,您可以尝试以下方法之一:
1-根据采样不足的类数据的百分比和您拥有的实例数减少n_inner_splits
。
2-除了将整数传递给gridsearch的cv参数外,您还可以对自身进行拆分,然后将其传递给可迭代的屈服(训练,测试)数据,以确保始终代表2个类。
3-在采样类下为此生成/获取更多数据。
查看cv参数文档以了解解决此here的其他方法。