Mam ramkę danych pandy i chcę ją podzielić na 3 oddzielne zestawy. Wiem, że używając train_test_split z sklearn.cross_validation
, można podzielić dane na dwa zestawy (pociąg i test). Nie mogłem jednak znaleźć żadnego rozwiązania dotyczącego podziału danych na trzy zestawy. Najlepiej, jeśli posiadam indeksy oryginalnych danych.
Wiem, że obejściem byłoby train_test_split
dwukrotne użycie i jakoś skorygowanie indeksów. Ale czy istnieje bardziej standardowy / wbudowany sposób dzielenia danych na 3 zestawy zamiast 2?
Odpowiedzi:
Odrętwiałe rozwiązanie. Najpierw przetasujemy cały zestaw danych (df.sample (frac = 1)), a następnie podzielimy nasz zestaw danych na następujące części:
[int(.6*len(df)), int(.8*len(df))]
- jestindices_or_sections
tablicą dla numpy.split () .Oto małe demo do
np.split()
użycia - podzielmy 20-elementową tablicę na następujące części: 80%, 10%, 10%:źródło
frac=1
instruujesample()
funkcję, aby zwróciła wszystkie (100%
lub fraction =1.0
) wierszenp.random.seed(any_number)
przed linią podziału, aby uzyskać ten sam wynik przy każdym przebiegu. Po drugie, aby uzyskać nierówne proporcje, takie jaktrain:test:val::50:40:10
użycie[int(.5*len(dfn)), int(.9*len(dfn))]
. Tutaj pierwszy element oznacza rozmiar dlatrain
(0,5%), drugi element oznacza rozmiar dlaval
(1-0,9 = 0,1%), a różnica między nimi oznacza rozmiar dlatest
(0,9-0,5 = 0,4%). Popraw mnie, jeśli się mylę :)Uwaga:
Funkcja została napisana, aby obsłużyć tworzenie losowych zestawów. Nie powinieneś polegać na podziale zestawów, który nie powoduje ich losowania.
Demonstracja
źródło
Jednakże, jednym z podejść do rozdzielenia zestawu danych w
train
,test
,cv
o0.6
,0.2
,0.2
byłoby użyćtrain_test_split
metody dwukrotnie.źródło
np.split()
. Ponadto nie wymaga dodatkowej zależności odsklearn
.Oto funkcja Pythona, która dzieli ramkę danych Pandas na pociąg, walidację i testowe ramki danych z próbkowaniem warstwowym. Dokonuje tego podziału, dwukrotnie wywołując funkcję scikit-learn
train_test_split()
.Poniżej znajduje się pełny przykład roboczy.
Rozważ zbiór danych z etykietą, na podstawie której chcesz przeprowadzić stratyfikację. Ta etykieta ma swoją własną dystrybucję w oryginalnym zbiorze danych, powiedzmy 75%
foo
, 15%bar
i 10%baz
. Teraz podzielmy zestaw danych na pociąg, walidację i test na podzbiory przy użyciu stosunku 60/20/20, gdzie każdy podział zachowuje ten sam rozkład etykiet. Zobacz poniższą ilustrację:Oto przykładowy zbiór danych:
Teraz
split_stratified_into_train_val_test()
wywołajmy funkcję z góry, aby uzyskać pociąg, walidację i przetestować ramki danych zgodnie ze stosunkiem 60/20/20.Trzy ramki danych
df_train
,df_val
idf_test
zawierają wszystkie oryginalne wiersze, ale ich rozmiary będą zgodne z powyższym współczynnikiem.Ponadto każdy z trzech podziałów będzie miał taką samą dystrybucję etykiety, a mianowicie 75%
foo
, 15%bar
i 10%baz
.źródło
Jest bardzo wygodny w użyciu
train_test_split
bez wykonywania ponownego indeksowania po podzieleniu na kilka zestawów i bez pisania dodatkowego kodu. Najlepsza odpowiedź powyżej nie wspomina, że dwukrotne oddzielenie przy użyciutrain_test_split
niezmieniających się rozmiarów partycji nie da początkowo zamierzonej partycji:Następnie część zestawów walidacyjnych i testowych w x_remain zmienia się i można ją policzyć jako
W tym przypadku wszystkie partycje początkowe są zapisywane.
źródło