使用 sklearn 创建训练验证拆分

create training validation split using sklearn

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

我想根据拆分创建一个 training/validation 集合。这是我一直在努力做的事情

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.

我不是很清楚上面的错误信息,请问如何为上面的训练集创建一个 training/validation split 的正确方法?

有点奇怪,因为我 copy/pasted 你的代码与 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

根据帮助

Split arrays or matrices into random train and test subsets Quick utility that wraps input validation and ``next(ShuffleSplit().split(X, y))`

基本上是你想做的事情的包装。然后,您可以指定训练和测试大小,random_state,如果您想对数据进行分层或打乱等等。

它很容易使用例如:

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