안녕하세요. 첫 번째 연습문제인 '서포트 벡터 머신(SVM)을 통한 하이퍼 파라미터 설정'을 다뤄볼게요.
서포트 벡터 머신이란 무엇인지 먼저 알아보기 위해서 위키백과를 참고하였습니다.
서포트 벡터 머신(support vector machine, SVM)은 머신러닝의 분야 중 하나로, 패턴 인식, 자료 분석을 위한 supervised model 입니다. 주로 분류와 회귀 분석을 위해 사용되며, 두 카테고리 중 어느 하나에 속한 데이터의 집합이 주어졌을 때, SVM 알고리즘은 주어진 데이터 집합을 바탕으로 하여 새로운 데이터가 어느 카테고리에 속할 지 판단하는 비확률적 이진 선형 분류 모델을 만듭니다.
만들어진 분류 모델은 데이터가 사상된 공간에서 경계로 표현되는데, SVM 알고리즘은 그 중 가장 큰 폭을 가진 경계를 찾는 알고리즘입니다. SVM은 선형 분류와 비선형 분류에서도 사용될 수 있고, 비선형 분류를 위해서는 데이터를 고차원 특징 공간으로 사상하는 작업을 위해 커널 트릭을 사용하기도 합니다.
서포트 벡터 머신은 분류 또는 회귀 분석에 사용 가능한 초평면(hyperplane) 또는 초평면들의 집합으로 구성되어 있습니다.
직관적으로, 초평면이 가장 가까운 학습 데이터 점과 큰 차이를 가지고 있으면, 분류 오차(classifier error)가 작기 때문에,
좋은 분류를 위해서는 어떤 분류된 점에 대해서 가장 가까운 학습 데이터와 가장 먼 거리를 가지는 초평면을 찾아야 합니다.
일반적으로 초기 문제가 유한 차원 공간에서 다루어지는데, 종종 데이터가 선형 구분이 되지 않는 문제가 발생합니다.
이러한 문제를 해결하기 위해 초기 문제의 유한 차원에서 더 높은 차원으로 대응시켜 분리를 쉽게 하는 방법이 제안되었는데, 그 과정에서 계산량이 늘어나는 것을 막기 위해 각 문제에 적절한 커널 함수 k(x,y)를 정의한 SVM 구조를 설계하여 내적 연산을 초기 문제의 변수들을 사용하여 효과적으로 계산하도록 하였습니다.
즉, 주어진 데이터 점들이 두 개의 클래스 안에 각각 속해 있다고 가정했을 때, 새로운 데이터 점이 두 클래스 중 어느 곳에 속하는지 결정하는 것이 목표입니다. SVM에서 데이터 점이 p-차원의 벡터(p개의 숫자 리스트)로 주어졌을 때, 이러한 데이터 점을 p-1 차원의 초평면으로 분류할 수 있는지를 확인하고 싶은 것입니다. 이러한 작업을 선형 분류라고 말합니다. 데이터를 분류하는 초평면은 여러 경우가 나올 수 있고, 초평면을 선택하는 타당한 방법 중 하나는 두 클래스 사이에서 가장 큰 분류 또는 마진(margin)을 가지는 초평면을 선택하는 것입니다. 그래서 우리는 초평면에서 가장 가까운 각 클래스의 데이터 점들 간의 거리를 최대로 하는 초평면을 선택합니다. 만약 그런 초평면이 존재할 경우, 그 초평면을 최대-마진 초평면(maximum-margin hyperplane)이라 하고, 선형 분류기를 최대-마진 분류기(maximum margin classfier)라고 합니다.
출처 : 위키백과
조금 이해가 되셨나요? 사실 수학도 엄청나게 많아서 엄두가 안나네요 다 적기에는..
오늘 다뤄볼 문제는 서포트 벡터 머신 회귀를 이용한 하이퍼파라미터 설정을 시도해보는 것입니다.
그리고 최상의 SVR 모델은 무엇인가 살펴보는 것입니다. 자세한 궁금증은 나중에 자세히 설명한다고 하니
오늘은 이렇게 진행되는구나 하면 됩니다!
가장 먼저, SVR을 임포트하여, 훈련 데이터와 레이블 데이터를 fit 합니다.
그리고 svm의 rmse결과를 살펴보면, SVM모델의 오차가 111,095 정도로 나오네요.
여태 했던 모델들을 보면 상당히 RMSE가 크다는 것을 알 수 있죠.
그리고, 문제에서 제시한 대로 kernel을 linear와 rbf로 설정하여 하이퍼파라미터 C, gamma를 바꾸며 시도해봅니다.
이 과정이 상당히 긴데요, 5-겹교차 검증으로 평가한 점수는 무려 55.4분이나 지난 후에야 볼 수 있었습니다.
제 가상머신이 메모리 4G, CPU 4개를 할당했음에도 상당한 시간이 걸림을 알 수 있습니다.
최상의 파라미터를 확인해본 결과, 70363.9 정도의 RMSE가 측정되었습니다.
하지만 우리가 이전에 했던 RandomForestRegressor보다는 좋지 않은 모델입니다.
그래서 어떤것이 최상의 param인지 살펴보면,
kernel은 rbf보다 linear 커널이 성능이 좋았음을 알 수 있고, 하이퍼파라미터 C는 테스트 한 것 중에 최대값이었던 30000이 나왔습니다. 즉, 이보다 더 큰 값으로 탐색해본다면 더 좋은 모델을 구할 수 있음을 알 수 있습니다.
시간이 더 여유가 된다면 더 좋은 모델을 찾아 보면 좋을 것 같습니다. (추후에 하게 된다면, 추가해서 올리겠습니다..)
블로그
출처
이 글의 상당 부분은 [핸즈온 머신러닝, 한빛미디어/오렐리앙 제롱/박해선] 서적을 참고하였습니다.
나머지는 부수적인 함수나 메서드에 대해 부족한 설명을 적어두었습니다.
학습용으로 포스팅 하는 것이기 때문에 복제보다는 머신러닝에 관심이 있다면 구매해보시길 추천합니다.
도움이 되셨다면 로그인 없이 가능한
아래 하트♥공감 버튼을 꾹 눌러주세요!
'## 오래된 게시글 (미관리) ## > Python (Linux)' 카테고리의 다른 글
18. Python - 중요한 특성을 선택하는 변환기를 파이프라인에 추가하기 (0) | 2018.11.28 |
---|---|
17. Python - 그리드 탐색을 랜덤 탐색으로 바꾸기 (2) | 2018.11.28 |
15. Python - 테스트 세트로 평가하기 (0) | 2018.11.25 |
14. Python - 모델 세부 튜닝 (0) | 2018.11.25 |
13. Python - 모델 선택과 훈련 (0) | 2018.11.25 |