SVM에서 대량 데이터를 빠르게 돌리 수 있는 방법?
사실 SVM관련해서 궁금한 점이 생긴이유는 SVM을 train하는데 너무 오랜시간이 걸리는 것 같아서 찾아보게되었다.
찾아보다가(사실은 어떻게 찾아야될지 도움을 받긴했지만...) 다양한 방식이 있었다.
- Intel 전용 AI 가속기가 있으니 이 Library를 사용해보라는 것
- BaggingClassifier로 해보라는 것 (나중에 찾아봐야겠다.)
- Linear SVM을 해보라는 것
- warm_start 또는 partial_fit를 활용해보라는 것 (찾아봤는데 SVM 관련해서는 안되는 것 같다?)
AI 알고리즘 가속 구현 라이브러리 활용
https://intel.github.io/scikit-learn-intelex/latest/index.html 이 라이브러리인데 내가 사용하는 CPU도 Intel이여서 사용해보니 꽤 괜찮은 것 같다. 아직 어떻게 구현을 하신것인지는 안 찾아보았는데 이걸 넣어서 실행을 하니 train할 때 CPU Core를 4개를 활용하는 것 같다. htop을 보면 CPU%가 400%이고 TIME+도 1초에 6초씩 증가한다.(원래는 1초씩 증가하는데) 정확한 원리는 모르겠지만 일단 이걸 사용해봐야겠다.
SVM과 Linear SVM의 차이는 무엇일까?
https://stackoverflow.com/questions/11508788/whats-the-difference-between-libsvm-and-liblinear
Linear SVM은 liblinear 사용하고 SVM은 libsvm사용함. 그리고 이거에 대한 알고리즘의 차이가 있다고 나와있음
scikit learn reference에서는 loss function default 차이와 intercept regularization 다루는 방식의 차이가 있다고 하는데, intercept regularization은 뭔지 모르겠음
Linear SVM은 loss function default를 squared_hinge를 사용하고 SVM은 default로 hinge를 사용함
SVM에서는 OVR(one vs rest)와 OVO(one vs one)을 지원한다고 되어있지만 문제가 있음
내가 scikit learn reference에서 decision_function_shape{‘ovo’, ‘ovr’}, default=’ovr’ 라고 되어있는 것을 보고 SVM을 사용해도 ovr이 기본값이니 시간도 오래 걸리지도 않을 것이라고 생각하고 사용하였다.
그런데 교육(train)하는데 오래 걸려서 왜 그런지 찾아보다가 알아낸 사실이었는데, 사실은 내가 주의 깊게 reference 해석을 안 해서 그런 것이었다.
However, note that internally, one-vs-one (‘ovo’) is always used as a multi-class strategy to train models; an ovr matrix is only constructed from the ovo matrix.
즉, SVM에서는 기본적으로 ovo로 모델을 교육시키고 ovo결과를 ovr로 변환시킨다는 것이었다. 그래서 시간이 오래 걸리는 것이라고 생각이 들었고 이걸 해결하는 방식은 SVM을 OVR로 wrapping 하라는 글이 있었다.
ovr_rbf_svc = OneVsRestClassifier(svm.SVC(kernel='rbf', max_iter = 20000))
이런 식으로 wrapping을 하고 난 뒤에 다시 실행해 보고 그래도 오래 걸리는지 확인해 보아야겠다.
'머신러닝_공부 > 파이썬' 카테고리의 다른 글
[Linux] scp를 통해서 간편하게 파일/폴더 전송하기 (0) | 2024.05.20 |
---|---|
[Window/ssh] 윈도우에서 ssh 간편 설정방법 (ssh config) (0) | 2024.05.20 |
[파이썬/huggingface] tokenizer.encode한 뒤 모델사용 시 안되는 문제 (0) | 2024.01.09 |
[파이썬] 패키지(모듈)의 버전 체크하는 방법 (0) | 2023.08.13 |
댓글