Jaki jest dobry sposób na losowe podzielenie tablicy NumPy na zbiór danych treningowych i testowych / walidacyjnych? Coś podobnego do funkcji cvpartition
lub crossvalind
w Matlabie.
źródło
Jaki jest dobry sposób na losowe podzielenie tablicy NumPy na zbiór danych treningowych i testowych / walidacyjnych? Coś podobnego do funkcji cvpartition
lub crossvalind
w Matlabie.
Jeśli chcesz podzielić zestaw danych raz na dwie części, możesz użyć numpy.random.shuffle
lub numpy.random.permutation
jeśli chcesz śledzić indeksy:
import numpy
# x is your dataset
x = numpy.random.rand(100, 5)
numpy.random.shuffle(x)
training, test = x[:80,:], x[80:,:]
lub
import numpy
# x is your dataset
x = numpy.random.rand(100, 5)
indices = numpy.random.permutation(x.shape[0])
training_idx, test_idx = indices[:80], indices[80:]
training, test = x[training_idx,:], x[test_idx,:]
Istnieje wiele sposobów wielokrotnego dzielenia tego samego zestawu danych na potrzeby weryfikacji krzyżowej . Jedną ze strategii jest ponowne próbkowanie ze zbioru danych z powtórzeniem:
import numpy
# x is your dataset
x = numpy.random.rand(100, 5)
training_idx = numpy.random.randint(x.shape[0], size=80)
test_idx = numpy.random.randint(x.shape[0], size=20)
training, test = x[training_idx,:], x[test_idx,:]
Wreszcie, sklearn zawiera kilka metod walidacji krzyżowej (k-fold, opuszczanie n-out, ...). Obejmuje również bardziej zaawansowane metody „próbkowania warstwowego” , które tworzą podział danych, który jest zrównoważony w odniesieniu do niektórych cech, na przykład w celu upewnienia się, że w zbiorze uczącym i testowym jest taki sam udział przykładów pozytywnych i negatywnych.
Jest jeszcze jedna opcja, która po prostu pociąga za sobą użycie scikit-learn. Jak opisuje wiki scikit , możesz po prostu użyć następujących instrukcji:
W ten sposób możesz zsynchronizować etykiety danych, które próbujesz podzielić na trening i test.
źródło
Tylko uwaga. Jeśli chcesz trenować, testować ORAZ zestawy walidacyjne, możesz to zrobić:
Te parametry dadzą 70% na trening i po 15% na zestawy testowe i wartościowe. Mam nadzieję że to pomoże.
źródło
from sklearn.cross_validation import train_test_split
aby było jasne, jakiego modułu używasza=0.7
,b=0.15
,c=0.15
, id = dataset
,N=len(dataset)
, a następniex_train = dataset[0:int(a*N)]
,x_test = dataset[int(a*N):int((a+b)*N)]
ix_val = dataset[int((a+b)*N):]
.from sklearn.model_selection import train_test_split
Ponieważ
sklearn.cross_validation
moduł został wycofany, możesz użyć:źródło
Możesz również rozważyć rozwarstwiony podział na zbiór uczący i testowy. Rozpoczęty podział również generuje losowo zestaw treningowy i testowy, ale w taki sposób, aby zachować oryginalne proporcje klasowe. Dzięki temu zestawy uczące i testowe lepiej odzwierciedlają właściwości oryginalnego zestawu danych.
Ten kod wyprowadza:
źródło
value_inds
są naprawdę indeksami, ale wynik nie jest indeksami, tylko maskami.Napisałem funkcję do mojego własnego projektu, aby to zrobić (chociaż nie używa numpy):
Jeśli chcesz, aby fragmenty były losowe, po prostu potasuj listę przed przekazaniem jej.
źródło
Oto kod do podziału danych na n = 5 razy w sposób warstwowy
źródło
Dzięki pberkes za odpowiedź. Po prostu zmodyfikowałem to, aby uniknąć (1) zamiany podczas próbkowania (2) zduplikowane instancje występowały zarówno podczas treningu, jak i testowania:
źródło
Po przeczytaniu i wzięciu pod uwagę (wielu ...) różnych sposobów dzielenia danych w celu trenowania i testowania, postanowiłem trochę poczekać!
Użyłem 4 różnych metod (żadna z nich nie korzysta z biblioteki sklearn, która na pewno da najlepsze rezultaty, dając dobrze zaprojektowany i przetestowany kod):
metoda 3 wygrała zdecydowanie z najkrótszym czasem, po tym jak metoda 1, a metody 2 i 4 okazały się naprawdę nieefektywne.
Kod dla 4 różnych metod, które mierzyłem czasowo:
A dla czasów minimalny czas na wykonanie z 3 powtórzeń 1000 pętli to:
Mam nadzieję, że to pomocne!
źródło
Prawdopodobnie będziesz musiał nie tylko podzielić się na trenowanie i testowanie, ale także weryfikację krzyżową, aby upewnić się, że model uogólnia. Tutaj zakładam 70% danych treningowych, 20% walidację i 10% wstrzymanie / dane testowe.
Sprawdź np.split :
źródło
Podzielony na test pociągu i ważny
źródło