순서 - 선형 SVM / 비선형 SVM / (1)

비선형SVM / 커널트릭 / SVR (2)

인공지능 수업시간에 발표했던 PPT.

서포트 백터들과 하이퍼 플래인의 마진 계산 관련 공식은 중간에 텍스트로만 이루어진 슬라이드를 참고하면 된다.




순서 - 선형 SVM / 비선형 SVM / (1)

비선형SVM / 커널트릭 / SVR (2)

인공지능 수업시간에 발표했던 PPT.

서포트 백터들과 하이퍼 플래인의 마진 계산 관련 공식은 중간에 텍스트로만 이루어진 슬라이드를 참고하면 된다.


오늘은 저번 포스팅에서 설명하였던 SVM 을 구현할 예정이다.

테스트 데이터셋은 아래 링크에서 받을 수 있다.



https://archive.ics.uci.edu/ml/datasets/letter+recognition


데이터셋의 변수를 확인해보자.





변수마다 뭘 뜻하는지는 정확히 모르겠고, 여튼 글자 모양(좌표)에 대한 변수라고 생각하면 되겠다.
즉 letters마다 좌표, 넓이 등이 다르다는 것에 착안하여 모델을 만들고, 새롭게 들어오는 데이터들을 성공적으로 분류하는 것을 목표로 한다 

코드는 아래와 같다.


1
2
3
4
5
6
7
8
9
10
## step.1 preparing the data #####
# 데이터 읽기와 구조 확인
letters<-read.csv("letter.csv")
str(letters) #상형문자의 특징들 
 
summary(letters) #최대최소값이 비슷하기 때문에 굳이 정규화 필요 없다 
 
# Training (80%)와 Test(20%) 나누기
letters_train<-letters[1:16000,]
letters_test<-letters[16001:20000,]
cs


특징을 확인하고 학습용과 검증용 데이터로 나눈다. 



1
2
3
4
5
6
## Step 2: Training a model on the data ----
# 단순 선형 SVM을 훈련으로 시작
install.packages("kernlb")
library(kernlab)
letters_classfier<-ksvm(letter~. , data = letters_train, 
                        kernel="vanilladot"# 선형커널 
cs

우리가 사용할 라이브러리는 "kernlab" 라는 라이브러리다.

분류 모델을 만드는 핵심 함수는 ksvm함수인데, 설명은 아래와 같다.




우리의 경우는 letters를 예측할거고, 예측에 사용하는 데이터 프레임 속성은 전부 다 사용하니깐 .로 표시한다.

data 에는 학습용 데이터를 써주고, 사용할 kernel 종류는 vaniladot 을 사용하기로 한다.

여러 kernel 타입이 있는데, 목적에 맞게 선택하여 모델을 만들면 된다.



1
2
3
4
## Step 3: Evaluating model performance ----
# 테스트 데이터셋에 대한 예측
letter_predictions<-predict(letters_classfier,letters_test)
#response - 예측된 범주 인지, probabilities - 예측된 확률인지  / 안쓰면 response 
cs

그 후 predict 함수를 사용하여 예측을 하게 된다. 

해당 함수는 predict(사용할 모델, 예측하고싶은 데이터셋, response or probabilities) 를 사용하면 된다

여기서 response는 예측된 범주일 경우, probailities 는 확률일 경우 사용한다.

우리는 알파벳의 확률 예측이 아니고 범주를 나누는 것이니 response를 사용하기로 하는데, 디폴트 값이 response여서 따로 써줄필요는 없다.


1
2
3
4
# 테스트 데이터 셋 문자와 예측된 문자 비교
View(table(letter_predictions,letters_test$letter))
 
 
cs
이렇게 View 와 table명령어를 사용하면, 예측값과 진짜 검증 데이터의 letter 컬럼이 얼마나 일치하는지 확인해볼 수 있다.



이런식으로 예측값이 인데 진짜 letters컬럼 값이 A일 경우, B일 경우, C일 경우.. 이런식으로 쭉 확인할 수 있다.
하지만 이럴경우 가독성이 떨어지고, 직관성이 떨어지기 때문에 아래 코드를 통해 간단하게 정확도를 확인 할 수 있다. 

1
2
3
4
5
6
7
8
9
10
# look only at agreement vs. non-agreement
# 일치/불일치 예측을 표시하는 TRUE/FALSE 벡터 생성
agreement<-letter_predictions == letters_test$letter
 
# 4000개 중 레코드 어떻게 나오는 지 식별
table(agreement) ## 3357개 정확히 식별 / 643개 틀리게 식별 
 
# agreement실행결과 
FALSE  TRUE 
  643  3357 
cs

 

즉 우리는 3357개를 정확히 식별했고, 643개를 잘못 식별했음을 알 수 있다.




SVM 에 대해 좀 더 자세한 설명을 원하신다면 해당 포스팅 에서 보실 수 있습니다


서포트 벡터 머신은 2차원에서 머무르는 것이 아닌, 3차원 등 차원을 높여서 데이터를 나누는 과정을 뜻한다

즉 고차원에서 데이터를 분류할 수 있는 일종의 칸막이를 만드는 것이다.


이를 좀 더 정확히 설명하면


SVM

 데이터에 있는 특성들을 kernel 함수를 이용하여 입체공간에 데이터를 분류할 수 있는 *판을 만들어 주는 것 

 *판 = 초평면(Hyperplane) 


SVM 의 목표

 Maximum margin hyperplane 을 찾는 것, 즉 마진을 최대화하는 초평면을 찾는 것 


이제 마진은 뭔지, 맥시멈 마진은 어떻게 찾는지 알아보도록 하자.




다시 한번 용어를 정리해보면


Hyperlane 초평면

- 데이터들을 분류할 수 있는 칸막이


Support vectors 서포트 벡터

- 초평면에서 가장 가까운 데이터들  


Margin 마진

- 양쪽 Support vectors와 hyperplane 간의 거리의 합 


이해가 잘 가지 않으면, 그림을 보면 직관적으로 알 수 있다.


즉 서포트 벡터들의 거리인 마진의 최대치 (Maximum margin)을 찾는 것이 서포트 벡터 머신의 목표이며

이 마진의 최대치를 보여주는 초평면이 최종 초평면이 되는 것이다. 


서포트 벡터 머신의 장단점은 아래와 같다.


장점

1.     분류문제나 예측문제 동시에 쓸 수 있다.

2.     신경망 기법에 비해서 과적합 정도가 덜하다.

3.     예측의 정확도가 높음.

4.     사용하기 쉽다

 

단점

1.     Kernel과 모델 파라미터를 조절하기 위한 테스트를 여러 번 해봐야 최적화된 모형을 만들 수 있다.

2.     모형 구축 시간이 오래걸린다

3.     결과에 대한 설명력이 떨어진다


+ Recent posts