对于 sklearn GridSearchCV,你如何保证每个折叠的训练集中都有类?

Posted

技术标签:

【中文标题】对于 sklearn GridSearchCV,你如何保证每个折叠的训练集中都有类?【英文标题】:For sklearn GridSearchCV, how can you guarantee classes will be represented in each fold's training set? 【发布时间】:2020-09-27 11:56:59 【问题描述】:

当使用 0 和 1 的输出进行 LogisticRegression 并使用 GridSearchCV 进行 5 折交叉验证时,我得到:

ValueError: This solver needs samples of at least 2 classes in the data, but the data contains only one class: False

这显然是因为我正在为这个特定分类器使用的数据拆分中的 True 或 1 值数量较少。如果选择拆分使得训练集只有上述 0,这似乎是一个浪费的折叠,因为分类器将返回 nan 作为分数。

有什么方法可以保证每个训练分组都包含两个类?

【问题讨论】:

【参考方案1】:

您正在寻找Stratified K-fold。这将保持折叠之间类的相对百分比。

【讨论】:

我在看那个,但不太确定。我唯一的问题是“四舍五入”。所以我猜对于一个 80/20 的分割,即使整个数据集中只有一个该类的情况,1 的 4/5 = 0.8 应该/将四舍五入到 1,以保证相同的例子总是出现在所有训练分组中? 如果您使用带有整数值的 cv 参数,文档声称 StratifiedKFold 方法将用于交叉验证。但是,我仍然得到ValueError('Only one class present in y_true. ROC AUC score is not defined in that case.'),这表明它没有起到作用。我想每个班级至少需要 2 个值,1 个必须在火车拆分中,1 个必须在测试拆分中,否则它将不起作用? 数据点不会被重复使用。如果折叠缺少一个类,它将不会在其他地方获取另一个数据点。关于您需要的数据点数量,取决于您拥有的折叠数量。假设您有 5 个折叠,您将需要 5 个少数类(每个折叠一个)。如果少数类的计数明显少于多数类,我将重新构建问题并使用异常检测模型。 谢谢,是的,我的问题就是这样。我有一个多标签问题,所以我建模为单独的二元分类器。如果我确实有

以上是关于对于 sklearn GridSearchCV,你如何保证每个折叠的训练集中都有类?的主要内容,如果未能解决你的问题,请参考以下文章

GridsearchCV sklearn 中的错误

你能从 sklearn 网格搜索 (GridSearchCV) 中获得所有估计器吗?

无法使用 sklearn 的 GridSearchCV 运行 tflearn

sklearn 中关于 GridSearchCV 的说明

GridSearchCV/RandomizedSearchCV 与 sklearn 中的 partial_fit

解读 sklearns 的 GridSearchCV 最佳成绩