我有一个大的numpy数组,当我运行scikit学习train_test_split将数组拆分为训练和测试数据时,我总是会遇到内存错误。什么是一种更有效的内存分割方法,以及为什么train_test_split会导致这种情况?
以下代码会导致内存错误并导致崩溃
import numpy as np
from sklearn.cross_validation import train_test_split
X = np.random.random((10000,70000))
Y = np.random.random((10000,))
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.33, random_state=42)
答案 0 :(得分:6)
我尝试过的一种方法是将X存储在pandas数据框中并随机播放
X = X.reindex(np.random.permutation(X.index))
因为我在尝试
时遇到了相同的内存错误np.random.shuffle(X)
然后,我将pandas数据帧转换回numpy数组并使用此函数,我可以获得列车测试分割
#test_proportion of 3 means 1/3 so 33% test and 67% train
def shuffle(matrix, target, test_proportion):
ratio = int(matrix.shape[0]/test_proportion) #should be int
X_train = matrix[ratio:,:]
X_test = matrix[:ratio,:]
Y_train = target[ratio:,:]
Y_test = target[:ratio,:]
return X_train, X_test, Y_train, Y_test
X_train, X_test, Y_train, Y_test = shuffle(X, Y, 3)
现在可以使用,当我想进行k-fold交叉验证时,我可以迭代循环k次并随机播放pandas数据帧。虽然现在已经足够了,为什么numpy和sci-kit学习shuffle和train_test_split的实现会导致大数组的内存错误?
答案 1 :(得分:3)
我遇到了类似的问题。
如@ user1879926所述,我认为随机播放是内存耗尽的主要原因。
而且,正如'Shuffle' is claimed to be an invalid parameter for model_selection.train_test_split所引用的, train_test_split in sklearn 0.19 有选项禁用随机播放。
所以,我认为你可以通过添加shuffle = False选项来逃避内存错误。
答案 2 :(得分:3)
使用sklearn拆分方法并减少内存使用的另一种方法是生成索引向量X并在此向量上拆分。之后,您可以选择输入内容,例如将培训内容和测试内容写入磁盘。
import h5py
import numpy as np
from sklearn.cross_validation import train_test_split
X = np.random.random((10000,70000))
Y = np.random.random((10000,))
x_ids = list(range(len(X)))
x_train_ids, x_test_ids, Y_train, Y_test = train_test_split(x_ids, Y, test_size = 0.33, random_state=42)
# Write
f = h5py.File('dataset/train.h5py', 'w')
f.create_dataset(f"inputs", data=X[x_train_ids], dtype=np.int)
f.create_dataset(f"labels", data=Y_train, dtype=np.int)
f.close()
f = h5py.File('dataset/test.h5py', 'w')
f.create_dataset(f"inputs", data=X[x_test_ids], dtype=np.int)
f.create_dataset(f"labels", data=Y_test, dtype=np.int)
f.close()
# Read
f = h5py.File('dataset/train.h5py', 'r')
X_train = np.array(f.get('inputs'), dtype=np.int)
Y_train = np.array(f.get('labels'), dtype=np.int)
f.close()
f = h5py.File('dataset/test.h5py', 'r')
X_test = np.array(f.get('inputs'), dtype=np.int)
Y_test = np.array(f.get('labels'), dtype=np.int)
f.close()
答案 3 :(得分:1)
我的代码遇到了同样的问题。我正在使用像你一样的密集阵列,并且内存不足。我将训练数据转换为稀疏(我正在进行文档分类)并解决了我的问题。
答案 4 :(得分:-1)
我想更多的内存效率"方法是迭代地选择用于训练和测试的实例(尽管,正如计算机科学中的典型,你牺牲了使用矩阵的固有效率)。
你可以做的是迭代数组,并且对于每个实例,“掷硬币”#39; (使用随机包)确定您是将该实例用作训练还是测试,并根据具体情况将实例存储在适当的numpy数组中。
这种迭代方法对于10000个实例不应该是坏的。但令人好奇的是10000 X 70000并不是那么大;你在运行什么类型的机器?让我想知道它是Python / numpy / scikit问题还是机器问题......
无论如何,希望有所帮助!