■ 모델성능개선
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 이 된 것을 확인할 수 있다