1. 지도학습 알고리즘

1.1 ROC & AUC

  1. ROC
  • 이상적인 모델의 ROC커브는 높은 기준값에서도 TP가 높다면 좋은 모델이다. -컷트라인이 높은데도 불구하고 많은 행이 실제도 TRUE, 모델도 TRUE로 예측했기 때문이다
  • 오분류율인 FP는 높은 기준값에서는 그 값이 적다가, 낮은 기준값에서는 높아진다면 정상적인 모델이다
  1. AUC
  • ROC커브 아래의 면적으로, 클수록 좋은 모델이다.

1.2 Support Vector Machine

  • 두 개 이상으로 나누어진 집단을 분류하는데 사용되는 머신러닝 기법이다.
  • 분류 알고리즘 중에서 가장 정확도가 높은 것 중 하나이며 다양한 분류 상황에서 좋은 성능을 보이고, 이상치의 영향도 적게 받는 것으로 알려져 있다.
  • 마진 : 데이터와 경계사이의 거리
  • support vector : 마진에서 가장 가까운 데이터
  • Hyperplane(초평면) : 이 두가지를 이용하여 그린 선

1.3 지도학습

1.3.1 데이터준비

autoparts <- read.csv("autoparts.csv", header = TRUE)
autoparts1 <- autoparts[autoparts$prod_no == "90784-76001", c(2:11)]
autoparts2 <- autoparts1[autoparts1$c_thickness < 1000, ]

autoparts2$y_faulty <- ifelse((autoparts2$c_thickness < 20) | (autoparts2$c_thickness > 32), 1, 0)

1.3.2 데이터셋 나누기

t_index <- sample(1:nrow(autoparts2), size = nrow(autoparts2) * 0.7)
train <- autoparts2[t_index, ]    # 훈련데이터 (70%)
test <- autoparts2[-t_index, ]    # 검증데이터 (30%)
nrow(train); nrow(test)
## [1] 15236
## [1] 6531
head(train)
##       fix_time a_speed b_speed separation s_separation rate_terms  mpa
## 8743      85.7   0.601   1.673      248.5        651.4         81 80.3
## 9883      85.0   0.603   1.715      248.8        651.8         93 79.4
## 17626     80.9   0.663   1.680      186.1        712.6         84 72.8
## 7812      85.7   0.601   1.677      249.0        649.9         81 77.8
## 15949     82.0   0.642   1.660      188.5        712.9         87 75.5
## 33339     82.7   0.596   1.603      224.4        675.9         84 72.9
##       load_time highpressure_time c_thickness y_faulty
## 8743       18.1                59        24.5        0
## 9883       18.1                63        23.8        0
## 17626      19.2                65        24.9        0
## 7812       18.1                59        25.5        0
## 15949      19.3                65        22.2        0
## 33339      20.2                62        23.4        0

1.3.3 파라미터 최적값 찾기

-cost가 높을수록 이상치 포함가능성 증가 -> 과대적합__ -cost가 낮을수록 이상치 포함가능성 감소 -> 과소적합 사이 적절한 값 -r(감마)이 커질수록 개체간 분산이 낮아지고(영향력이 높아지고) 곡선률(옆 개체에 미치는 영향력)이 커진다. -> 과대적합 -r(감마)이 작을수록 개체간 분산이 커지고(영향력이 낮아지고) 곡선률이 낮아짐(옆 개체에 미치는 영향력)이 낮아짐 -> 과소적합

1.3.4 최적값을 찾는 함수계산

  • 결과값은 gamma 2, cost 16
install.packages("e1071")
library(e1071)
tune.svm(factor(y_faulty) ~ fix_time + a_speed + b_speed + separation + s_separation + 
           rate_terms + mpa + load_time + highpressure_time,
         data = autoparts2, gamma = 2^(-1:1), cost = 2^(2:4))

1.3.5 모델 1 : radial kernal

  • 훈련데이터로 모델을 만든다
library(e1071)
m <- svm(factor(y_faulty) ~ fix_time + a_speed + b_speed + separation + 
           s_separation + rate_terms + mpa + load_time + highpressure_time, 
         data = train, gamma = 2, cost = 16)

1.3.6 예측값 및 정확도

-불량품을 postive로 본다 (불량을 정상품이라고 예측했을 때의 위험이 더 크기 때문)

yhat_test <- predict(m, test)
table <- table(real = test$y_faulty, predict = yhat_test)
table
##     predict
## real    0    1
##    0 5585  104
##    1  168  674
(table[1,1] + table[2,2]) / sum(table)
## [1] 0.9583525

1.3.7 모델 2 : linear kernal

m <- svm(factor(y_faulty) ~ fix_time + a_speed + b_speed + separation + s_separation + 
           rate_terms + mpa + load_time + highpressure_time, 
         data = train, gamma = 2, cost = 16, kernel = "linear")

yhat_test <- predict(m, test)
table <- table(real = test$y_faulty, predict = yhat_test);table
##     predict
## real    0    1
##    0 5592   97
##    1  453  389
(table[1,1] + table[2,2]) / sum(table)  #처음 모델보다 성능이 더 떨어졌다
## [1] 0.9157863

1.3.8 모델 3 : default keranl 기본모델

  • gamma와 cost 값을 지정해주지 않았다.
m <- svm(factor(y_faulty) ~ fix_time + a_speed + b_speed + separation + s_separation + rate_terms + mpa + load_time + highpressure_time, data = train)

yhat_test <- predict(m, test)
table <- table(real = test$y_faulty, predict = yhat_test);table
##     predict
## real    0    1
##    0 5607   82
##    1  469  373
  • 파라미터 최적값을 찾은 경우에 미치지 못하는 것을 알 수 있다.
(table[1,1] + table[2,2]) / sum(table)  
## [1] 0.9156331

1.3.9 ROC & AUC

#install.packages("Epi")
library(Epi)

m <- svm(factor(y_faulty) ~ fix_time + a_speed + b_speed + separation + s_separation +
           rate_terms + mpa + load_time + highpressure_time, data = train, gamma = 2, cost = 16)

yhat_test <- predict(m, test)

ROC(test = yhat_test, stat = test$y_faulty, plot = "ROC", AUC = T, main = "SVM")

1.3.10 새로운 데이터 예측

  • 한 개 데이터 예측
new.data <- data.frame(fix_time = 87, a_speed = 0.609, b_speed = 1.715, 
                       separation = 242.7, s_separation = 657.5, rate_terms = 95, 
                       mpa = 78, load_time = 18.1, highpressure_time = 82)

predict(m, newdata = new.data)  # 새로운 하나의 데이터가 정상으로 분류되었다.
## 1 
## 0 
## Levels: 0 1
  • 복수 데이터 예측 1(벡터)
new.data <- data.frame(fix_time = c(87, 85.7) , a_speed = c(0.609, 0472), 
                       b_speed = c(1.715, 1.685), separation = c(242.7, 243.4), 
                       s_separation = c(657.5, 657.9), rate_terms = c(95, 95), 
                       mpa = c(78, 28.2), load_time = c(18.1,18.2), highpressure_time = c(82,60))

predict(m, newdata = new.data)    # 새로운 1번 2번 데이터 모두 정상으로 분류되었다.
## 1 2 
## 0 0 
## Levels: 0 1
  • 복수 데이터 예측 2(데이터 프레임)

-대리점 이탈 예측 모델에도 같은 방식이 사용 -여기서는 앞에서 test data로 분리된 것을 이용했다.

new.data <- data.frame(fix_time = test$fix_time, a_speed = test$a_speed,
                       b_speed = test$b_speed, separation = test$separation, 
                       s_separation = test$s_separation, rate_terms = test$rate_terms,
                       mpa = test$mpa, load_time = test$load_time, 
                       highpressure_time = test$highpressure_time)

head(predict(m, newdata = new.data))
## 1 2 3 4 5 6 
## 0 0 0 0 1 1 
## Levels: 0 1

1.4 Support vector Regression

  • 서포트 벡터 머신은 종속변수가 연속형인 경우에도 적용할 수 있다 -(이산형인 경 우에 svm을 연속형인 경우 svr)
  • 종속변수가 연속형인 경우에는 회귀분석과 유사한 결과를 내놓는다
  • 이것을 서포트 벡터회귀 모형이라고한다
  • 서로 다른 분류에 속한 관측치 사이에 간격이 최대가 되는 선을 찾아 이것을 선으로 연결한 것으로 연속된 수치로 예측이 가능하다.

1.4.1 자료준비

autoparts <- read.csv("autoparts.csv", header = TRUE)
autoparts1 <- autoparts[autoparts$prod_no == "90784-76001", c(2:11)]
autoparts2 <- autoparts1[autoparts1$c_thickness < 1000, ]

autoparts2$y_faulty <- ifelse((autoparts2$c_thickness < 20) | (autoparts2$c_thickness > 32), 1, 0)

t_index <- sample(1:nrow(autoparts2), size = nrow(autoparts2) * 0.7)
train <- autoparts2[t_index, ]
test <- autoparts2[-t_index, ]
NROW(train);NROW(test)
## [1] 15236
## [1] 6531

1.4.2 회귀 모델 생성

  • 종속변수를 연속형
m <- svm(c_thickness ~ fix_time + a_speed + b_speed + separation + s_separation + 
           rate_terms + mpa + load_time + highpressure_time, 
         data = train, gamma = 2^(-1:1), cost = 2^(2:4)
  • 결과값gamma = 2, cost = 16 값을 적용
library(e1071)
m <- svm(c_thickness ~ fix_time + a_speed + b_speed + separation + s_separation + 
           rate_terms + mpa + load_time + highpressure_time, 
         data = train, gamma = 2, cost = 16)

1.4.3 그래프

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.71277

1.4.4 다중선형 회귀모형과의 비교

m2 <- lm(c_thickness ~ fix_time + a_speed + b_speed + separation + s_separation +
           rate_terms + mpa + load_time + highpressure_time, data = train)

yhat_test <- predict(m2, test)
plot(x = test$c_thickness, y = yhat_test, main = "lm", xlab = "실제값", ylab = " 예측값")

mse <- mean((yhat_test - test$c_thickness)^2)
  • SVR은 예측값의 좌우 모두에서 부산이 큰 반면 다중선형 회귀모형은 우측 부분만 분산이 크게 나왔다.

1.4.5 단순선형 회귀모형과의 비교

regression <- read.csv("regression.csv", header = TRUE)
plot(regression$x, regression$y, pch = 16, xlab = "실제값", ylab = "예측값")

  • LM
m1 <- lm(y ~ x, data = regression)
p1 <- predict(m1, newdata = regression)
plot(regression$x, p1, col = "blue", pch = "L")

  • SVR
m2 <- svm(y ~ x, regression)
p2 <- predict(m2, newdata = as.matrix(regression))
plot(regression$x, p2, col = "red", pch = "S")

연습문제

  1. 1개의 임의 데이터를 예측
new.data <- data.frame(x = 11)
predict(m2, newdata = new.data)
##        1 
## 32.51965
predict(m2, newdata = data.frame(x = 11))
##        1 
## 32.51965
  1. 2개의 임의 데이터를 예측하시오
new.data <- data.frame(x = c(1, 12))
predict(m2, newdata = new.data)
##         1         2 
##  7.667638 38.941073