"train_test_split"메소드의 매개 변수 "stratify"(scikit Learn)


94

train_test_split패키지 scikit Learn에서 사용하려고 하는데 parameter에 문제가 있습니다 stratify. 다음은 코드입니다.

from sklearn import cross_validation, datasets 

X = iris.data[:,:2]
y = iris.target

cross_validation.train_test_split(X,y,stratify=y)

그러나 다음과 같은 문제가 계속 발생합니다.

raise TypeError("Invalid parameters passed: %s" % str(options))
TypeError: Invalid parameters passed: {'stratify': array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])}

누군가가 무슨 일이 일어나고 있는지 알고 있습니까? 아래는 함수 문서입니다.

[...]

stratify : 배열 유사 또는 없음 (기본값은 없음)

None이 아닌 경우 데이터는 레이블 배열로 사용하여 계층화 된 방식으로 분할됩니다.

버전 0.17의 새로운 기능 : 계층화 분할

[...]


아니요, 모두 해결되었습니다.
Daneel Olivaw

답변:


58

Scikit-Learn은 단지 "stratify"라는 주장을 인식하지 못한다고 말하고 있습니다. 당신이 그것을 잘못 사용하고 있다는 것이 아닙니다. 이는 인용 한 문서에 표시된대로 매개 변수가 버전 0.17에 추가 되었기 때문입니다.

따라서 Scikit-Learn을 업데이트하기 만하면됩니다.


버전 0.21.2의 scikit-learn이 있지만 동일한 오류가 발생합니다. scikit-learn 0.21.2 py37h2a6a0b8_0 conda-forge
Kareem Jeiroudi

326

stratify매개 변수는 생성 된 샘플의 값 비율이 매개 변수에 제공된 값의 비율과 같도록 분할 stratify합니다.

예를 들어, 변수 y값을 바이너리 범주 변수 01, 1과 0의 25 % 사람의 75 %가 stratify=y반드시 당신의 임의 분할의 25 %를 가지고 할 것 0's와 75 %의 1의를.


117
이것은 실제로 질문에 대한 답은 아니지만 작동 방식을 이해하는 데 매우 유용합니다. 엄청 고마워.
Reed Jessen

6
나는 아직도이 계층화가 필요한 이유를 이해하는데 어려움을 겪고 있습니다. 데이터에 클래스 균형이 맞다면 데이터를 무작위로 분할 할 때 평균적으로 보존되지 않을까요?
Holger Brandl

14
@HolgerBrandl 평균적으로 보존됩니다. 계층화하면 확실히 보존됩니다.
Yonatan

7
@HolgerBrandl은 매우 작거나 매우 불균형 한 데이터 세트를 사용하는 경우 임의 분할이 분할 중 하나에서 클래스를 완전히 제거 할 수 있습니다.
cddt

1
@HolgerBrandl 좋은 질문입니다! 먼저 추가 할 수 있습니다 stratify.를 사용하여 학습 및 테스트 세트로 분할해야합니다 . 둘째, 불균형을 수정하려면 결국 훈련 세트에서 오버 샘플링 또는 언더 샘플링을 실행해야합니다. 많은 Sklearn 분류기에는 균형으로 설정할 수있는 class-weight라는 매개 변수가 있습니다. 마지막으로 불균형 데이터 세트에 대한 정확도보다 더 적절한 메트릭을 사용할 수도 있습니다. F1 또는 ROC 아래 영역을 시도하십시오.
Claude COULOMBE

62

Google을 통해 여기에 오는 나의 미래를 위해 :

train_test_split이제에 있습니다 model_selection.

from sklearn.model_selection import train_test_split

# given:
# features: xs
# ground truth: ys

x_train, x_test, y_train, y_test = train_test_split(xs, ys,
                                                    test_size=0.33,
                                                    random_state=0,
                                                    stratify=ys)

그것을 사용하는 방법입니다. random_state재현성을 위해 설정하는 것이 바람직합니다.


이것이 답이어야합니다. :) 감사합니다
SwimBikeRun

15

이 컨텍스트에서 계층화는 train_test_split 메서드가 입력 데이터 세트와 동일한 비율의 클래스 레이블을 가진 훈련 및 테스트 하위 집합을 반환 함을 의미합니다.


3

이 코드를 실행 해보십시오. "그냥 작동"합니다.

from sklearn import cross_validation, datasets 

iris = datasets.load_iris()

X = iris.data[:,:2]
y = iris.target

x_train, x_test, y_train, y_test = cross_validation.train_test_split(X,y,train_size=.8, stratify=y)

y_test

array([0, 0, 0, 0, 2, 2, 1, 0, 1, 2, 2, 0, 0, 1, 0, 1, 1, 2, 1, 2, 0, 2, 2,
       1, 2, 1, 1, 0, 2, 1])

@ user5767535 보시다시피 sklearnPython 3,5 용 Anaconda 배포판 인 '0.17'버전의 Ubuntu 컴퓨터에서 작동하고 있습니다. 코드를 올바르게 입력하고 소프트웨어를 업데이트하는 경우에만 한 번 더 확인하는 것이 좋습니다.
Sergey Bushmanov

2
@ user5767535은 BTW, "새 버전 0.17에서 : 계층화 분할은"업데이트해야한다는 나를 거의 확실하게 당신의 sklearn...
세르게이 Bushmanov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.