我正在尝试将我的numpy
数据点数组拆分为测试和训练集。为此,我随机选择数组中的行作为训练集,剩下的就是测试集。
这是我的代码:
matrix = numpy.loadtxt("matrix_vals.data", delimiter=',', dtype=float)
matrix_rows, matrix_cols = matrix.shape
# training set
randvals = numpy.random.randint(matrix_rows, size=50)
train = matrix[randvals,:]
test = numpy.delete(matrix, randvals, 0)
print matrix.shape
print train.shape
print test.shape
但我得到的输出是:
matrix.shape: (130, 14)
train.shape: (50, 14)
test.shape: (89, 14)
这显然是错误的,因为来自train和test的行数应该加起来矩阵中的总行数,但这里显然更加。任何人都可以帮我弄清楚出了什么问题吗?
答案 0 :(得分:4)
因为您使用替换生成随机整数,所以randvals
几乎肯定会包含重复索引。
使用重复索引进行索引将多次返回同一行,因此matrix[randvals, :]
可确保为您提供恰好50行的输出,无论其中是否有一些行重复。
相比之下,np.delete(matrix, randvals, 0)
只会移除唯一行索引,因此它只会减少行数randvals
中唯一值的数量。
尝试比较:
print(np.unique(randvals).shape[0] == matrix_rows - test.shape[0])
# True
要生成0到1 - matrix_rows
之间唯一随机索引的向量,您可以将np.random.choice
与replace=False
一起使用:
uidx = np.random.choice(matrix_rows, size=50, replace=False)
然后matrix[uidx].shape[0] + np.delete(matrix, uidx, 0).shape[0] == matrix_rows
。
答案 1 :(得分:3)
为什么不使用scikit学习train_test_split功能而避免一切麻烦?
import numpy as np
from sklearn.cross_validation import train_test_split
train, test = train_test_split(mat, test_size = 50.0/130.0)