2012-02-15 8 views
32

저는 예측 모델을 Python으로 제작하고 있으며 scikits learn의 SVM 구현을 사용하고 있습니다. 사용하기 쉽고 비교적 빠르고 사용하기 쉽습니다.Python에서 가장 빠른 SVM 구현

불행히도 저는 런타임에 제약을 받기 시작했습니다. 650 개의 기능을 갖춘 전체 데이터 세트에서 rbf SVM을 실행합니다. 각 실행에는 약 1 분이 소요됩니다. 그러나 5 배 교차 유효성 검사 + 그리드 검색 (정밀한 검색에 대해 거친 검색 사용)을 사용하면 손에 닿기 어려운 상황이됩니다. 따라서 일반적으로 사람들은 Python에서 사용할 수있는 가장 빠른 SVM 구현 측면에서 어떤 권고 사항을 가지고 있습니까? 저, 또는 내 모델링 속도를 높이는 어떤 방법?

LIBSVM의 GPU 구현에 대해 들었습니다. 작동하는 것처럼 보입니다. 파이썬에서 사용할 수있는 다른 GPU SVM 구현에 대해서는 알지 못하지만 다른 사람들에게 공개 될 것입니다. 또한 GPU를 사용하면 런타임이 크게 증가합니까?

또한 선형 SVM + 기능 맵을 scikits로 사용하여 rbf SVM을 근사화하는 방법이 있다고 들었습니다. 이 접근법에 대해 사람들이 어떻게 생각하는지 확신하지 못합니다. 다시 말하지만,이 접근법을 사용하는 사람은 런타임에서 중요한 증가입니까?

프로그램의 속도를 높이기위한 모든 아이디어를 환영합니다.

답변

26

내가 알고있는 가장 확장 성 높은 커널 SVM 구현은 LaSVM입니다. Cython, ctypes 또는 cffi을 알면 C로 작성하여 파이썬으로 감쌀 수 있습니다. 또는 명령 행에서 사용할 수도 있습니다. sklearn.datasets의 유틸리티를 사용하여 NumPy 또는 CSR 형식의 데이터를 LaSVM이 학습/테스트 세트로 사용할 수있는 svmlight 형식의 파일로로드 할 수 있습니다.

+0

감사합니다. 이것 좀 봐. 분명히 흥미로워 보인다. Sklearn은 svm light 형식으로 내보낼 수 있습니까? 그것은 확실히 유용 할 것입니다. 이전 답변에 대한 답변으로 불행히도 저는 timeseries를 다루므로 무작위 샘플링 + 열차/테스트로의 침입은 좀 더 복잡해집니다. 내 모델을 훈련시키기위한 서브 샘플링이 그다지 간단하지는 않을지 모르겠습니다. 감사! – tomas

+0

죄송합니다 빠른 부록 ogrisel, sklearn의 유틸리티 기능이 SVM 라이트 형식으로 내보낼 수 있는지 알고 있습니까? – tomas

+0

실제로 문서에서 누락되었지만 그곳에 있습니다. https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/datasets/svmlight_format.py#L142 – ogrisel

2

SVM 라이브러리를 비교하지 않고도 교차 검증을 통해 설명하는 작업은 실제 멀티 스레딩 (즉, 여러 CPU를 병렬로 실행)의 이점을 누릴 수 있다고 생각합니다. CPython을 사용하는 경우 GIL으로 인해 (아마도) 멀티 코어 시스템을 사용하지 않습니다.

이 제한이없는 다른 Python 구현을 시도해 볼 수 있습니다. .NET에 기꺼이 간다면 PyPy 또는 IronPython을 참조하십시오.

+0

감사합니다. 내 멀티 코어 컴퓨터를 활용한다고 가정 할 때, 내 프로그램 속도를 높이는 다른 제안은 무엇입니까? 어쨌든 여러 스레드에서 유효성을 검사하는 방법을 찾아 냈습니다. 그러나 나는 아직도 속도가 필요하다고 생각한다. – tomas

+0

@bavaza, 나는 여러 해 동안 여러 코어에서 파이썬을 실행 해왔다. 표준 CPython의 다중 처리 라이브러리를 연구하십시오. –

+0

@ V3ss0n, 감사합니다. 멋진 lib처럼 보입니다. 스레드가 아닌 프로세스를 사용하므로 컨텍스트 전환 패널티 (예 : 대규모 작업자 풀을 사용할 때)에 익숙합니까? – bavaza

22

는 다른 방법 대신 전체 데이터 세트의 1000 개 무작위 샘플에 그리드 검색을 실행할 수 있습니다

>>> from sklearn.cross_validation import ShuffleSplit 
>>> cv = ShuffleSplit(3, test_fraction=0.2, train_fraction=0.2, random_state=0) 
>>> gs = GridSeachCV(clf, params_grid, cv=cv, n_jobs=-1, verbose=2) 
>>> gs.fit(X, y) 

은 5000 개 샘플에 대한 최적의 매개 변수를 1000 개 샘플에 대한 최적의 매개 변수에 매우 가까이 될 것으로 매우 가능성이 높습니다. 그래서 이것은 거친 격자 검색을 시작하는 좋은 방법입니다.

n_jobs=-1 모든 CPU를 사용하여 개별 CV 피팅을 병렬로 실행할 수 있습니다. 다중 처리를 사용하므로 파이썬 GIL은 문제가되지 않습니다.

8

우선 scikit-learn의 벤치 마크 (here)에 따르면 scikit-learn은 이미 가장 빠른 SVM 패키지가 아닌 가장 빠른 SVM 패키지 중 하나입니다. 따라서 교육 속도를 높이는 다른 방법을 고려할 수도 있습니다.

bavaza가 제안한대로, 교육 과정을 멀티 스레드 할 수 있습니다. Scikit-learn의 GridSearchCV 클래스를 사용하는 경우 n_jobs 인수를 기본값 인 1보다 크게 설정하면 더 많은 메모리를 사용하면서 병렬로 학습을 수행 할 수 있습니다. 당신은 쇼군 기계 학습 도서관 here

장군 좀 걸릴 수 있습니다, 클래스를 사용하는 방법의 예는 here

다른 방법으로 찾을 수 있습니다 그 문서 here을 찾을 수 있습니다 대규모 기계 학습을 위해 설계되었습니다 많은 일반적인 svm 패키지에 대한 래퍼가 있으며 파이썬 바인딩과 함께 C/C++로 구현됩니다. 위의 Scikit-learn 벤치 마크에 따르면, 속도는 scikit-learn과 비슷합니다. 다른 작업 (시연 한 것 이외의 다른 작업)에서는 더 빠를 수 있으므로 시도해 볼 가치가 있습니다.

마지막으로 차원 축소를 시도 할 수 있습니다. 예 : PCA 또는 임의 PCA를 사용하여 특성 벡터의 차원을 줄입니다. 그것은 훈련 과정을 가속화 할 것입니다. 각 클래스에 대한 문서는 PCA, Randomized PCA의 두 링크에서 찾을 수 있습니다. Scikit-learn의 예제 섹션에서 예제를 사용하는 방법에 대한 예제를 찾을 수 있습니다.

4

RBF 커널 (또는 다른 문제에 대해서는 다른 2 차 커널) 만 사용하려면 MATLAB 또는 Octave에 LIBSVM을 사용하는 것이 좋습니다. 나는 약 6 초 만에 7000 회의 관측과 500 개의 관측 모델을 훈련시킨다.

트릭은 LIBSVM이 제공하는 사전 계산 된 커널을 사용하고 일부 행렬 대수를 사용하여 데이터를 두 번 반복하지 않고 한 단계로 커널을 계산하는 것입니다. 커널은 LIBSVM 자신의 RBF 커널을 사용하는 것과는 반대로 빌드하는데 약 2 초 정도 걸린다. 나는 당신이 NumPy을 사용하여 파이썬에서 그렇게 할 수 있다고 생각하지만, 시도하지는 않았는지 확신 할 수 없다.

+4

일반적으로 LibSVM은 훌륭한 성숙한 라이브러리이지만, 가장 빠르지는 않지만 7000 x 500은 테스트하기에 아주 작은 문제라고 생각합니다. – mrgloom

-1

입력 한 기능의 수를 줄이려면 random forest을 사용하는 것이 좋습니다.

기능 가져 오기를 생성하기위한 ExtraTreesRegressor 및 ExtraTreesClassifier 옵션이 있습니다. 이 정보를 사용하여 SVM에 기능의 하위 집합을 입력 할 수 있습니다.

0

Scikit-Learn의 Stochastic Gradient Descent 구현을 살펴 보는 것이 좋습니다. 기본 힌지 손실은 선형 SVM입니다. 나는 그것이 굉장히 빠르다는 것을 알았다. 문제는 두 개의 클래스 인 경우