使用sklearn创建训练和验证集分割

我有一个由X和Y组成的训练集,X的形状为(4000,32,1),Y的形状为(4000,1)。

我想根据分割创建一个训练/验证集。我尝试做如下操作:

from sklearn.model_selection import StratifiedShuffleSplit
sss = StratifiedShuffleSplit(test_size=0.1, random_state=23)
for train_index, valid_index in sss.split(X, Y):
    X_train, X_valid = X[train_index], X[valid_index]
    y_train, y_valid = Y[train_index], Y[valid_index]

运行程序时,出现了与上述代码段相关的错误消息:

for train_index, valid_index in sss.split(X, Y):
ValueError: The least populated class in y has only 1 member, which is too few. The minimum number of groups for any class cannot be less than 2.

我对上述错误消息不太清楚,如何正确地为上述训练集创建训练/验证集分割?


回答:

这有点奇怪,因为我复制/粘贴了你的代码,并使用了sklearn的乳腺癌数据集,如下所示:

from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
X, Y = cancer.data, cancer.target
from sklearn.model_selection import StratifiedShuffleSplit
sss = StratifiedShuffleSplit(test_size=0.1, random_state=23)
for train_index, valid_index in sss.split(X, Y):
        X_train, X_valid = X[train_index], X[valid_index]
        y_train, y_valid = Y[train_index], Y[valid_index]

这里X.shape = (569, 30)Y.shape = (569,),我没有遇到错误,例如y_valid.shape = 57或569的十分之一。

我建议你将X重塑为(4000,32)(同样将Y重塑为(4000)),因为Python可能会将其视为一个大元素的列表(顺便说一下,我使用的是Python 2.7)。

为了回答你的问题,你可以选择使用train_test_split

from sklearn.model_selection import train_test_split

根据帮助文档:

将数组或矩阵随机分割成训练和测试子集。快速实用工具,包装输入验证和“next(ShuffleSplit().split(X, y))“

基本上是你想要做的操作的包装器。你可以指定训练和测试的大小,随机状态,如果你想对数据进行分层或打乱等。

使用起来很简单,例如:

X_train, X_valid, y_train, y_valid = train_test_split(X,Y, test_size = 0.1, random_state=0)

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注