2017-12-18 7 views
1

Python, pandas, jupyter, scikit-learn.sklearn - 곱하기 실행에서 train_test_split 스플릿/상태 저장 하시겠습니까?

나는 필요에 :

  • 만들기 n은 데이터 세트의 다른 분할.
  • 은 나중에 중 하나를 수행하십시오. 노트/스크립트.
  • 우아한 방법이 좋을 것입니다.

이제는 sklearn train_test_split을 사용하고 있지만 대체 방법은 괜찮습니다. 내가 올바르게 이해한다면 random_state 매개 변수는 다음과 같이 사용될 수 있습니다 :

n = 10**6 
while n > 0: 
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state = n) 

    #whatever I'm going to to with this split 
    n-=1 

그런 다음 분할을 재현 할 수있을 것으로 기대합니다. 모델을 다른 노트북에서 재생하도록 덤프 할 수 있습니까? 효과적입니까?

UPD 나는 정확한 답을 경험적으로 발견했습니다. (제발, 자신의 질문에 대답하는 특별한 방법이 있다면 가르쳐주세요).

기차 테스트 스플릿을 모델로 덤프 /로드 할 수 있습니다.

joblib.dump(train_test_split, path) 
my_train_test_split = joblib.load(path) 

하나 이상의 데이터 세트. 두 개의 다른 데이터 세트에서 루프 내에서 두 번 사용하고 고유 한 임의 상태를 전달합니다. 또한로드 된 모델을 사용하여 각 데이터 세트에 대한 분할을 재현 할 수 있습니다. 그게 내가 원하는 전부 야.

+0

목록 추가 ... 핵심 단어 목록을 검색하여 내 대답을 읽을 때 – Wen

+0

루프를 추가하십시오. 데이터 집합의 여러 가지 분할을 만드는 방법을 요청했다고 생각하십시오. 파일에 저장하십시오. 그것이 당신이 의미하는 것이 아니라면, – ErroriSalvo

+0

을 k-fold 교차 검증과 같이 편집하십시오. 어쩌면 그것이 당신이 찾고있는 것입니까? –

답변

1

이것은 무작위 상태 매개 변수와 정확히 일치합니다. 동일한 무작위 상태로 동일한 데이터 집합에서 training_test_split을 호출하면 매번 동일한 분할이 수행됩니다. 자신에게 증명하기 위해 당신은

import numpy as np 
from sklearn.model_selection import train_test_split 

X = np.arange(25) 
rs = 42 
train, test = train_test_split(X, 
           test_size=0.3, 
           random_state=rs) 
for i in range(10): 
    new_train, new_test = train_test_split(X, 
              test_size=0.3, 
              random_state=rs) 
    print(np.all(train == new_train), np.all(test == new_test)) 

출력 확인하는 간단한 스크립트를 작성할 수 있습니다 :

(True, True) 
(True, True) 
(True, True) 
(True, True) 
(True, True) 
(True, True) 
(True, True) 
(True, True) 
(True, True) 
(True, True) 
+1

다른 랜덤 상태가있는 스플릿은 고유합니까? 그런 다음'joblib.dump (train_test_split, some_path)'라고 덤프 할 수 있습니다. 잔인한 10^6으로 괜찮습니까? –

+0

그렇지만 내 코드에서'rs' 매개 변수를 직접 변경하여 확인할 수 있습니다;). 제외해야하는 것은 각 통화에 대해 동일한 데이터를 사용한다고 가정 할 때 사용한 임의의 상태 목록입니다. – ncfirth

0

당신이

import cpickle as pkl # module for serialization 

을 추가하고 루프 내 수

# put all the content in a dict 
tostore=dict(zip(['X_train', 'X_test', 'y_train', 'y_test' ], [train, test, y_train, y_test)) 
# open a file with context manager 
with open('REP'+str(n),'wb') as filestore: 
    pkl.dump(tostore,filestore) # write dict to file 

이것은 필요한 모든 기차/테스트 세트의 지속성을 보장해야합니다. pkl.load()를 사용하여 데이터를 다시로드 할 수 있습니다.

그러나 원칙적으로 각 모델은 예상하는 것보다 다른 난수 생성기 (사용중인 ML 프레임 워크에 따라 다름)와 같이 훈련 된 모델을 덤프하는 것이 좋습니다. 그것이 sklearn 이었다면, 당신은 안전하게 필요할 때 무작위 상태를 설정해야합니다.

fitted models, randomstate의 튜플과 원본 전체 데이터 세트는 괜찮습니다.

또한 사용중인 모든 패키지의 정확한 버전 번호를 나열하는 것이 좋습니다.