오늘은 어제에 내용인 Support vector machine (classification)에 이어서 분석해보도록 하겠습니다.
데이터셑 만드는 것은 이전 포스팅을 참고하시고 코드만 적어놓겠습니다.
※ 윈도우로 진행해보니까 많이 딜레이되네요. 데이터를 조금 줄여서 진행해보겠습니다.
> 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에 대해서 하도록 하겠습니다.
감사합니다.
'실용적인프로그래밍 > R' 카테고리의 다른 글
[R] ggplot2 - Scatter plot (0) | 2020.07.22 |
---|---|
[R] ggplot - pair plot 그려보기 (ggplot 기초, gridExtra, ggfittext) (0) | 2020.07.21 |
[R] ggplot2 package 기초 (qplot, ggplot) (0) | 2020.07.20 |
[R] Machine learning (2) - Support vector machine (SVM, part 1) (5) | 2020.07.09 |
[R] Machine learning (1) - Linear regression (0) | 2020.07.08 |
댓글