如何随机将数据集拆分为Python中的训练集,测试集和开发集?

时间:2016-05-09 11:09:43

标签: python machine-learning scikit-learn

我有一个大型数据集,想要将数据集随机分成70%的列车,25%的测试和5%的开发。如何使用scikit-learn在Python中执行此操作?

我想知道我们是否使用sklearn.cross_validation.train_test_split(* arrays,** options)函数执行此操作,如以下链接中的示例所示?

http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.train_test_split.html

3 个答案:

答案 0 :(得分:2)

您可以使用:

from numpy.random import multinomial

n_total_samples = 1000 # or whatever it is

indices = np.arange(n_total_samples)
inds_split = multinomial(n=1,
                         pvals=[0.7, 0.25, 0.05],
                         size=n_total_samples).argmax(axis=1)

train_inds = indices[inds_split==0]
test_inds  = indices[inds_split==1]
dev_inds   = indices[inds_split==2]

print len(train_inds) / float(n_total_samples) # => 0.713
print len(test_inds) / float(n_total_samples)  # => 0.24
print len(dev_inds) / float(n_total_samples)   # => 0.047

它没有内置功能那么漂亮,但我相信它能满足您的需求。

答案 1 :(得分:2)

好问题 - 可以使用sklearn使用两个连续分割来完成:

import numpy as np
from sklearn.cross_validation import train_test_split

X = np.random.random((10000, 10))
y = np.random.random(10000)

test_size = 0.25
holdout_size = 0.05

X_train, X_temp, y_train, y_temp = train_test_split(X, y, 
                                     test_size = test_size + holdout_size)

X_test, X_holdout, y_test, y_holdout = train_test_split(X_temp, y_temp,
                         test_size = holdout_size / (test_size + holdout_size))

print len(X_train)   # => 7000
print len(X_test)    # => 2499
print len(X_holdout) # => 501

答案 2 :(得分:1)

为什么不只是一个简单的random.shuffle?然后根据您的需要将其切片。

应该是这样的:

import random
random.shuffle(yourTestSet) 

顾名思义,将随机重新排列您的样本。

train_set, test_set, dev_set = yourTestSet[:70], yourTestSet[70:95], yourTestSet[95:]

以上代码适用于100个样本,根据需要调整数字或使用len()* x,如果您不知道确切的大小。

编辑:fafnir1990在评论中建议。