본문 바로가기
실용적인프로그래밍/R

[R] Machine learning (3) - Support vector machine (SVR, part2)

by 인포메틱스 2020. 7. 10.
반응형

오늘은 어제에 내용인 Support vector machine (classification)에 이어서 분석해보도록 하겠습니다.

 

 


데이터셑 만드는 것은 이전 포스팅을 참고하시고 코드만 적어놓겠습니다. 

 

※ 윈도우로 진행해보니까 많이 딜레이되네요. 데이터를 조금 줄여서 진행해보겠습니다.

 

https://mopipe.tistory.com/38

 

Machine learning (2) - Support vector machine (SVM, part 1)

오늘은 Support vector machine (SVM)에 대해서 이야기해보려고 합니다! SVM은 Machine learning methods중에서 쓸만한 방법중 하나라고 생각합니다.! (SVM이 최고라능~!) 어떤 데이터를 넣어도 중간 이상은 하는..

mopipe.tistory.com

> library(ggplot2)
> data("diamonds")
> data1=diamonds
> set.seed(7054)
> r<-sample(x = nrow(data1),size = nrow(data1)/3)
> data1=diamonds[r,]
> ### make train set, test set
> set.seed(7054)
> r<-sample(nrow(data1),nrow(data1)/3)
> test_set<-data1[r,]
> train_set<-data1[-r,]
> nrow(test_set)+nrow(train_set)==nrow(data1)
[1] TRUE
>

 


SVR (Support Vector Regression) 방법

1. Model 제작, 적용 

 

Regression을 하기 위해서는 어떤 것을 종속변수, 독립변수로 둘 것이냐가 중요합니다.

 

연구가설은 종속변수를 price, 독립변수를 carat, depth, table, x, y, z로 설명해보자 입니다. (carat에 따라 당연히 가격예측시 쉽겠지만 연습삼아 진행하겠습니다.)

 

SVM과는 다르게 바로 모델을 만들어보겠습니다.

> library(e1071)
> svr.model<-svm(price~carat+depth+table+x+y+z,data=train_set)
> svr.model

Call:
svm(formula = price ~ carat + depth + table + x + y + z, data = train_set)


Parameters:
   SVM-Type:  eps-regression 
 SVM-Kernel:  radial 
       cost:  1 
      gamma:  0.1666667 
    epsilon:  0.1 


Number of Support Vectors:  5230
>

default값들이 eps-regression, radial로 되어있네요. 종속변수가 숫자여서 알아서 바뀐것 같습니다. (factor일시에 C-classification)

 

eps-regression을 보면 parameter가 cost, gamma, epsilon이렇게 3가지가 있습니다. 각 parameter를 변경해서 분석도 가능합니다.

> svr.model<-svm(price~carat+depth+table+x+y+z,data=train_set,kernal='radial',type='eps-regression',epsilon=0.5,cost=2,gamma=0.1)
> svr.model

Call:
svm(formula = price ~ carat + depth + table + x + y + z, data = train_set, kernal = "radial", type = "eps-regression", epsilon = 0.5, cost = 2, gamma = 0.1)


Parameters:
   SVM-Type:  eps-regression 
 SVM-Kernel:  radial 
       cost:  2 
      gamma:  0.1 
    epsilon:  0.5 


Number of Support Vectors:  1409

>

 

다시 아까의 기본으로 돌아가는 모델로 돌아가서 모델을 만들었으니, 실제로 적용을 시켜봐야 합니다.

 

모델을 적용시키는 기능은 Linear regression, SVM 때와 마찬가지로 predict을 사용합니다.

> tr_result<-predict(object = svr.model,newdata = train_set)
> te_result<-predict(object = svr.model,newdata = test_set)
> tr_result[1:10]
        1         2         3         4         5         6         7         8         9        10 
1426.6038  662.9208 3685.6247 3025.5322 4760.7176 6598.6247 1551.5200  662.4539 6367.4402 8004.7049 
> te_result[1:10]
        1         2         3         4         5         6         7         8         9        10 
 681.8086 6232.3211 9688.9232  666.8110 1016.0009 6286.0432 7660.9037 9154.4871 1673.3820 5677.4199 
>

Regression에서 예측이 잘되었는지 확인하는 방법실측값과 예측값에 대한 상관분석 (correlation)Mean squared error (MSE)값을 이용합니다.

> cor(tr_result,train_set$price) ## train set correlation between Obs and predict
[1] 0.9404246
> cor(te_result,test_set$price) ## test set correlation between Obs and predict
[1] 0.9391345
> mean((tr_result-train_set$price)^2) ## train set MSE
[1] 1871542
> mean((te_result-test_set$price)^2) ## test set MSE
[1] 1934484
>

MSE값들은 root를 씌워서 나타내기도 합니다. (RMSE)

 

2. 최적화 방법

 

최적화 방법은 SVM과 마찬가지로 tune이라는 기능을 이용합니다.

 

tune기능은 SVM에서 설명했듯이 parameter들의 조합을 모두 이용하여 모델을 만들고 performance를 확인후 최적의 모델을 알려주는 것입니다.

 

※ 참고

tune을 이용하면 train set에 대한 최적 모델이 나오기때문에 Overfitting이 일어날수있음을 염두해야함.

 

> best_svr.model<-tune.svm(price~carat+depth+table+x+y+z,data=train_set,gamma = c(0.1,0.5),cost=c(2,4),epsilon = c(0.1,1))
> best_svr.model

Parameter tuning of ‘svm’:

- sampling method: 10-fold cross validation 

- best parameters:
 gamma cost epsilon
   0.1    2     0.1

- best performance: 1935393 

> summary(best_svr.model)

Parameter tuning of ‘svm’:

- sampling method: 10-fold cross validation 

- best parameters:
 gamma cost epsilon
   0.1    2     0.1

- best performance: 1935393 

- Detailed performance results:
  gamma cost epsilon   error dispersion
1   0.1    2     0.1 1935393   145652.3
2   0.5    2     0.1 1967255   158999.3
3   0.1    4     0.1 1938222   151469.6
4   0.5    4     0.1 1968704   154794.9
5   0.1    2     1.0 7689860    71321.9
6   0.5    2     1.0 8756898   178408.0
7   0.1    4     1.0 6942284   159516.1
8   0.5    4     1.0 8605783   200350.1

>

 

SVM과는 다르게 그래프로 최적화를 시킬 수가 없습니다.

 

그래도 Summary로 보게되면, 1번 모델이 가장 Optimal하게 나온것으로 보아, gamma를 좀더 낮추거나, epsilon을 좀더 낮춰도 괜찮을것같네요.

 

best model을 적용시켜 분석해보면, 다음과 같이 나옵니다.

> tr_result<-predict(object = best_svr.model$best.model,newdata = train_set)
> te_result<-predict(object = best_svr.model$best.model,newdata = test_set)
> cor(tr_result,train_set$price) ## train set correlation between Obs and predict
[1] 0.9401974
> cor(te_result,test_set$price) ## test set correlation between Obs and predict
[1] 0.9390521
> mean((tr_result-train_set$price)^2) ## train set MSE
[1] 1878207
> mean((te_result-test_set$price)^2) ## test set MSE
[1] 1932262
>
  default model Optimal model (tune)
train set test set train set  test set
correlation Obs vs. Pre 0.94 0.9391 0.94 0.939
MSE 1871542 1934484 1878207 1932262

 

음... 결과들을 비교해보니 default랑 Optimal이랑 별차이가 없어 보이네요. 

 

이럴 경우는 샘플링을 다시 해서 모델을 다시 설정하던지 혹은 이미 예측력이 최대여서 결과도 비슷하게 나온 것이라 판단됩니다.

 

correlation값에서 0.1이상정도 차이가 나야지 조금 값들이 차이가 나는구나 생각할 수 있습니다. (차이가 나는 cutoff는 개인이 판단해서 결정해야 합니다.)

 


여기까지! SVR에 대한 포스팅을 완료하였습니다! 

 

나중에 기회가 된다면, SVR에 대해 이론적인 설명도 같이 정리해서 올리도록하겠습니다.

 

아마 다음 Machine learning 포스팅은 random tree에 대해서 하도록 하겠습니다.

 

감사합니다.

 

728x90
반응형

댓글