scikit learn을 사용하는 SVM은 끝없이 실행되며 실행을 완료하지 않습니다


76

595605 개의 행과 5 개의 열 (기능)이있는 교육 데이터 세트와 397070 개의 행이있는 테스트 데이터 세트에서 scikit learn (python)을 사용하여 SVR을 실행하려고합니다. 데이터는 사전 처리되어 정규화되었습니다.

테스트 예제를 성공적으로 실행할 수는 있지만 내 데이터 세트를 사용하여 실행하고 1 시간 이상 동안 실행할 수 있지만 여전히 프로그램의 출력 또는 종료를 볼 수 없습니다. 다른 IDE를 사용하여 터미널에서 실행하려고 시도했지만 문제가되지는 않습니다. 또한 'C'매개 변수 값을 1에서 1e3으로 변경하려고했습니다.

scikit을 사용하는 모든 svm 구현에서 비슷한 문제에 직면하고 있습니다.

완료 될 때까지 기다리지 않습니까? 이 실행에는 시간이 얼마나 걸립니까?

내 경험상 몇 분 이상 걸리지 않아야합니다.

시스템 구성은 다음과 같습니다. Ubuntu 14.04, 8GB RAM, 많은 여유 메모리, 4 세대 i7 프로세서


코드를 제공해 주시겠습니까? 또한 교육이나 테스트에 많은 시간이 걸리나요? 소규모 교육 / 테스트 데이터 세트는 어떻습니까?
ffriend

csv 파일에서 팬더 데이터 프레임으로 데이터를 읽고 scikit learn 함수에 전달합니다. 그게 다야! 코드를 제공하면 실제로 도움이되지 않습니다
tejaskhot

6
sklearn의 SVM 구현은 1) SVR 객체 생성, 2) 모델 맞춤, 3) 가치 예측의 3 단계 이상을 의미합니다. 첫 번째 단계는 사용중인 커널을 설명하여 내부 프로세스를 훨씬 잘 이해하는 데 도움이됩니다. 두 번째와 세 번째 단계는 매우 다르므로 적어도 어느 단계가 오래 걸리는지 알아야합니다. 그것이 훈련이라면, 때로는 학습이 느리기 때문에 괜찮을 수도 있습니다. 테스트 중이라면 SVM에서의 테스트가 실제로 빠르기 때문에 버그가있을 수 있습니다. 또한 SVM이 아닌 시간이 오래 걸리는 CSV 읽기 일 수 있습니다. 따라서 이러한 모든 세부 사항이 중요 할 수 있습니다.
ffriend

나는 svm을 통해 같은 문제에 직면하고 있지만 정규화 후에 얼마나 많은 시간이 걸리는지 말해 줄 수 있습니까?
kashyap kitchlu

답변:


69

O(nfeatures×nobservations2)O(nfeatures×nobservations3)

SVR을 다음과 같이 호출하여이 캐시를 늘릴 수 있습니다.

model = SVR(cache_size=7000)

일반적으로 이것은 작동하지 않습니다. 그러나 모든 것이 손실되지 않습니다. 데이터를 서브 샘플링하고 나머지를 유효성 검사 세트로 사용하거나 다른 모델을 선택할 수 있습니다. 200,000 개의 관측 범위보다 선형 학습자를 선택하는 것이 좋습니다.

커널 매트릭스를 근사화하여 선형 SVM에 공급하여 커널 SVM을 추정 할 수 있습니다. 이를 통해 선형 시간에서 정확도와 성능간에 균형을 유지할 수 있습니다.

이를 달성하는 가장 보편적 인 방법은 kmeans / kmeans ++에서 찾은 100 개 정도의 클러스터 센터를 커널 함수의 기초로 사용하는 것입니다. 그런 다음 새로운 파생 피쳐가 선형 모델로 제공됩니다. 이것은 실제로 매우 잘 작동합니다. sophia-mlvowpal wabbit 와 같은 도구 는 Google, Yahoo 및 Microsoft가 수행하는 방식입니다. 입력 / 출력은 간단한 선형 학습자에게 지배적 인 비용이됩니다.

많은 양의 데이터에서 비모수 적 모델은 대부분의 문제에 대해 거의 동일하게 수행됩니다. 텍스트, 이미지, 시계열, 오디오와 같은 구조화 된 입력은 예외입니다.

추가 자료


16

SVM은 2 차 순서의 최적화 문제를 해결합니다.

나는 여기에 언급되지 않은 추가 할 것이 없습니다. SVC 에 대한 sklearn 페이지의 링크를 게시하고 싶습니다 .

구현은 libsvm을 기반으로합니다. 적합 시간 복잡도는 샘플 수에 따라 2 차 이상이며 2 만 개가 넘는 샘플로 데이터 세트에 맞게 확장하기가 어렵습니다.

커널을 사용하지 않고 선형 SVM이면 충분하지만 선형 회귀 분석과 같은 최적화 방법을 사용하기 때문에 LinearSVR 이 훨씬 빠릅니다. 데이터를 정규화해야합니다. 아직 차단하지 않은 경우에 대비하여 요격 계수에 정규화를 적용하기 때문에 아마 원하는 것이 아닙니다. 데이터 평균이 0이 아닌 경우 만족스럽게 해결할 수 없습니다.

또한 최적화 문제를 해결하기 위해 확률 적 경사 하강도 사용할 수 있습니다. Sklearn에는 SGDRegressor 기능이 있습니다 . loss='epsilon_insensitive'선형 SVM과 유사한 결과를 얻으 려면 사용해야 합니다. 설명서를 참조하십시오. 그래디언트 디센트는 최후의 수단으로 만 사용하지만 로컬 최소값에 갇히는 것을 피하기 위해 하이퍼 매개 변수를 많이 조정해야하기 때문입니다. 가능하면 사용하십시오 LinearSVR.


여러 줄의 데이터 집합이있었습니다. SVC는 약 150K 행의 데이터에 대해 너무 오래 걸리기 시작했습니다. LinearSVR과 함께 귀하의 제안을 사용했으며 백만 행은 몇 분 밖에 걸리지 않습니다. PS는 또한 LogisticRegression 분류 기가 LinearSVR과 비슷한 결과를 생성하고 더 빠르다는 것을 발견했습니다.
jeffery_the_wind

8

전처리 단계에서 스케일링을 포함 했습니까? SVM을 실행할 때이 문제가 발생했습니다. 내 데이터 세트는 20 개의 기능 (col)을 가진 ~ 780,000 샘플 (행)입니다. 내 훈련 세트는 ~ 235k 샘플입니다. 데이터 스케일을 잊어 버린 것으로 나타났습니다! 이 경우 코드에 다음 비트를 추가하십시오.

데이터를 [-1,1]로 스케일링; SVM 속도를 높이십시오.

sklearn.preprocessing import에서 MinMaxScaler
스케일링 = MinMaxScaler (feature_range = (-1,1)). fit (X_train)
X_train = scaling.transform (X_train)
X_test = scaling.transform (X_test)


2
왜 이것이 SVM 적합을 가속화하는지 설명 할 수 있습니까?
lppier

1
다른 이유 대신 MinMaxScaler를 선택한 이유가 있습니까? 예를 들어 StandardScaler?
raspi

@Ippier : 본질적으로 기계의 노력 수준을 훨씬 낮추는 방식으로 각 옵션의 가능한 경계 공간을 줄입니다.
이케

7

이러한 거대한 데이터 세트를 사용하면 신경 네트워크, 딥 러닝, 임의의 숲 (놀랍게도 훌륭함) 등을 사용하는 것이 좋습니다.

이전 답변에서 언급했듯이 소요 시간은 훈련 샘플 수의 세 번째 힘에 비례합니다. 예측 시간조차도 테스트 벡터 수의 관점에서 다항식입니다.

실제로 SVM을 사용해야하는 경우 GPU 속도를 사용하거나 훈련 데이터 세트 크기를 줄이는 것이 좋습니다. 데이터 형식 또는 분포에 문제가 없는지 먼저 데이터 샘플 (10,000 행)을 사용해보십시오.

다른 답변에서 언급했듯이 선형 커널이 더 빠릅니다.


3

최근에 앙상블 모델 종류를 훈련시키는 데 사용되었던 데이터 세트의 기능을 확장하는 것을 잊었 기 때문에 비슷한 문제가 발생했습니다. Shelby Matlock이 지적한대로 데이터를 확장하지 못하면 범인 일 수 있습니다. 당신은 같은 sklearn에서 사용할 수있는 다른 스케일러, 시도 할 수 RobustScaler를 :

from sklearn.preprocessing import RobustScaler scaler = RobustScaler() X = scaler.fit_transfrom(X)

X는 이제 변형 / 확장되어 원하는 모델에 공급할 준비가되었습니다.


2

이것은 말이됩니다. IIUC, 지원 벡터 연산의 실행 속도는 차원이 아니라 샘플 수에 의해 제한됩니다. 즉, RAM이 아닌 CPU 시간에 의해 제한됩니다. 시간이 얼마나 걸리는지 확실하지 않지만 몇 가지 벤치 마크를 실행하고 있습니다.


1

밤새도록 또는 24 시간 동안 그대로 두십시오. CPU 사용률은 무엇입니까? 코어가 100 %로 실행되고 있지 않으면 문제가있는 것입니다. 아마도 메모리가있을 것입니다. 데이터 세트가 8GB에 맞는지 확인 했습니까? SGDClassifier를 사용해 보셨습니까? 그것은 가장 빠른 것 중 하나입니다. 한 시간 정도 지나면 완료되기를 바랍니다.


SGDClassifier커널을 지원하지 않습니다. OP가 선형 SVM을 원한다면 먼저 시도해 보는 것이 좋습니다 LinearSVR. SVR선형 회귀 라이브러리를 사용하여 문제를 해결하기 때문에 보다 훨씬 빠르며 (그라디언트 디센트와 달리) 최소값이 보장됩니다.
Ricardo Cruz

귀하의 의견을 부탁드립니다. 커널 지원이 왜 문제가되는지 자세히 설명해 주시겠습니까?
Diego

에서 문서 , The loss function to be used. Defaults to ‘hinge’, which gives a linear SVM.같은 일을 위해 SGDRegressor. SGDRegressor를 사용하는 것과 같습니다 SVR(kernel='linear'). 그것이 OP가 원하는 것이라면 좋습니다. 나는 그가 커널과 함께 SVM을 사용하고 싶다는 인상을 받았다. 그렇지 않은 경우 먼저 시도해 보는 것이 좋습니다 LinearSVR.
Ricardo Cruz

1

데이터를 [-1,1]로 정규화하십시오. 나는 비슷한 문제에 직면하고 정상화되면 모든 것이 잘 작동했습니다. 다음을 사용하여 데이터를 쉽게 정규화 할 수 있습니다.

from sklearn import preprocessing X_train = preprocessing.scale(X_train) X_test = preprocessing.scale(X_test)


@Archie 이것은 질문이 아니라 질문에 대한 답변입니다.
timleathart

1

이 문제가 발생 cache_size했으며 다른 사람들이 제안하는 것처럼 전혀 도움이되지 않습니다. 당신이 볼 수있는 이 게시물이 하나의 주요 기여자가 수동으로 코드를 변경해야한다고 제안한다.

당신도 알다시피,로 SVCSVR최적화 문제이며, 오류 마진이 더 최적화 쓸데없는 곳에 너무 작은 경우에 그들은 중지합니다. 따라서 이것에 또 다른 매개 변수가 있는데 max_iter, 여기서 반복 횟수를 설정할 수 있습니다.

내가 사용하고 sklearn파이썬과 e1071R과 R 훨씬 빠르게 설정을하지 않고 결과에지고 max_itersklearn2-4 배 더 걸립니다. 파이썬의 계산 시간을 줄일 수있는 유일한 방법은을 사용하는 것 max_iter입니다. 모델의 복잡성, 기능 수, 커널 및 하이퍼 매개 변수와 관련이 있지만 작은 데이터 세트의 경우 약 4000 개의 데이터 포인트에 사용 max_iter되었으며 10000결과는 전혀 다르지 않았으며 수용 가능했습니다.


0

115 개의 요소와 하나의 단일 기능 (국제 항공사 데이터) 만 포함하는 데이터 세트와 비슷한 문제가있었습니다. 해결책은 데이터를 확장하는 것이 었습니다. 지금까지 답변에서 놓친 것은 파이프 라인의 사용법이었습니다.

from sklearn.svm import SVR
from sklearn.preprocessing import StandardScaler, MinMaxScaler

model = Pipeline([('scaler', StandardScaler()),
                  ('svr', SVR(kernel='linear'))])

model일반적인 분류 / 회귀 모델처럼 학습 하고 동일한 방식으로 평가할 수 있습니다. 모델의 정의 만 변경되지 않습니다.


무엇입니까 Pipeline? 가져 오지 않습니다.
Bram Vanroy

0

데이터를 확장해야합니다. 스케일링은 데이터 포인트를 -1 ~ 1 범위로 정규화하여 더 빠른 수렴에 도움이됩니다.

다음 코드를 사용해보십시오.

# X is your numpy data array.

from sklearn import preprocessing

X = preprocessing.scale(X)

Data Science SE에 오신 것을 환영합니다! 제안이 OP에 어떻게 도움이되는지 설명해 주시겠습니까? 당신이 제안하는 것은 배열의 스케일링입니다. 그것이 scikit learn의 SVR 알고리즘에 어떻게 영향을 줄지 그렇지 않을지는 명확하지 않습니다.
스테레오
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.