2017-04-20 11 views
3

저는 파이썬에서 scikitlearn을 사용하여 다른 커널을 시도하면서 일부 SVM 모델을 만듭니다. 코드는 매우 간단하고,의 형태로 다음과SVM 커널 속도? 선형 대 RBF 대 폴리

from sklearn import svm 
clf = svm.SVC(kernel='rbf', C=1, gamma=0.1) 
clf = svm.SVC(kernel='linear', C=1, gamma=0.1) 
clf = svm.SVC(kernel='poly', C=1, gamma=0.1) 
t0 = time() 
clf.fit(X_train, y_train) 
print "Training time:", round(time() - t0, 3), "s" 
pred = clf.predict(X_test) 

데이터는 8 기능과 3000 명 관찰 조금 넘는입니다. 나는 rbf가 1 초 이내에 들어간 것을보고 놀랐다. 반면 linear는 90 초 걸렸고 poly는 몇 시간 걸렸다.

나는 비선형 커널이 더 복잡하고 더 많은 시간이 걸릴 것이라고 생각했다. 선형이 rbf보다 훨씬 오래 걸리는 이유가 있습니까? 폴리는 두 가지보다 훨씬 오래 걸리고 있습니까? 내 데이터를 기반으로 극적으로 다를 수 있습니까?

+1

다른 데이터 세트에서 현상을 재현 할 수 있습니까? 이 문제를 일으킨 데이터 세트를 제공 할 수 있습니까? – THN

+0

@thn 네, 사용하는 모든 데이터 세트에 문제가있는 것 같습니다. 그러나 제가 작업 한 것은 Michael J Fox Foundation 모바일 센서 데이터 세트 –

답변

6

데이터를 확장 했습니까?

이것은 SVM에서 문제가 될 수 있습니다. A Practical Guide to Support Vector Classification

의하면 커널 값은 보통 특징 벡터들, 예컨대 내부의 제품에 의존하므로 선형 커널 및 다항 커널의 경우 큰 속성 값은 수치적인 문제를 일으킬 수 있습니다.

Linear Kernel Non-Normalized Fit Time: 0.8672 
RBF Kernel Non-Normalized Fit Time: 0.0124 
Linear Kernel Normalized Fit Time: 0.0021 
RBF Kernel Normalized Fit Time: 0.0039 

그래서 당신이 모양 (560, 30이 데이터 세트에서 그것을 볼 수 있습니다

from time import time 

from sklearn.datasets import load_breast_cancer 
from sklearn.model_selection import train_test_split 
from sklearn.preprocessing import MinMaxScaler 
from sklearn.svm import SVC 

data = load_breast_cancer() 
X = data.data 
y = data.target 
X_train, X_test, y_train, y_test = train_test_split(X, y) 

clf_lin = SVC(kernel='linear', C=1.0, gamma=0.1) 
clf_rbf = SVC(kernerl='rbf', C=1.0, gamma=0.1) 

start = time() 
clf_lin.fit(X_train, y_train) 
print("Linear Kernel Non-Normalized Fit Time: {0.4f} s".format(time() - start)) 
start = time() 
clf_rbf.fit(X_train, y_train) 
print("RBF Kernel Non-Normalized Fit Time: {0.4f} s".format(time() - start)) 

scaler = MinMaxScaler() # Default behavior is to scale to [0,1] 
X = scaler.fit_transform(X) 
X_train, X_test, y_train, y_test = train_test_split(X, y) 

start = time() 
clf_lin.fit(X_train, y_train) 
print("Linear Kernel Normalized Fit Time: {0.4f} s".format(time() - start)) 
start = time() 
clf_rbf.fit(X_train, y_train) 
print("RBF Kernel Normalized Fit Time: {0.4f} s".format(time() - start)) 

출력 : 예는 지금

, 나는 sklearn 유방암 데이터 세트를 사용합니다) 약간의 스케일링으로 성능이 크게 향상되었습니다.

이 동작은 값이 큰 기능에 따라 다릅니다. 무한 차원의 공간에서 작업하는 것에 대해 생각하십시오. 무한 차원 공간을 채우는 값이 다차원 적 제품 사이의 공간을 크게 차지함에 따라 은 많이입니다. 나는 그 많이 충분히 강조 할 수 없습니다. The Curse of Dimensionality에 대해 읽고, 링크 된 위키 항목 이상을 읽으십시오. 이 간격은 프로세스가 오래 걸리는 이유입니다. 이 거대한 공간에서 클래스를 분리하려는 노력의이면에있는 수학은 특히 기능 및 관측 수가 늘어남에 따라 훨씬 더 복잡해집니다. 따라서 항상 귀하의 데이터를 스케일링하는 것이 중요합니다. 단순한 선형 회귀를 수행하는 경우에도 더 큰 값을 갖는 피쳐에 대한 가능한 편향을 없애는 것이 좋습니다.

+0

표준화에서와 같이 척도입니까? 아니요, 일부 변수는 수천, 일부는 수백에서 수십, 다른 변수는 1보다 작거나 0과 100 사이의 백분율입니다. 문제가 발생하더라도이 변수가 rbf에는 거의 영향을 미치지 않지만 매우 강력합니다. 선형 및 폴리에 영향을 미침 –

+0

명확한 설명을 해 주셔서 감사합니다. 궁금한 점이 내 결과의 정확성 또는 속도에만 영향을 미칩니 까? –

+0

나는 당신이 더 나은 정확도를 얻을 수 있다고 이미징 할 것이지만 나는 그것을 시험해야하고 Im을 밤중으로 떠날 것입니다. – Grr