서포트 벡터 회귀(Support Vector Regression)
서포트 벡터 머신은 반응변수가 연속형인 경우에도 적용 가능
반응변수가 연속형인 경우에는 회귀분석과 유사한 결과로 나타남
서로 다른 분류에 속한 관측치 사이에 간격이 최대가 되는 선을 찾아 이것을 선으로 연결한 것으로 바이너리한 값이 아니라 연속된 수치로 예측이 가능함
분석방법은 SVM의 경우와 동일함
패키지 불러오기
library(e1071) # SVR 분석 패키지
library(Epi) # ROC, AUC
파일 불러오기
autoparts <- read.csv("autoparts.csv", header = T)
dim(autoparts)
## [1] 34139 17
파일 전처리
autoparts1 <- autoparts[autoparts$prod_no=="90784-76001", -c(1:7)]
dim(autoparts1)
## [1] 21779 10
str(autoparts1)
## 'data.frame': 21779 obs. of 10 variables:
## $ fix_time : num 85.5 86.2 86 86.1 86.1 86.3 86.5 86.4 86.3 86 ...
## $ a_speed : num 0.611 0.606 0.609 0.61 0.603 0.606 0.606 0.607 0.604 0.608 ...
## $ b_speed : num 1.72 1.71 1.72 1.72 1.7 ...
## $ separation : num 242 245 243 242 242 ...
## $ s_separation : num 658 657 658 657 657 ...
## $ rate_terms : int 95 95 95 95 95 95 95 95 95 95 ...
## $ mpa : num 78.2 77.9 78 78.2 77.9 77.9 78.2 77.5 77.8 77.5 ...
## $ load_time : num 18.1 18.2 18.1 18.1 18.2 18 18.1 18.1 18 18.1 ...
## $ highpressure_time: int 58 58 82 74 56 78 55 57 50 60 ...
## $ c_thickness : num 24.7 22.5 24.1 25.1 24.5 22.9 24.3 23.9 22.2 19 ...
autoparts2 <- autoparts1[autoparts1$c_thickness < 1000, ] # 이상치 제거
dim(autoparts2)
## [1] 21767 10
# train, test data 나누기
t_index <- sample(1:nrow(autoparts2), size=nrow(autoparts2)*0.7)
train <- autoparts2[t_index, ]
test <- autoparts2[-t_index, ]
파라미터 최적값 찾기(시간 많이 걸려 생략-20분정도)
앞서 SVM 에서 gamma=1, cost=16 찾음
훈련데이터로 모델 생성
m <- svm(c_thickness ~ fix_time+a_speed+b_speed+separation+s_separation+
rate_terms+mpa+load_time+highpressure_time, data=train, gamma=1, cost=16)
summary(m)
##
## Call:
## svm(formula = c_thickness ~ fix_time + a_speed + b_speed + separation +
## s_separation + rate_terms + mpa + load_time + highpressure_time,
## data = train, gamma = 1, cost = 16)
##
##
## Parameters:
## SVM-Type: eps-regression
## SVM-Kernel: radial
## cost: 16
## gamma: 1
## epsilon: 0.1
##
##
## Number of Support Vectors: 2544
예측, 그래프 확인 및 성능평가
# 예측
yhat_test <- predict(m, test)
# 그래프
plot(x=test$c_thickness, y=yhat_test, main="SVR")

# 성능평가(연속형이므로 오차)
mse <- mean((yhat_test - test$c_thickness)^2)
mse
## [1] 1.135597