1. 교차검증 (Cross Validation)

1.1.1 교차검증에 필요한 기본 함수

sample(1:10,size = 10) # sample(변수, 사이즈)
split(iris,iris$Species) # 데이터를 Species에 따라 분리 
split(iris, 1:10) # 데이터를 10개의 집합으로 분리

1.1.2 데이터 준비

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

1.1.3 데이터셋 분할

t_index=sample(1:nrow(autoparts2),size=nrow(autoparts2)) # autopart2를 무작위로 섞기 
split_index=split(t_index,1:10) # 10개의 집합으로 분리
## Warning in split.default(t_index, 1:10): data length is not a multiple of
## split variable
class(split_index) # 리스트 타입으로 저장
## [1] "list"
length(split_index) # key의 개수 확인
## [1] 10

1.1.4 K-fold CV 교차 검증 시행

test : 1번 인덱스 train : 1번을 제외한 다른 인덱스

mse=c() # 빈 벡터 지정 

for(i in 1:10)
{
  test=autoparts2[split_index[[i]],] # autopart2에서 1번 인덱스 그룹의 인덱스들을 행 번호로 가져온다.
  train=autoparts2[-split_index[[i]],] # 위의 인덱스들을 제외한 다른 인덱스들을 행 번호로 가져온다,

  m=lm(c_thickness~.,data=train) # 현재의 train 데이터로 선형회귀 모형 생성
  m_pred=predict(m,test) # 현재의 만들어진 모델로 test 데이터 예측 
  mse[i]=mean((test$c_thickness-m_pred)^2) # 실제값과 예측값의 차이로 현재 모델의 오차들 구하고 평균을 낸다.
}
mse # 평균 제곱 오차 
##  [1] 3.360077 2.811498 2.815335 3.665562 2.916584 3.298741 3.673231
##  [8] 2.993176 3.766696 3.088206
mean(mse)
## [1] 3.238911

1.1.5 간단한 성능 평가 방법

t_index=sample(1:nrow(autoparts2),size=nrow(autoparts2)*0.7) # train:test=7:3 으로 분리 
train=autoparts2[t_index,] 
test=autoparts2[-t_index,]
nrow(train) ; nrow(test)  # train, test 데이터 개수 확인 
## [1] 15236
## [1] 6531
m=lm(c_thickness~.,data=train)
m_pred=predict(m,test)
mean((test$c_thickness-m_pred)^2)
## [1] 3.415367

2. LASSO (Least Absolute Shrinkage and Selection Operator)

기본 오차값 계산에 페널티 계산을 추가하여 두 부분이 모두 최소가 되게하는 람다와 계수를 찾는다.

람다 = 0 : 모든 변수 선택, 베타는 어떤 값이든 관계 없음 -> 과대적합, 모델의 복잡성 증가와 예측력 저하

람다 = 큰 값 : 거의 모든 변수 삭제, 베타는 작아짐 -> 과소적합,

2.1 설명변수 행렬 만들기

autoparts=read.csv("data/autoparts.csv",header = T)
autoparts1=autoparts[autoparts$prod_no=="90784-76001",c(2:11)]
autoparts2=autoparts1[autoparts1$c_thickness<1000,]
xmat=as.matrix(autoparts2[1:9])
head(xmat)
##   fix_time a_speed b_speed separation s_separation rate_terms  mpa
## 1     85.5   0.611   1.715      242.0        657.6         95 78.2
## 2     86.2   0.606   1.708      244.7        657.1         95 77.9
## 3     86.0   0.609   1.715      242.7        657.5         95 78.0
## 4     86.1   0.610   1.718      241.9        657.3         95 78.2
## 5     86.1   0.603   1.704      242.5        657.3         95 77.9
## 6     86.3   0.606   1.707      244.5        656.9         95 77.9
##   load_time highpressure_time
## 1      18.1                58
## 2      18.2                58
## 3      18.1                82
## 4      18.1                74
## 5      18.2                56
## 6      18.0                78

2.2 반응변수 벡터와 람다 후보 만들기

yvec=autoparts2$c_thickness
library("glmnet")
## Loading required package: Matrix
## Loading required package: foreach
## Loaded glmnet 2.0-16
fit.lasso=glmnet(x=xmat,y=yvec,alpha = 1,nlambda = 100) # 람다 100개 생성
fit.lasso.cv=cv.glmnet(x=xmat,y=yvec,nfolds = 10,alpha=1,lambda = fit.lasso$lambda)
# plot(fit.lasso.cv) 

2.3 반응변수 벡터와 람다 후보 만들기

fit.lasso.param=fit.lasso.cv$lambda.min # 최적의 람다를 다른 이름으로 저장 
fit.lasso.tune=glmnet(x=xmat,y=yvec,alpha=1,lambda = fit.lasso.param) # 최적 람다를 이용한 최종 LASSO 모델
coef(fit.lasso.tune) # 생성 모델의 설명변수 계수 출력 / 계수가 클수록 영향 큼 
## 10 x 1 sparse Matrix of class "dgCMatrix"
##                              s0
## (Intercept)        7.065200e+02
## fix_time           5.915140e-02
## a_speed           -1.711912e+01
## b_speed            1.945994e+00
## separation        -7.502414e-01
## s_separation      -7.378120e-01
## rate_terms         1.051817e-02
## mpa               -1.526025e-01
## load_time         -1.507899e-01
## highpressure_time -1.877501e-05
fit.lasso.cv$cvm
##  [1] 14.921929 14.085525 13.377341 12.789391 12.301261 11.896005 11.559552
##  [8] 11.280221 11.048313 10.855778 10.695930 10.563220 10.453040 10.361566
## [15] 10.285464 10.180988 10.084304 10.004037  9.937398  9.882074  9.836142
## [22]  9.798010  9.766351  9.739913  9.714345  9.693320  9.671674  9.653057
## [29]  9.633777  9.615909  9.599083  9.488674  8.477259  7.637660  6.925470
## [36]  6.305997  5.789066  5.360031  5.003529  4.706433  4.459734  4.254668
## [43]  4.084281  3.942551  3.824780  3.726918  3.645516  3.577857  3.521578
## [50]  3.474792  3.435976  3.403678  3.376786  3.354441  3.335921  3.320451
## [57]  3.307539  3.296721  3.287741  3.280259  3.274007  3.268814  3.264484
## [64]  3.260880  3.257886  3.255394  3.253322  3.251585  3.250154  3.248955
## [71]  3.247951  3.247120  3.246428  3.245844  3.245357  3.244953  3.244616
## [78]  3.244332  3.244094  3.243895  3.243734  3.243586  3.243453  3.243358
## [85]  3.243271