Stan losowy (liczba pseudolosowa) w programie Scikit uczą się

148

Chcę zaimplementować algorytm uczenia maszynowego w scikit Learn, ale nie rozumiem, do czego służy ten parametr random_state? Dlaczego powinienem go używać?

Nie mogłem też zrozumieć, co to jest liczba pseudolosowa.

Elizabeth Susan Joseph
źródło

Odpowiedzi:

220

train_test_splitdzieli tablice lub macierze na losowe podzbiory pociągu i testowania. Oznacza to, że za każdym razem, gdy uruchomisz go bez określenia random_state, otrzymasz inny wynik, jest to oczekiwane zachowanie. Na przykład:

Bieg 1:

>>> a, b = np.arange(10).reshape((5, 2)), range(5)
>>> train_test_split(a, b)
[array([[6, 7],
        [8, 9],
        [4, 5]]),
 array([[2, 3],
        [0, 1]]), [3, 4, 2], [1, 0]]

Uruchom 2

>>> train_test_split(a, b)
[array([[8, 9],
        [4, 5],
        [0, 1]]),
 array([[6, 7],
        [2, 3]]), [4, 2, 0], [3, 1]]

To się zmienia. Z drugiej strony, jeśli użyjesz random_state=some_number, możesz zagwarantować, że wynik Run 1 będzie równy wynikowi Run 2 , tj. Twój podział będzie zawsze taki sam. Nie ma znaczenia, jaka jest rzeczywista random_stateliczba 42, 0, 21, ... Ważne jest to, że za każdym razem, gdy użyjesz 42, zawsze otrzymasz ten sam wynik przy pierwszym podziale. Jest to przydatne, jeśli chcesz uzyskać powtarzalne wyniki, na przykład w dokumentacji, aby każdy mógł konsekwentnie widzieć te same liczby podczas uruchamiania przykładów. W praktyce powiedziałbym, że powinieneś ustawić na random_statejakąś stałą liczbę podczas testowania rzeczy, ale potem usuń to w produkcji, jeśli naprawdę potrzebujesz losowego (a nie stałego) podziału.

Jeśli chodzi o twoje drugie pytanie, generator liczb pseudolosowych to generator liczb, który generuje prawie prawdziwie losowe liczby. Dlaczego nie są one naprawdę przypadkowe, nie wchodzi w zakres tego pytania i prawdopodobnie nie będzie miało znaczenia w twoim przypadku, możesz spojrzeć tutaj, aby uzyskać więcej szczegółów.

elyase
źródło
7
więc jaki losowy stan powinienem ustawić, często widzę tę liczbę 42.
Elizabeth Susan Joseph
1
@ElizabethSusanJoseph, to nie ma większego znaczenia, zawsze używam 0, jeśli chcę odtwarzalności lub None inaczej. Mogą to być kolesie jak 42.
elyase
53
To prawdopodobnie wyjaśnia, że ​​numer 42 jest tak często używany: en.wikipedia.org/wiki/The_Hitchhiker%27s_Guide_to_the_Galaxy
denson
3
Dobry, tutaj jest więcej możliwości .
elyase
1
@Herbert To trudne pytanie. Rdzeń PRNG jest oparty na numpy, który jest spójny (wprowadzili wiele sprawdzeń tego po pewnym problemie w przeszłości). Jeśli w sklearn nie ma błędów w użyciu, będzie on również zachowywał się spójnie. Zakładam to (szczególnie w przypadku mniej złożonych funkcji, takich jak train-test-split i co) Edycja : ups, trochę późno :-)
sascha
13

Jeśli nie określisz random_statew swoim kodzie, to za każdym razem, gdy uruchamiasz (wykonujesz) kod, generowana jest nowa losowa wartość, a zestawy danych pociągu i testowe będą miały różne wartości za każdym razem.

Jeśli jednak przypisana jest stała wartość, tak jak random_state = 42wtedy, bez względu na to, ile razy wykonasz kod, wynik będzie taki sam .ie, te same wartości w zestawach danych trenowania i testowania.

umar salman
źródło
4

Jeśli nie wspomnisz o random_state w kodzie, to za każdym razem, gdy wykonujesz kod, generowana jest nowa losowa wartość, a zestawy danych pociągu i testowe będą miały różne wartości za każdym razem.

Jeśli jednak użyjesz określonej wartości dla random_state (random_state = 1 lub dowolna inna wartość) za każdym razem wynik będzie taki sam, tj. Takie same wartości w zestawach danych pociągu i testowych. Zobacz poniższy kod:

import pandas as pd 
from sklearn.model_selection import train_test_split
test_series = pd.Series(range(100))
size30split = train_test_split(test_series,random_state = 1,test_size = .3)
size25split = train_test_split(test_series,random_state = 1,test_size = .25)
common = [element for element in size25split[0] if element in size30split[0]]
print(len(common))

Nie ma znaczenia, ile razy uruchomisz kod, wynik będzie wynosił 70.

70

Spróbuj usunąć random_state i uruchom kod.

import pandas as pd 
from sklearn.model_selection import train_test_split
test_series = pd.Series(range(100))
size30split = train_test_split(test_series,test_size = .3)
size25split = train_test_split(test_series,test_size = .25)
common = [element for element in size25split[0] if element in size30split[0]]
print(len(common))

Teraz wynik będzie inny za każdym razem, gdy wykonasz kod.

Rishi Bansal
źródło
3

random_state number dzieli zestawy danych testowych i szkoleniowych w sposób losowy. Oprócz tego, co zostało tutaj wyjaśnione, ważne jest, aby pamiętać, że wartość random_state może mieć znaczący wpływ na jakość modelu (przez jakość rozumiem zasadniczo dokładność przewidywania). Na przykład, jeśli weźmiesz pewien zestaw danych i wytrenujesz z nim model regresji, bez określania wartości random_state, istnieje możliwość, że za każdym razem uzyskasz inny wynik dokładności dla wytrenowanego modelu na danych testowych. Dlatego ważne jest, aby znaleźć najlepszą wartość random_state, aby zapewnić najdokładniejszy model. Następnie ta liczba zostanie wykorzystana do odtworzenia twojego modelu przy innej okazji, takiej jak inny eksperyment badawczy. Aby to zrobić,

for j in range(1000):

            X_train, X_test, y_train, y_test = train_test_split(X, y , random_state =j,     test_size=0.35)
            lr = LarsCV().fit(X_train, y_train)

            tr_score.append(lr.score(X_train, y_train))
            ts_score.append(lr.score(X_test, y_test))

        J = ts_score.index(np.max(ts_score))

        X_train, X_test, y_train, y_test = train_test_split(X, y , random_state =J, test_size=0.35)
        M = LarsCV().fit(X_train, y_train)
        y_pred = M.predict(X_test)`
Arad Haselirad
źródło
1

Jeśli nie ma podanego stanu losowego, system użyje stanu losowego wygenerowanego wewnętrznie. Tak więc, gdy uruchamiasz program wiele razy, możesz zobaczyć różne punkty danych pociągu / testu, a zachowanie będzie nieprzewidywalne. W przypadku, gdy masz problem z modelem, nie będziesz w stanie go odtworzyć, ponieważ nie znasz liczby losowej, która została wygenerowana podczas uruchamiania programu.

Jeśli widzisz klasyfikatory drzew - DT lub RF, próbują zbudować próbę, używając optymalnego planu. Chociaż w większości przypadków ten plan może być taki sam, mogą wystąpić przypadki, w których drzewo może być inne, a więc prognozy. Podczas próby debugowania modelu możesz nie być w stanie odtworzyć tej samej instancji, dla której zbudowano drzewo. Tak więc, aby uniknąć tych wszystkich kłopotów, używamy random_state podczas budowania DecisionTreeClassifier lub RandomForestClassifier.

PS: Możesz trochę pogłębić sposób budowy drzewa w DecisionTree, aby lepiej to zrozumieć.

randomstate jest zasadniczo używane do odtwarzania twojego problemu w ten sam sposób za każdym razem, gdy jest uruchamiany. Jeśli nie użyjesz losowego stanu w traintestsplit, za każdym razem, gdy dokonasz podziału, możesz otrzymać inny zestaw punktów danych pociągu i testowych i nie pomoże ci w debugowaniu w przypadku wystąpienia problemu.

Z Doc:

Jeśli int, randomstate jest ziarnem używanym przez generator liczb losowych; Jeśli instancja RandomState, randomstate jest generatorem liczb losowych; Jeśli Brak, generator liczb losowych jest instancją RandomState używaną przez np.random.

MdNazmulHossain
źródło
Dobre wytłumaczenie. Dodam tylko, że powodem dla którego przechodzimy stan losowy jest to, że jeśli np. Spróbujemy zoptymalizować hiperparametry, to nie chcemy mieć flukutacji w wyniku z powodu różnych inicjalizacji opartych na liczbach losowych, które mogłyby pokryć lub ukryć efekt faktycznej optymalizacji, a tym samym nie mogliśmy określić, która część zmiany wyniku była spowodowana zmianą parametru, a co wynikało z innego stanu początkowego RNG.
jottbe
-1
sklearn.model_selection.train_test_split(*arrays, **options)[source]

Podziel tablice lub macierze na losowe podzbiory pociągu i testowania

Parameters: ... 
    random_state : int, RandomState instance or None, optional (default=None)

Jeśli int, random_state jest ziarnem używanym przez generator liczb losowych; Jeśli instancja RandomState, random_state jest generatorem liczb losowych; Jeśli Brak, generator liczb losowych jest instancją RandomState używaną przez np.random. źródło: http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

'' 'Jeśli chodzi o stan losowy, jest on używany w wielu algorytmach randomizowanych w sklearn do określania losowego ziarna przesyłanego do generatora liczb pseudolosowych. Dlatego nie reguluje żadnego aspektu zachowania algorytmu. W konsekwencji losowe wartości stanu, które wypadły dobrze w zbiorze walidacyjnym, nie odpowiadają tym, które działałyby dobrze w nowym, niewidocznym zestawie testowym. Rzeczywiście, w zależności od algorytmu, możesz zobaczyć zupełnie inne wyniki, zmieniając po prostu kolejność próbek szkoleniowych. '' 'Źródło: /stats/263999/is-random-state-a-parameter -dostroić

Bogdan Korecki
źródło