2. 비선형 회귀
2.1 SVM를 이용한 비선형 회귀
- SVM : 고차원의 입력에 대해, 변환함수를 통해 가중치를 찾게 됨
이론을 통해 배우는 회귀분석은 대부분 선형적인 모형을 가정하고 있다.
하지만 실제의 데이터는 대부분 선형성을 만족하지 못한다.
따라서 실제적으로 데이터 분석에서 처리해야 하는 데이터는 비선형적인 모델이라고 할 수 있다.
선형 모형은 독립변수에 따라 종속변수가 일정한 변화, 즉 선형성을 보이지만
비선형 모형은 일정한 변화를 보이지 않는다. 수학적인 의미로는, df가 계속 변한다고 할 수 있다.
사인함수나 지수함수처럼 선형적인 모양을 하지 않는 독립변수를 포함하는 모형을 일반적으로 비선형 모형이라 한다.
- R에서의 SVM 회귀 분석 코드
### 비선형 회귀
x = sample(0:2*pi, 1000, replace=T)
y = sin(x)
e = rnorm(1000, 0, 1)
y_e = y+e
plot(x, y_e)
# 샘플데이터 생성
x1 = seq(0, 2*pi, 0.01)
data = data.frame()
for(i in x1){
e1 = rnorm(10, 0, sample(1:3, 1, replace = T))
y1 = sin(i) + e1
x2 = rep(i, 10) # rep -> repeat의 약자
data1 = cbind(x2, y1)
data = rbind(data, data1)
}
plot(data, cex=0.1)
# 선형 라인 그리기
non1 = lm(y1~x2, data)
line(data$x2, non1$fitted.values)
abline(non1, col='red')
### SVM 다중 회귀
install.packages('e1071')
library(e1071)
svm1 = svm(y1~x2, data)
# 참고 : svm은 svc, scr로 classification / regression 용으로 나뉨.
# R에서는 y가 연속형이면 svr, y가 factor형이면 svc로 자동 실행함.
pred1 = predict(svm1, newdata = data)
points(data$x2, pred1, col = 'red', pch = "*", cex = 0.3)
points(data$x2, sin(data$x2), col='blue', pch="#", cex=0.4)
non_svm1 = lm(y1~x2, data)
pred2 = predict(non_svm1, newdata = data)
rmse_s = sqrt(mean(data$y1-pred1)^2)
rmse_n = sqrt(mean(data$y1-pred2)^2)
c(rmse_s, rmse_n) # --> svm과 non-svm 수치 비교
# 참고 : lm은 변수들의 계수, p-value등 각종 지표로 모델을 평가할 수 있지만,
# svm은 rmse로 모델을 평가하는게 거의 유일한 방법. 따라서 그래프를 통해 직관으로 발견하거나 rmse로 평가하는게 일반적임.
svm2 = svm(Species~., train)
pred3 = predict(svm2, newdata = test)
t1 = table(test$Species, pred3)
diag(t1) # table의 대각선 값을 추출하는 함수
sum(diag(t1)) / sum(t1) # 전체 중에 잘 맞힌것만 찾아낸 비율
'Programming & Machine Learning > R X 머신러닝' 카테고리의 다른 글
R을 이용한 통계분석 -5 (실제 데이터를 이용한 시계열 분석) (0) | 2017.07.11 |
---|---|
맥에서 R studio를 사용할때의 간단한 에러해결법 (0) | 2017.07.11 |
R을 이용한 머신러닝 - 1 (선형 회귀분석) (1) | 2017.07.11 |
R을 이용한 통계분석 - 4 (집단간 차이검정과 분산분석) (0) | 2017.07.07 |
R을 이용한 통계분석 - 3 (R을 이용한 데이터 조작 및 가설검정 방법) (0) | 2017.07.05 |