2014-03-03 1 views
0

누군가가 내 데이터 집합의 레코드를 무작위 화하기 위해 scikitlearn의 표 검색 기능 gridsearchCV을 방지 할 수 있는지 알고 있습니까?교차 유효성 검사 (및 gridsearchCV)가 데이터 집합의 행을 임의 화하지 못하도록하는 옵션이 있습니까?

나는 같은 현상에 해당하는 행 그룹을 가지고 있으며 전체 행 대신 현상 ID를 무작위로 지정하려고합니다. SQL을 사용하여 이미 현상을 무작위로 추출한 결과, gridsearchCV은 열차 및 테스트 세트에서 데이터 세트를 분리하기 전에 다시 임의 화하지 않기를 바란다. 내 데이터 세트의

예 : 나는 훈련과 테스트 데이터 집합 사이의 아이디에 분할을 좋아하지 않을

id time feature1 feature2 feature3 feature4 
A 1 b c s a 
A 2 b a s t 
A 3 q w o j 
B 1 l o j f 
B 2 9 k l h 
C 1 o k h u 
C 2 o k h i 
C 3 p j g d 
D 1 l l d s 
D 2 ... 
D 3 ... 
D 4 ... 
D 5 ... 

.

나를 도와 줄 수있는 옵션이 있습니까?

도움 주셔서 감사합니다.

답변

0

GridSearchCV에는 교차 유효성 검사 개체를 사용하는 매개 변수 인 cv이 있습니다. 이 배열은 인덱스 배열 train_index, test_index 쌍을 생성하는 반복 가능해야합니다. 다음과 같이 표준 KFold는 동작 :

>>> from sklearn.cross_validation import KFold 
>>> threefold = KFold(n=10, n_folds=3) 
>>> for train, test in threefold: 
... print("train: %r" % train) 
... print("test: %r" % test) 
...  
train: array([4, 5, 6, 7, 8, 9]) 
test: array([0, 1, 2, 3]) 
train: array([0, 1, 2, 3, 7, 8, 9]) 
test: array([4, 5, 6]) 
train: array([0, 1, 2, 3, 4, 5, 6]) 
test: array([7, 8, 9]) 

그래서 당신은 당신이 make_a_boolean_mask_for_the_training_set 자신의 논리를 입력해야 볼 수있는 곳 클래스를

class CustomCV(object): 
    def __init__(self, ids, n_folds): 
     """Pass an array of phenomenon ids""" 
     self.ids = ids 
     self.n_folds = n_folds 

    def __iter__(self): 
     for i in range(self.n_folds): 
      train = make_a_boolean_mask_for_the_training_set() 
      test = np.logical_not(train) 
      yield np.where(train)[0], np.where(test)[0] 

을 구현하여, 어떻게 든 해내해야합니다. 도움이된다면 variant for sequence data 온라인 상태입니다.

GridSearchCV 매개 변수 iidFalse으로 설정해야합니다. 그렇지 않으면 결과가 비뚤어집니다.

+0

안녕하세요 larsmarns. 도와 줘서 고마워. 너의 방법이 맞는 것 같아. 저는 클래스를 작성했으며, 테스트하고 싶습니다 : https://github.com/foebu/mypythoncontributions/blob/master/myCVclass.py 세트를 만들 때 세트 나 마스크 자체에서 무엇을 벗어나야합니까? – foebu

+0

@foebu'X, y'의 샘플 색인. 'np.where'는 부울 마스크를 인덱스로 변환합니다. 예제에서 보았습니다. –

+0

한편 KFold를 사용하고 있는데, 수업을 구현하고 수정할 시간이 없었습니다. Tt는 30K 행의 데이터 세트에서 일부 ID를 분리해야하는 문제가 아니어야합니다. – foebu

0

한 번에 더 많은 단계를 수행하는 구성은 어렵습니다. 여기서는 가능하지 않습니다. 어쩌면 특수한 방법 인 gridSearchCV가 다른 방식으로 뭔가를하고 싶을 때 적합하지 않을 수 있습니다. 그래서 저는 여러분이이 단계들을 나누어서 제안하는 것은 너무 복잡하지 않습니다.

  1. 십자가 유효성 확인을위한 데이터를 원하는대로 분할합니다. 아마도 sklearn.cross_validation 메소드 중 하나를 사용하십시오.
  2. 그리드 검색을 수행하십시오. 아마도 sklearn.gridsearch.ParamaterGrid를 사용하십시오.
+0

안녕하세요. 답변 해 주셔서 감사합니다. 내가 생각하는 첫 번째 부분은 가능하지만, gridsearch를 적용하면 데이터가 재편성됩니다. 그 방법으로 훈련 및 테스트 세트가 만들어지기 때문입니다. 권리? 아니면 내가 틀렸어? – foebu

+0

크로스 밸리데이션과 그리드 검색이 지나치게 복잡한 것은 아니라는 것을 알았습니다. 두 줄의 파이썬에서 할 수 있습니다. 어떤 Scikit 방법이든 데이터가 마음에 들지 않는 방식으로 뒤섞이더라도 직접 작성하는 것으로 바꾸십시오. 나는 scikit 방법에 익숙하지 않지만, 당신에게 운이 좋으면 @larsmans는 실제로 어떻게 그렇게 할 수 있는지에 대한 대답을 갖고있는 것 같습니다. –

+0

감사합니다. wm :) 수동으로 교차 유효성 검사 집합을 만드는 것이 그리 어렵지 않습니다. 코드를 살펴 보지 않았더라도 gridsearchCV 체계를 만들지 않아도됩니다. 그러나 더 유연한 무언가를 만들 가능성이 있다면 재사용이 가능할 것입니다. – foebu