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