Scikit의 임의 상태 (의사 난수)


148

scikit learn에서 기계 학습 알고리즘을 구현하고 싶지만이 매개 변수의 기능을 이해하지 못 random_state합니까? 왜 사용해야합니까?

또한 의사 난수 (Pseudo-random) 숫자가 무엇인지 이해할 수 없었습니다.

답변:


220

train_test_split배열 또는 행렬을 임의의 기차 및 테스트 하위 집합으로 나눕니다. 즉 random_state,를 지정하지 않고 실행할 때마다 다른 결과가 표시되며 이는 예상 된 동작입니다. 예를 들면 다음과 같습니다.

실행 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]]

실행 2

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

바뀐다. 반면에을 사용 random_state=some_number하면 Run 1 의 출력이 Run 2 의 출력과 같을 것입니다 . 즉, 스플릿은 항상 동일합니다. 실제 random_state숫자가 42, 0, 21 등은 중요 하지 않습니다 . 중요한 것은 42를 사용할 때마다 처음 분할 할 때 항상 동일한 출력을 얻는다는 것입니다. 이것은 예를 들어 문서에서 재현 가능한 결과를 원할 때 유용하므로 예제를 실행할 때 모든 사람이 동일한 숫자를 일관되게 볼 수 있습니다. 실제로 나는 말할 것입니다. random_state물건을 테스트하는 동안 고정 숫자로 설정해야 하지만 실제로 무작위 (고정되지 않은) 스플릿이 필요한 경우 프로덕션에서 제거해야합니다.

두 번째 질문과 관련하여 의사 난수 생성기는 거의 임의의 숫자를 생성하는 숫자 생성기입니다. 그들이 무작위로 무작위가 아닌 이유는이 질문의 범위를 벗어 났으며 아마도 귀하의 경우에는 중요하지 않을 것입니다 . 자세한 내용 은 여기를 살펴보십시오 .


7
그래서 임의 상태가 내가 설정해야하는지, 나는 일반적으로이 숫자 42을 참조
엘리자베스 수잔 요셉

1
@ EllizabethSusanJoseph,별로 중요하지 않습니다. 재현성을 원하면 항상 0을 사용하고 그렇지 않으면 None을 사용하십시오. 42와 같은 scikit 녀석일지도 모릅니다.
elyase

53
: 이것은 아마도 수 (42)는 자주 사용되는 설명 en.wikipedia.org/wiki/The_Hitchhiker%27s_Guide_to_the_Galaxy을
DENSON

3
좋은 것은 여기에 더 많은 가능성이 있습니다.
elyase 2016 년

1
@Herbert 어려운 질문입니다. PRNG의 핵심 요소는 일관된 numpy를 기반으로합니다 (과거에는 몇 가지 문제가 발생한 후 이에 대한 많은 검사가 도입되었습니다). sklearn 내에서 사용상의 오류가없는 경우에도 일관성이 유지됩니다. 나는 이것을 (특히 train-test-split 및 co와 같은 덜 복잡한 기능을 위해) 가정 할 것이다. 편집 : 죄송합니다, 조금 늦었습니다 :-)
sascha

13

random_state코드에서를 지정하지 않으면 코드를 실행할 때마다 새로운 임의의 값이 생성되고 열차 및 테스트 데이터 세트는 매번 다른 값을 갖습니다.

그러나 고정 값이 할당 된 경우 random_state = 42코드를 몇 번이나 실행하더라도 결과는 동일합니다 (즉, 열차 및 테스트 데이터 세트에서 동일한 값).


4

코드에서 random_state를 언급하지 않으면 코드를 실행할 때마다 새로운 임의의 값이 생성되고 열차 및 테스트 데이터 세트는 매번 다른 값을 갖습니다.

그러나 random_state (random_state = 1 또는 다른 값)에 특정 값을 사용할 때마다 결과는 동일합니다 (즉, 기차 및 테스트 데이터 세트의 값이 동일 함). 아래 코드를 참조하십시오 :

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))

코드를 몇 번이나 실행하든 상관없이 출력은 70입니다.

70

random_state를 제거하고 코드를 실행하십시오.

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))

이제 코드를 실행할 때마다 출력이 달라집니다.


3

random_state number는 테스트 및 학습 데이터 세트를 임의의 방식으로 분할합니다. 여기에 설명 된 것 외에도 random_state 값이 모델의 품질에 상당한 영향을 미칠 수 있음을 기억하는 것이 중요합니다. 예를 들어 random_state 값을 지정하지 않고 특정 데이터 집합을 가져와 회귀 모델을 학습하면 매번 테스트 데이터에서 학습 된 모델에 대해 다른 정확도 결과를 얻을 수 있습니다. 따라서 가장 정확한 모델을 제공 할 수있는 최상의 random_state 값을 찾는 것이 중요합니다. 그런 다음이 숫자는 다른 연구 실험과 같은 다른 경우에 모델을 재현하는 데 사용됩니다. 그렇게하려면

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)`

1

randomstate가 없으면 시스템은 내부적으로 생성 된 randomstate를 사용합니다. 따라서 프로그램을 여러 번 실행하면 다른 기차 / 테스트 데이터 포인트가 표시되고 동작을 예측할 수 없게됩니다. 모델에 문제가있는 경우 프로그램을 실행할 때 생성 된 난수를 모르므로 모델을 다시 작성할 수 없습니다.

DT 또는 RF의 Tree Classifiers가 표시되면 최적의 계획을 사용하여 시험을 작성하려고합니다. 대부분의 경우이 계획은 동일 할 수 있지만 트리가 다를 수있는 예측이있을 수 있습니다. 모델을 디버깅하려고하면 Tree가 작성된 동일한 인스턴스를 다시 만들지 못할 수 있습니다. 따라서이 모든 번거 로움을 피하기 위해 DecisionTreeClassifier 또는 RandomForestClassifier를 빌드하는 동안 random_state를 사용합니다.

추신 : DecisionTree에서 Tree가 어떻게 만들어 졌는지 좀 더 깊이 이해할 수 있습니다.

randomstate는 기본적으로 문제가 실행될 때마다 문제를 재현하는 데 사용됩니다. traintestsplit에서 randomstate를 사용하지 않으면 분할 할 때마다 다른 기차 및 테스트 데이터 포인트 세트를 얻을 수 있으며 문제가 발생할 경우 디버깅에 도움이되지 않습니다.

문서에서 :

int이면 randomstate는 난수 생성기에서 사용하는 시드입니다. RandomState 인스턴스 인 경우 randomstate는 난수 생성기입니다. None이면 난수 생성기는 np.random에서 사용하는 RandomState 인스턴스입니다.


좋은 설명입니다. 랜덤 상태를 통과하는 이유는, 예를 들어 하이퍼 파라미터를 최적화하려고하면 임의의 숫자를 기반으로하는 초기화가 다르기 때문에 점수가 변동되는 것을 원하지 않기 때문입니다. 또는 실제 최적화의 효과를 숨겨서 매개 변수 변경으로 인한 점수 변경 부분과 RNG의 시작 상태가 다른 부분을 식별 할 수 없었습니다.
jottbe

-1
sklearn.model_selection.train_test_split(*arrays, **options)[source]

배열 또는 행렬을 임의의 기차 및 테스트 하위 집합으로 분할

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

int이면 random_state는 난수 생성기에서 사용하는 시드입니다. RandomState 인스턴스 인 경우 random_state는 난수 생성기입니다. None 인 경우 난수 생성기는 np.random에서 사용하는 RandomState 인스턴스입니다. 출처 : http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

랜덤 상태와 관련하여, 그것은 의사 난수 생성기에 전달 된 랜덤 시드를 결정하기 위해 sklearn의 많은 무작위 알고리즘에서 사용됩니다. 따라서 알고리즘의 동작에 영향을주지 않습니다. 결과적으로, 검증 세트에서 잘 수행 된 임의의 상태 값은 보이지 않는 새로운 테스트 세트에서 잘 수행되는 것과 일치하지 않습니다. . 실제로 알고리즘에 따라, 당신은 단지 훈련 샘플의 순서를 변경하여 완전히 다른 결과를 볼 수있는 '' '소스 : /stats/263999/is-random-state-a-parameter -조율하다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.