Mam dość duży zestaw danych w postaci ramki danych i zastanawiałem się, jak mógłbym podzielić ramkę danych na dwie losowe próbki (80% i 20%) na potrzeby szkolenia i testowania.
Dzięki!
python
python-2.7
pandas
dataframe
tooty44
źródło
źródło
msk
jest dtypebool
,df[msk]
,df.iloc[msk]
idf.loc[msk]
zawsze zwraca ten sam wynik.rand
do< 0.8
sensu, ponieważ zwraca liczb losowych równomiernie rozłożone pomiędzy 0 a 1.in[12]
,in[13]
,in[14]
? Chcę zrozumieć sam kod python tutajnp.random.rand(len(df))
to tablica wielkościlen(df)
z losowo i równomiernie rozmieszczonymi wartościami zmiennoprzecinkowymi w zakresie [0, 1].< 0.8
Stosuje porównanie elementem mądry i zapisuje wynik w miejscu. Zatem wartości <0,8 stają sięTrue
i wartość> = 0,8 stają sięFalse
scikit learn's
train_test_split
jest dobry.źródło
kf = KFold(n, n_folds=folds) for train_index, test_index in kf: X_train, X_test = X.ix[train_index], X.ix[test_index]
pełny przykład tutaj: quantstart.com/articles/…from sklearn.model_selection import train_test_split
zamiast tego.from sklearn.cross_validation import train_test_split
Działa również losowa próbka pand
źródło
random_state
robi arg?test
pożądany jest zestaw losowy, jak wskazano tutaj stackoverflow.com/questions/29576430/shuffle-dataframe-rows .test=df.drop(train.index).sample(frac=1.0)
Korzystałbym z własnego Training_test_split scikit-learn i generowałem go z indeksu
źródło
cross_validation
Moduł jest teraz przestarzała:DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.
Istnieje wiele sposobów tworzenia pociągu / testu, a nawet próbek walidacyjnych.
Przypadek 1: klasyczny sposób
train_test_split
bez żadnych opcji:Przypadek 2: przypadek bardzo małych zestawów danych (<500 wierszy): w celu uzyskania wyników dla wszystkich linii z tą weryfikacją krzyżową. Na koniec będziesz mieć jedną prognozę dla każdej linii dostępnego zestawu treningowego.
Przypadek 3a: Niezrównoważone zestawy danych do celów klasyfikacji. Zgodnie z przypadkiem 1, oto równoważne rozwiązanie:
Przypadek 3b: Niezrównoważone zestawy danych do celów klasyfikacji. Zgodnie z przypadkiem 2, oto równoważne rozwiązanie:
Przypadek 4: musisz stworzyć zestawy pociągów / testów / walidacji na dużych danych, aby dostroić hiperparametry (60% pociągu, 20% testu i 20% wartości).
źródło
Możesz użyć poniższego kodu, aby utworzyć próbki testowe i szkolić:
Rozmiar testu może się różnić w zależności od odsetka danych, które chcesz umieścić w zestawie danych testu i pociągu.
źródło
Istnieje wiele poprawnych odpowiedzi. Dodanie jeszcze jednego do grona. ze sklearn.cross_validation import train_test_split
źródło
Możesz także rozważyć podział warstwowy na zestaw szkoleniowy i testowy. Podział startowy generuje również zestaw treningów i testów losowo, ale w taki sposób, aby zachować oryginalne proporcje klas. Dzięki temu zestawy szkoleniowe i testowe lepiej odzwierciedlają właściwości oryginalnego zestawu danych.
df [train_inds] i df [test_inds] zapewniają zestawy szkoleniowe i testowe oryginalnej DataFrame df.
źródło
Jeśli chcesz podzielić dane w odniesieniu do kolumny lables w zestawie danych, możesz użyć tego:
i użyj go:
możesz także przekazać parametr random_state, jeśli chcesz kontrolować losowość podzieloną lub użyć globalnego źródła losowego.
źródło
źródło
Możesz użyć ~ (operator tyldy), aby wykluczyć wiersze próbkowane za pomocą df.sample (), pozwalając pandom samodzielnie obsługiwać próbkowanie i filtrowanie indeksów, aby uzyskać dwa zestawy.
źródło
To właśnie napisałem, gdy potrzebowałem podzielić ramkę danych. Zastanawiałem się nad zastosowaniem powyższego podejścia Andy'ego, ale nie podobało mi się, że nie mogłem dokładnie kontrolować wielkości zbiorów danych (tj. Czasami byłoby to 79, a czasem 81 itd.).
źródło
Wystarczy wybrać wiersz zakresu z df w ten sposób
źródło
df
fragment kodu jest (lub powinien być) tasowany, poprawi to odpowiedź.Istnieje wiele świetnych odpowiedzi powyżej, więc chcę tylko dodać jeszcze jeden przykład w przypadku, gdy chcesz określić dokładną liczbę próbek dla pociągu i zestawów testowych, używając tylko
numpy
biblioteki.źródło
Aby podzielić na więcej niż dwie klasy, takie jak szkolenie, test i walidacja, można:
W ten sposób około 70% danych będzie szkolonych, 15% w teście, a 15% w walidacji.
źródło
musisz przekonwertować ramkę danych pandy na tablicę numpy, a następnie przekonwertować tablicę numpy z powrotem na ramkę danych
źródło
Jeśli chcesz mieć jedną ramkę danych i dwie ramki danych (nie tablic numpy), powinno to załatwić sprawę:
źródło
Możesz skorzystać z funkcji df.as_matrix () i utworzyć tablicę Numpy i przekazać ją.
źródło
Nieco bardziej eleganckie według mnie jest utworzenie losowej kolumny, a następnie podzielenie przez nią, w ten sposób możemy uzyskać podział, który będzie odpowiadał naszym potrzebom i będzie losowy.
źródło
Myślę, że musisz także otrzymać kopię, a nie kawałek ramki danych, jeśli chcesz później dodać kolumny.
źródło
Co powiesz na to? df jest moją ramką danych
źródło
Nie trzeba konwertować na numpy. Wystarczy użyć pandy df, aby dokonać podziału, a ona zwróci pand df.
źródło
źródło