我想使用numpy數組來構建摺疊交叉驗證任務的摺疊。取出測試片很容易,但我不知道如何返回數組的其餘部分,省略了測試片。有沒有一種有效的方法來做到這一點?我可以使用numpy數組生成摺疊以進行交叉驗證嗎?
examples = range(50)
classes = range(50)
data = np.array(zip(classes,examples))
test_slice = data[5:10]
train_on_remainder = ??
我想使用numpy數組來構建摺疊交叉驗證任務的摺疊。取出測試片很容易,但我不知道如何返回數組的其餘部分,省略了測試片。有沒有一種有效的方法來做到這一點?我可以使用numpy數組生成摺疊以進行交叉驗證嗎?
examples = range(50)
classes = range(50)
data = np.array(zip(classes,examples))
test_slice = data[5:10]
train_on_remainder = ??
你可以設置它就像這樣:
test_slice, remainder = np.split(data.copy(), [test_size], axis=0)
# run test
remainder[:test_size], test_slice = test_slice, remainder[:test_size].copy()
# run test
remainder[test_size:2*test_size], test_slice = test_slice, remainder[test_size:2*test_size].copy()
# etc.
我不認爲你可以用少得多的複製有它。
工作原理:
. full set: | 0 | 1 | 2 | 3 | 4 | 5 |
split (full copy) /\
tst/rem | 0 | | 1 | 2 | 3 | 4 | 5 |
run trial
| 1 | 2 | 3 | 4 | 5 |
swap tst and ^|
first segment: | v
(partial copy) | 0 |
tst/rem | 1 | | 0 | 2 | 3 | 4 | 5 |
run trial
| 0 | 2 | 3 | 4 | 5 |
swap tst and ^|
second segment: | v
(partial copy) | 1 |
tst/rem | 2 | | 0 | 1 | 3 | 4 | 5 |
run trial
| 0 | 1 | 3 | 4 | 5 |
swap tst and ^|
third segment: | v
(partial copy) | 2 |
等。正如你可以看到它幾乎是逐字地轉移了折。保存許多完整副本。
有點奇怪的問題,如果一個人通常會使用sklearn的train_test_split()
,如果它可用。
編輯:另一種方法可能是
r = np.arange(len(data))
trainX = data[r < 5 | r > 10]
有效的解決方案,我不知道,但嘗試這個 建立使用列表理解的索引。
def indx(n, test_slice):
return [x for x in range(n) if, x not in test_slice]
test_slice = set(range(5, 10))
trainX = data[indx(len(data), test_slice))]
當然
您應像sklearn的train_test_split()
如果可用。
split = np.vsplit(data, np.array([5,10]))
'''This will give you a list with 3 elements'''
test_slice = split[1]
train_slice = np.vstack((split[0],split[2]))
[[5 5] [6 6] [7 7] [8 8] [9 9]]
[[0 0] [1 1] [2 2] [3 3] [4 4] [10 10] [11 11] [12 12] [13 13] [14 14] [15 15] [16 16] [17 17] [18 18] ... [47 47] [ 48 48] [49 49]]
兩種方法,展示了一維陣列上:
In [64]: data = np.arange(20)
In [65]: test = data[5:10]
In [66]: rest = np.concatenate((data[:5],data[10:]),axis=0)
In [67]: rest
Out[67]: array([ 0, 1, 2, 3, 4, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
In [68]:
In [68]: mask = np.zeros(data.shape[0], dtype=bool)
In [69]: mask[5:10] = True
In [70]: test = data[mask]
In [71]: rest = data[~mask]
In [72]: rest
Out[72]: array([ 0, 1, 2, 3, 4, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
有一個np.delete
功能
In [75]: np.delete(data, np.arange(5,10))
Out[75]: array([ 0, 1, 2, 3, 4, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
內部它使用兩種方法我證明之一。
在兩側連接切片;結果將是一個副本。 – hpaulj