2012-11-10 2 views
8

libsvm은 Scikit-Learn (SVC 분류자를위한 libSVM을 기반으로해야 함)을 사용하여 데이터 크기를 조정하는 도구를 제공하지만 데이터를 확장 할 방법이 없습니다.scikit-learn SVM의 데이터 크기 조정

기본적으로 나는 4 개의 피쳐를 사용하고 싶습니다. 그 중 3 개의 피치는 0에서 1까지이고 마지막 피쳐는 매우 큰 가변 숫자입니다.

(데이터를 자동으로 조정하는 easy.py 스크립트를 사용하여) 네 번째 기능을 libSVM에 포함하면 매우 좋은 결과를 얻을 수 있습니다 (96 % 정확도). Scikit-Learn에 네 번째 변수를 포함하면 정확도가 ~ 78 %로 떨어집니다.하지만 제외하면 해당 기능을 제외 할 때 libSVM에서 얻은 결과와 동일한 결과가 나타납니다. 따라서 스케일링이 없다는 것이 확실합니다.

SVM의 크기 조절 과정을 프로그래밍 방식으로 (즉, svm-scale로 호출하지 않고) 복제하려면 어떻게해야합니까?

답변

6

당신은 sklearn.preprocessing에 해당 기능이 있습니다

>>> from sklearn import preprocessing 
>>> X = [[ 1., -1., 2.], 
...  [ 2., 0., 0.], 
...  [ 0., 1., -1.]] 
>>> X_scaled = preprocessing.scale(X) 

>>> X_scaled           
array([[ 0. ..., -1.22..., 1.33...], 
     [ 1.22..., 0. ..., -0.26...], 
     [-1.22..., 1.22..., -1.06...]]) 

데이터는 다음 제로 평균 및 단위 분산을해야합니다.

+0

감사합니다. 기차 데이터와 함께 테스트 데이터를 표준화하고 이후에 슬라이스해야합니까, 아니면 테스트 데이터를 단독으로 수행해야합니까? – luke14free

+3

[documentation] (http://scikit-learn.org/stable/modules/preprocessing.html#standardization-or-mean-removal-and-variance-scaling)에 언급되어 있습니다. 별도로해야한다고 생각합니다. 그렇지 않으면 교육 데이터가 테스트 샘플의 영향을 받게됩니다. Scaler 클래스를 사용하여 훈련 데이터의 평균 및 표준 편차를 계산 한 다음 동일한 변환을 테스트 데이터에 적용 할 수 있습니다. – Maehler

+8

독립 실행 형 함수 인'scale'이 아니라'Scaler'를 사용해야합니다. Scaler는'Pipeline'에 플러그인 될 수 있습니다. 'scaling_svm = Pipeline ([("scaler", Scaler()), ("svm", SVC (C = 1000))])'. –

관련 문제