본문 바로가기

R

모델 성능개선

728x90
반응형

모델성능개선

caret 표에 있는 옵션에 대해서 자동 튜닝 지원한다.

 

 

 

1. caret 패키지를 이용한 모델 파라미터 자동 튜닝

2.      앙상블 기법

bagging

boosting

 

 

정확도를 올리기 위한 방법에 대한 질문 3가지 (p468)

 

1. 데이터에 대해 어떤 종류의 머신러닝 모델을 사용할 것인가?

: 독버섯 데이터의 경우 나이브베이즈 보다

규칙기반 리퍼 알고리즘이 정확도가 높았다.

정확도

독버섯: 나이브베이즈 < 리퍼 알고리즘

 

2. 해당 모델에 대해서 파라미터 튜닝 어떻게 것인가?

: knn k 파라미터

해결방법?

caret 패키지의 자동 파라미터 튜닝 기법을 사용

규칙기반, 의사결정트리 여러 모델을 사용해보았고,

winnow(선별하다) TRUE, FALSE 예측

trials 값으로 부스팅

   

try 토대로

정확도 카파예측값 구한다

 

설명

1) 독일 채무 불이행 데이터의 라벨 클래스에 대한 설명,

1000개씩 샘플링

2) 25개의 부스트스트랩 샘플이 사용되었다.

1000개씩 25 샘플링해서 훈련시켰다.

3) 12개의 모델이 C5.0 튜닝 파라미터 model, trial, winnow 조합으로

테스트 되었다는 것을 확인할 있다.

후보 모델의 정확도와 카파 통계량을 나타낸다

 

4) 주에 설명된 것처럼 가장 정확도를 갖는 모델이 trial=20,

model=tree, winnow=FALSE 모델이다라는 것을

알려주고 있다.

 

 

3. 데이터를 가지고 여러 모델을 만들었을때 모델 하나를

선택해야해서 모델을 평가해야한다면 어떠한 기준을 사용할 것인가?

: 10 정확도에 따른 척도

(kappa계수, 민감도, 정밀도, 재현율)

해결방법?

caret 패키지를 활용하면 된다(479p)

caret 함수를 사용하면 사진처럼 원하는 값이 자동으로 나온다

 

 

 

 

caret 패키지를 이용한 모델 파라미터 자동 튜닝

"독일은행의 채무 불이행자를 예측하는 모델(C5.0 모델)

생성하는데 자동 파라미터 튜닝 했을때의 정확도와

자동 파라미터 튜닝 했을때의 정확도를 비교해보는 테스트"

 

1. 자동파라미터 튜닝 안했을때의 코드

독일 은행의 대출 여부 데이터로 의사결정 트리 실습

 

 데이터 :   credit.csv ( 데이터 게시판 71)

 

1. 데이터를 로드한다.

 

credit <- read.csv("credit.csv")

str(credit)

 

2. 데이터에 각 컬럼들을 이해한다.

 

 - 라벨컬럼:   default  -->  yes  : 대출금 상환 안함

                                               no   : 대출금 상환

 

  :   prop.table( table(credit$default) )

 

 no    yes

0.7    0.3

 

 - 계좌 소개 :  checking_balance --> 예금계좌

                            saving_balance --->  적금계좌

 

 - amount  :   대출 금액  250마르크 ~ 18424 마르크

               ( 100 마르크 우리나라돈 6~7만원)

 

  :   summary( credit$amount) 

  Min. 1st Qu.  Median    Mean 3rd Qu.    Max.

    250    1366    2320    3271    3972   18424

>

 

 

 과거의 데이터를 분석해보니 대출금 상환 불이행자가

 30% 되어서 앞으로는 30% 이내로 떨어뜨리게

 은행의 목표가 되겠금 model 을 생성해야한다.   

 

 

3. 데이터가 명목형 데이터인지 확인해본다

 

  str(credit)

 

4. 데이터를 shuffle 시킨다

 

set.seed(31)

credit_shuffle <-  credit[sample(nrow(credit)),  ]

 

 

5. 데이터를  9 1로 나눈다

 

train_num<-round(0.9*nrow(credit_shuffle),0)

 

credit_train <- credit_shuffle[1:train_num,]

credit_test <- credit_shuffle[(train_num+1):nrow(credit_shuffle),] 

 

 

6. C5.0 패키지와 훈련데이터를 이용해서 모델을 생성한다.

 

library(C50)

credit_model <- C5.0(credit_train[, -17], credit_train[,17] )

 

 

7. 모델과 테스트 데이터로 결과를 예측한다.

 

credit_result <- predict( credit_model, credit_test[ , -17] )

 

 

 

8. 이원 교차표로 결과를 살펴본다.

 

library(gmodels)

CrossTable( credit_test[ , 17] , credit_result )

                               실제                예측

 

 

 - 라벨컬럼:   default  -->  yes  : 대출금 상환 안함

                                               no   : 대출금 상환

 

 

                  | credit_result

credit_test[, 17] |        no |       yes | Row Total |

------------------|-----------|-----------|-----------|

               no |        66 |         9 |        75 |

                  |     1.179 |     3.946 |           |

                  |     0.880 |     0.120 |     0.750 |

                  |     0.857 |     0.391 |           |

                  |     0.660 |     0.090 |           |

------------------|-----------|-----------|-----------|

              yes |        11 |        14 |        25 |

                  |     3.536 |    11.837 |           |

                  |     0.440 |     0.560 |     0.250 |

                  |     0.143 |     0.609 |           |

                  |     0.110 |     0.140 |           |

------------------|-----------|-----------|-----------|

     Column Total |        77 |        23 |       100 |

                  |     0.770 |     0.230 |           |

------------------|-----------|-----------|-----------|

정확도 80%(100-9+11)

 

 

2. 자동 파라미터 튜닝했을때 정확도

 

library(caret)

 

m <- train(default ~. , data =credit_train  , method="C5.0")

 

> m
C5.0

750 samples
 16 predictor
  2 classes: 'no', 'yes'

No pre-processing
Resampling: Bootstrapped (25 reps)
Summary of sample sizes: 750, 750, 750, 750, 750, 750, ...
Resampling results across tuning parameters:

model  winnow  trials  Accuracy   Kappa   
  rules  FALSE    1      0.6956382  0.2794986
  rules  FALSE   10      0.7153488  0.3147032
  rules  FALSE   20      0.7223820  0.3211199
  rules   TRUE    1      0.6988864  0.2834911
  rules   TRUE   10      0.7200454  0.3153671
  rules   TRUE   20      0.7261676  0.3257318
  tree   FALSE    1      0.6971878  0.2738819
  tree   FALSE   10      0.7254648  0.3047613
  tree   FALSE   20      0.7300087  0.3145206
  tree    TRUE    1      0.6996359  0.2736965
  tree    TRUE   10      0.7250700  0.3044942
  tree    TRUE   20      0.7309490  0.3194469

Accuracy was used to select the optimal model using the largest value.
The final values used for the model were trials = 20, model = tree and winnow
 = TRUE.

 

 

p <- predict(m, credit_test[ , -17])

table( p, credit_test[,17])

 

p     no    yes

  no  68   11

  yes  7   14

정확도 82% (100-11+7)

수동에 비해 2% 오른걸 있다.

 

 

 

 

튜닝절차 커스터 마이징 하기(p 475)

*이전방법

m <- train(default~. , data = credit_train, method="C5.0")

 

*이후방법(튜닝절차 커스터 마이징 p479)

ctrl <- trainControl(method="cv", number=10,

selectionFunction="oneSE")

 

설명: cv -> k-폴드 교차검증 (p476)

   oneSE -> selectionFunction 파라미터는

다양한 후보중에서 최적의 모델을 선택하는

함수를 지정하는데 사용한다.

그런 함수는 3가지가 있는데

best, oneSE, tolerance 이다.

best 단순히 명시된

성능 척도에 대해 최고값을 갖는 후보를 선택하는

것이고 값이 default 이다.

oneSE 최고 성능의 1 표준오차 내의

가장 단순한 후보를 선택한다. (477p)

 

grid <- expand.grid(.model="tree",

.trials=c(1,5,10,15,20,25,30,35),

.winnow="FALSE")

 

m<-train(default~. , data = credit_train, method="C5.0",

metric="Kappa",

trcControl=ctrl,

tuneGrid=grid)

 

 

문제267.

독일 채무 불이행자에 대한 모델을 생성하는데 아래와 같이 caret

패키지의 train 함수의 옵션을 주어서 모델을 생성하고

사용자 지정 했을 보다 정확도가 높아지는지 확인하시오

[튜닝절차 커스터 마이징 방법]

 

*이전방법

# 파라미터 커스터마이즈 안했을때

 

library(caret)

credit <- read.csv("credit.csv")

m <- train(default ~. , data =credit , method="C5.0")

# credit_train 이라고 안하고 credit 이라고 한다

# 자기가 알아서 train, test 를 나눠서 집어넣는다.

 

 m
C5.0

1000 samples
  16 predictor
   2 classes: 'no', 'yes'

No pre-processing
Resampling: Bootstrapped (25 reps)
Summary of sample sizes: 1000, 1000, 1000, 1000, 1000, 1000, ...
Resampling results across tuning parameters:

model  winnow  trials  Accuracy   Kappa   
  rules  FALSE    1      0.6955896  0.2770741
  rules  FALSE   10      0.7204485  0.3236821
  rules  FALSE   20      0.7294558  0.3375142
  rules   TRUE    1      0.6943764  0.2771131
  rules   TRUE   10      0.7274540  0.3435312
  rules   TRUE   20      0.7315766  0.3440307
  tree   FALSE    1      0.6960093  0.2655572
  tree   FALSE   10      0.7322351  0.3135638
  tree   FALSE   20      0.7370961  0.3242064
  tree    TRUE    1      0.6955383  0.2656053
  tree    TRUE   10      0.7275711  0.3026773
  tree    TRUE   20      0.7404935  0.3321332

Accuracy was used to select the optimal model using the largest value.
The final values used for the model were

trials = 20, model = tree and winnow = TRUE.

 

 

p <- predict(m, credit)

 table( p, credit$default)
    
p      no
  yes
  no  699   3
  yes   1
 297

 

 

========================================================

*커스터마이즈 튜닝 이후 방법

 

credit <- read.csv("credit.csv")

# credit 다시 로드시켜야 한다.

# 새롭게 로드 안하면 값이 달라진다.

 

ctrl = trainControl(method='cv', # cv k-폴드 교차검증 사용

                   number=10,   # number 10 폴드로 진행

                   selectionFunction='oneSE')

# selectionFuntion 파라미터는 다양한 후보 중 최적의 모델을 선택하는

함수를 지정

# best : 단순히 명시된 성능 척도에 대해 최고값을 갖는 후보 선택

# oneSE : 최고 성능의 1표준오차 내의 가장 단순한 후보 선택

# tolerance

 

grid = expand.grid(.model='tree',

                   .trials=c(1,5,10,15,20,25,30,35),

                   .winnow='FALSE')

m = train(default~., data=credit, method='C5.0',

          metric='Kappa',

          trcControl=ctrl,

          tuneGrid=grid)

 m
C5.0

1000 samples
  16 predictor
   2 classes: 'no', 'yes'

No pre-processing
Resampling: Bootstrapped (25 reps)
Summary of sample sizes: 1000, 1000, 1000, 1000, 1000, 1000, ...
Resampling results across tuning parameters:

trials  Accuracy   Kappa   
   1      0.6900576  0.2512586
   5      0.7100196  0.2840708
  10      0.7255687  0.2997115
  15      0.7247232  0.3037494
  20      0.7310506  0.3138097
  25      0.7317947  0.3184778
  30      0.7336911  0.3205554
  35      0.7343570  0.3216195

Tuning parameter 'model' was held constant at a value of tree
Tuning
 parameter 'winnow' was held constant at a value of FALSE
Kappa was used to select the optimal model using the largest value.
The final values used for the model were

trials = 35, model = tree and winnow = FALSE.

 

 p <- predict(m, credit)
> table( p, credit$default)
    
p      no
  yes
  no  700   0
  yes   0
 300

 

**FALSE (FN, FP) 0 것을 확인할 있다

 

 

 

728x90
반응형

'R' 카테고리의 다른 글

랜덤포레스트  (0) 2019.04.17
모델성능개선 부스팅, 앙상블,배깅  (0) 2019.04.17
모델 성능평가  (0) 2019.04.03
연관규칙  (0) 2019.04.03
k-means  (0) 2019.04.03