지방이의 Data Science Lab

[R] 5-fold CV 코드 직접 생성 (숫자빼고 반복되는 코드일 경우, 깨알 팁) 본문

Data Analysis/깨R지식

[R] 5-fold CV 코드 직접 생성 (숫자빼고 반복되는 코드일 경우, 깨알 팁)

[지현] 2020. 1. 5. 10:06

일반적으로 사용하는 caret에서 성능평가가 아닌,

즉, caret에 포함되지 않은 모델을 만들때 유용하다. 

 

train/test set을 각각 5세트로 만들어서 confusion matrix를 직접만들어서 성능을 평가해야하는 경우 사용할 수 있다.

나의 경우 베이지안 네트워크 모델을 사용하기 위해 사용했다.

 

1
2
3
4
5
6
7
8
9
10
11
12
library(forecast)
flds=createFolds(data$target,k=5,list=T,returnTrain = F)
 
c=c(); f=c()
for(i in 15){
 want_assign = data[-flds[[i]],]
 name = paste0('train', i, sep='', collapse = ',')
  c = c(c, assign(b, a))
  
 want_assign = data[flds[[i]],]
name = paste0('test', i, sep='', collapse = ',')
  f = c(f, assign(e, d))}
cs

 

위 코드에서 assign함수를 사용해줬다.  

train1 = data[-flds[[1]],]

test1 = data[flds[[1]],]

 

train2 = data[-flds[[2]],]

test2 = data[flds[[2]],]

.

.

.

train5 = data[-flds[[5]],]

test5 = data[flds[[5]],]

 

이렇게 여러번 같은 코드 나열하기 싫어서 한번에 돌리려고 사용한 것이다. 

 

 

(* 숫자빼고 비슷하게 동작되는 dataset을 계속 만들때 지치지않고 만드려면 아래코드가 유용하다:)

더보기

위의 코드를 이해한 후, 아래코드를 이해하면 조금 더 편리함이 커진다.

get함수를 이해해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
for (i in 1:5){
  bn.mle = bn.fit(dag, data = get(paste0('train',i)), method = "mle")
  bn.bayes = bn.fit(dag, data =  get(paste0('train',i)), method = "bayes", iss = 10)
  
  pred_mle = predict(bn.mle, "target", get(paste0('test',i)), prob=T)
  pred_bayes = predict(bn.bayes, "target", get(paste0('test',i)), prob=T)
  
  temp=attributes(pred_bayes)$prob[1,]
  
  temp_result=c()
  temp_result[temp>0.8784863]=1
  temp_result[temp<=0.8784863]=0
  
#Accuracy
  Table=table(temp_result, get(paste0('test',i))$target)
  name = paste0('acc', i, sep='', collapse = ',')
  acc = (Table[1,2]+Table[2,1])/sum(Table)
  h= c(h, assign(name, acc))
  
  #F1 Score
  Precision=Table[2,1]/(Table[2,1]+Table[2,2])
  Recall=Table[2,1]/(Table[1,1]+Table[2,1])
  bn_F1_score=2*(Precision*Recall)/(Precision+Recall)
  name = paste0('bn_F1_score', i, sep='', collapse = ',')
  g=c(g, assign(name, bn_F1_score))
}

 

 

Comments