Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python3,使用均匀分布拆分数据集,无需洗牌_Python 3.x_Machine Learning_Split - Fatal编程技术网

Python 3.x Python3,使用均匀分布拆分数据集,无需洗牌

Python 3.x Python3,使用均匀分布拆分数据集,无需洗牌,python-3.x,machine-learning,split,Python 3.x,Machine Learning,Split,我有两个数据集:X和y。我想把它们分为训练集和测试集。我想保持他们数据的顺序(没有随机洗牌)。以以下代码为例。X有10行(y相同)。我想要的结果是,X_列大约占总行数的2/3,X_测试大约占总行数的1/3。最重要的是,X_列不应该只是从0到6行,而是应该尽可能均匀地从0到9行选择行。这同样适用于X_测试 import numpy as np X = np.arange(50).reshape(10,5) y = np.arange(10) test_size = 0.33 n_total =

我有两个数据集:X和y。我想把它们分为训练集和测试集。我想保持他们数据的顺序(没有随机洗牌)。以以下代码为例。X有10行(y相同)。我想要的结果是,X_列大约占总行数的2/3,X_测试大约占总行数的1/3。最重要的是,X_列不应该只是从0到6行,而是应该尽可能均匀地从0到9行选择行。这同样适用于X_测试

import numpy as np
X = np.arange(50).reshape(10,5)
y = np.arange(10)

test_size = 0.33
n_total = X.shape[0]  # total number of rows
n_train = int(test_size*n_total)

# The following is bad example, since X_train picks rows from 0 to 6.
X_train, X_test = X[:n_train], X_test[n_train:]

# Wanted result: X_train and X_test are distributed across the total rows, as evenly as possible.
X_train = X[0], X[2], X[3], X[4], X[6], X[7], X[8]
X_test = X[1], X[5], X[9]

你能帮帮我吗?谢谢

您可以将10作为一个排列,并将其用作索引,然后选择第一个n作为训练,其余的用于测试。从技术上讲,你没有洗牌的数据,但你洗牌的指数。希望这能解决你的问题

np.random.permutation(10)

通过使用包含随机抽样索引的排序列表,可以获得所需的列车和试验拆分,其中列表的长度将等于所需拆分大小。下面的代码实现了上述解决方案,以获得所需的结果

import numpy as np
from random import sample

y         = np.arange(10)
len_y     = y.shape[0]

'''Indices of test split
'''
test_size = round(0.33*len_y)                 % as you required 1/3 percent test split
ind_test  = sample(range(len_y), test_size)   % randomly sampled indices
ind_test.sort()                               % sorted list of randomly sampled indices

'''Indices of train split
'''
ind_train = list(set(range(len_y)) - set(ind_test))     % set of all indices - set of test indices

'''Required splits
'''
y_train = y[ind_train]
y_test  = y[ind_test]

谢谢你的回答。但这并不能完全解决我的问题。我还希望测试数据集均匀分布。在你的建议中,我可能会得到
[6、8、7、0、4、9、1、5、2、3]
。然后,如果我选择最后三个元素作为测试集,
[5,2,3]
。这三个值都在0到5之间,分布不均匀。一个理想的结果是
[1,5,9]
。谢谢你的回答。这并不能完全解决我的问题。我希望测试样品尽可能均匀地分布。这意味着,如果从10个测试样本中选取3个,最好是[0,1,2,3]中的一个,[4,5,6]中的一个,以及[7,8,9]中的一个。