如何将数据集拆分为训练集和测试集,例如交叉验证?

138 投票
14 回答
274077 浏览
提问于 2025-04-16 03:53

有没有什么好的方法可以把一个NumPy数组随机分成训练集和测试/验证集?这有点像Matlab里的cvpartitioncrossvalind函数。

14 个回答

44

只是提醒一下。如果你想要训练集、测试集和验证集都准备好,可以这样做:

from sklearn.model_selection import train_test_split

X = get_my_X()
y = get_my_y()
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
x_test, x_val, y_test, y_val = train_test_split(x_test, y_test, test_size=0.5)

这些参数会把70%的数据用于训练,15%的数据用于测试,另外15%的数据用于验证。希望这对你有帮助。

71

还有一个简单的方法,就是使用scikit-learn这个库。正如scikit的官方文档所说,你只需要按照下面的步骤操作:

from sklearn.model_selection import train_test_split

data, labels = np.arange(10).reshape((5, 2)), range(5)

data_train, data_test, labels_train, labels_test = train_test_split(data, labels, test_size=0.20, random_state=42)

这样,你就可以确保在把数据分成训练集和测试集的时候,标签是对应的,不会搞混。

168

如果你想把数据集分成两部分,可以用 numpy.random.shuffle,或者如果你需要保留索引的话,可以用 numpy.random.permutation(记得固定随机种子,这样每次运行结果都能一样):

import numpy
# x is your dataset
x = numpy.random.rand(100, 5)
numpy.random.shuffle(x)
training, test = x[:80,:], x[80:,:]

或者

import numpy
# x is your dataset
x = numpy.random.rand(100, 5)
indices = numpy.random.permutation(x.shape[0])
training_idx, test_idx = indices[:80], indices[80:]
training, test = x[training_idx,:], x[test_idx,:]

还有很多其他方法可以反复划分同一个数据集进行交叉验证。其中很多方法在 sklearn库中都有提供(比如k折交叉验证、留出法等)。sklearn 还包括一些更高级的 “分层抽样” 方法,这些方法可以创建一个在某些特征上比较平衡的数据划分,比如确保训练集和测试集中正负样本的比例相同。

撰写回答