ValueError:此求解器需要数据中至少 2 个类的样本,但数据仅包含一个类:1.0

Posted

技术标签:

【中文标题】ValueError:此求解器需要数据中至少 2 个类的样本,但数据仅包含一个类:1.0【英文标题】:ValueError: This solver needs samples of at least 2 classes in the data, but the data contains only one class: 1.0 【发布时间】:2016-11-03 10:22:30 【问题描述】:

我有一个包含 8670 个试验的训练数据集,每个试验的样本长度为 125 次,而我的测试集包含 578 个试验。当我从 scikit-learn 应用 SVM 算法时,我得到了很好的结果。

但是,当我应用逻辑回归时,会出现此错误:

"ValueError: 这个求解器需要数据中至少2个类的样本,但是数据只包含一个类:1.0" .

我的问题是为什么 SVM 能够给出预测但逻辑回归给出了这个错误?

有没有可能是数据集中有问题,或者只是逻辑回归无法分类,因为训练样本看起来很相似?

【问题讨论】:

请发布最少的运行代码,包括产生错误的示例数据。 您的代码有问题,SVM 和 LR 都不能与单个类一起工作,它们都会抛出相同的错误。 我很想对下面的答案投赞成票!如果它解决了你的问题!谢谢! 【参考方案1】:

我在类似线性模块的以下问题中读到了这一点:https://github.com/lensacom/sparkit-learn/issues/49

“遗憾的是,这确实是一个错误。Sparkit 并行训练 sklearn 的线性模型,然后在 reduce 步骤中对其进行平均。至少有一个块,其中仅包含一个标签。要检查,请尝试以下操作:

train_Z[:, 'y']._rdd.map(lambda x: np.unique(x).size).filter(lambda x: x < 2).count()

要解决您可以随机化训练数据以避免带有一个标签的块,但这仍在等待一个聪明的解决方案。”

编辑:我找到了解决办法,上面对错误的分析是正确的。这将是一个解决方案。

为了以相同的顺序随机排列数组,我使用了 scikitlearn utils 模块:

from sklearn.utils import shuffle
X_shuf, Y_shuf = shuffle(X_transformed, Y)

然后使用那些打乱的数组再次训练你的模型,它会工作的!

【讨论】:

很棒的男人!真的很有帮助

以上是关于ValueError:此求解器需要数据中至少 2 个类的样本,但数据仅包含一个类:1.0的主要内容,如果未能解决你的问题,请参考以下文章

ValueError:估计器 LogisticRegression 的参数求解器无效

LightGBM 错误:ValueError:对于提前停止,评估需要至少一个数据集和评估指标

Python 3 - ValueError: 找到包含 0 个样本的数组 (shape=(0, 11)),而 MinMaxScaler 至少需要 1

ValueError:找到的数组带有0个样本(形状=(0,35)),而StandardScaler至少需要1个]]

Python - groupby 多列 - ValueError:分组器和轴必须相同的长度

Sklearn LogisticRegression求解器需要2类数据