다중 클래스 분류에서 Scikit SVM의 출력은 항상 동일한 레이블을 제공합니다


10

현재 Scikit learn을 다음 코드로 사용하고 있습니다.

clf = svm.SVC(C=1.0, tol=1e-10, cache_size=600, kernel='rbf', gamma=0.0, 
              class_weight='auto')

그런 다음 7 개의 서로 다른 레이블이있는 일련의 데이터를 적합하게 예측합니다. 이상한 결과가 나왔습니다. 유효성 검사 세트에서 예측 된 레이블을 사용하는 교차 유효성 검사 기술에 관계없이 항상 레이블 7이됩니다.

전체 기본 매개 변수 ()를 포함하여 다른 매개 변수를 시도 svm.SVC()하지만 사용하는 커널 방법이 rbf대신 poly하거나 linear작동하지 않는 한 polyand에서는 실제로 잘 작동 linear합니다.

또한 유효성 검사 데이터 대신 열차 데이터에 대한 예측을 이미 시도했으며 완벽하게 맞습니다.

누구든지 전에 이런 종류의 문제를보고 여기에서 무슨 일이 일어나고 있는지 알고 있습니까?

클래스 분포를 자세히 보지는 않지만 30 %가 7, 14 %가 4라는 것을 알고 있습니다.

심지어 수동 1 대 나머지 구현을 시도해도 여전히 도움이되지 않습니다.


각 수업에 포함되는 데이터의 비율은 무엇입니까?
gung-모니 티 복원

내 데이터에는 실제로 더 많은 "7"이 있지만 그다지 많지는 않습니다. @gung
Tamaki Sakura

답변:


10

모델을 튜닝하지 않았기 때문일 수 있습니다. 및 대한 올바른 값을 찾아야합니다 . 귀하의 경우, 기본값은 좋지 않은 것으로 판명되어 항상 특정 클래스를 생성하는 사소한 모델로 이어집니다. 한 클래스가 다른 클래스보다 인스턴스가 훨씬 많은 경우에 특히 일반적입니다. 수업 배급은 무엇입니까?γ

scikit-learn은 하이퍼 파라미터 검색 기능이 제한되어 있지만 Optunity 와 같은 튜닝 라이브러리와 함께 사용할 수 있습니다 . Optunity를 사용하여 scikit-learn SVC 튜닝에 대한 예는 여기에서 확인할 수 있습니다 .

면책 조항 : 저는 Optunity의 수석 개발자입니다.


실제로 mannuelly는 0에서 4까지의 10의 거듭 제곱 인 C와 감마의 모든 조합을 시도하지만 모두 나에게 완전한 7을 제공합니다. 나는 scikit을 올바른 방법으로 배우면 컴파일하기조차 의심합니다.
Tamaki Sakura

8

문제는 매개 변수 테스트로 밝혀졌습니다. 나는 gamma0.0 (1 / n_feature)과 1 사이 일 때 시도하지 않았다 . 내 데이터 gamma에서 무언가로 바뀌어야 한다.1e-8


4
이것은 완벽하게 이해됩니다. 값이 너무 크면 단위 행렬에 가까운 커널 행렬이됩니다. 모든 예측은 바이어스 용어가 될 것입니다 (모든 커널 평가가 0에 매우 가깝기 때문에).이 경우 클래스 7로 이어집니다. γ
Marc Claesen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.