Python3,具有均匀分布的分割数据集,无需改组

时间:2017-03-07 08:37:48

标签: python-3.x machine-learning split

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

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]
你能帮帮我吗?感谢

2 个答案:

答案 0 :(得分:0)

你可以进行10的排列并将其作为你的指数并选择第一个n用于火车,其余用于测试。从技术上讲,你没有改组数据,但你已经改变了指数。希望这能解决你的问题。

np.random.permutation(10)

答案 1 :(得分:0)

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

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]