我有一个由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)