resample - 无法单独创建训练集和测试集

resample - can't create training and test sets separately

我正在使用自举技术来评估 MLPClassifier 并且我正在使用 scikit.utils.resample 来获取不同的随机样本,但是 x_testy_test 正在返回空:

seeds = [50,51,52,53,54]
for i in range(5): # number of bootstrap samples
    X_train, y_train = resample(X, y, n_samples=len(X), random_state=seeds[i], stratify=y)
    X_test = [x for x in X if x not in X_train] # test = samples that weren't selected for train
    y_test = [y for y in y if y not in y_train] # test = samples that weren't selected for train

    X_test
    # []

我做错了什么? / 有更好的方法吗?很难相信 sklearn 没有提供更好的方法。

你的第一个列表理解在这里不起作用,因为 in 运算符不适用于 2D numpy 数组。

让我们首先使用虚拟数据重现您的问题:

from sklearn.utils import resample
import numpy as np

X = np.array([[1., 0.], [2., 1.], [0., 0.]])
y = np.array([0, 1, 2])

X_train, y_train = resample(X, y, random_state=0)
X_train
# result
array([[ 1.,  0.],
       [ 2.,  1.],
       [ 1.,  0.]])

到目前为止一切顺利;但是,正如我所说,列表理解将不起作用,因为您已经发现自己:

X_test = [x for x in X if x not in X_train]
X_test
# []

原因是 in 运算符不适用于 2D numpy 数组。

将您的初始 X 转换为列表可解决问题:

X = X.tolist()

X_train, y_train = resample(X, y, random_state=0)
X_train
# [[1.0, 0.0], [2.0, 1.0], [1.0, 0.0]] # as previous result
X_test = [x for x in X if x not in X_train]
X_test
# [[0.0, 0.0]]

正如预期的那样,我们在 X_test 中得到 X 中唯一不存在于 X_train 中的元素,即 [[0.0, 0.0]].

相反,y 是一维 numpy 数组,列表理解中的 in 运算符将起作用:

y_test = [y for y in y if y not in y_train]
y_test
# [2]