오늘은 저번 포스팅에서 설명하였던 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개를 잘못 식별했음을 알 수 있다.



+ Recent posts