(1)

library(tidyverse)
library(rpart)
library(rpart.plot)
library(pROC)
library(plotly)
hw_tb = read_csv("dataset_29_credit-a.csv")
## Parsed with column specification:
## cols(
##   A1 = col_character(),
##   A2 = col_character(),
##   A3 = col_double(),
##   A4 = col_character(),
##   A5 = col_character(),
##   A6 = col_character(),
##   A7 = col_character(),
##   A8 = col_double(),
##   A9 = col_logical(),
##   A10 = col_logical(),
##   A11 = col_character(),
##   A12 = col_logical(),
##   A13 = col_character(),
##   A14 = col_character(),
##   A15 = col_double(),
##   class = col_character()
## )
hw_tb = hw_tb %>% mutate(
    A1=as.factor(A1),
    A4=as.factor(A4),
    A5=as.factor(A5),
    A6=as.factor(A6),
    A7=as.factor(A7),
    A9=as.factor(A9),
    A10=as.factor(A10),
    A12=as.factor(A12),
    A13=as.factor(A13),
    A2=as.numeric(A2),
    A3=as.numeric(A3),
    A8=as.numeric(A8),
    A11=as.numeric(A11),
    A14=as.numeric(A14),
    A15=as.numeric(A15),
    class=as.factor(class)
  )
## Warning: 강제형변환에 의해 생성된 NA 입니다

## Warning: 강제형변환에 의해 생성된 NA 입니다
set.seed(2010)
n = sample(1:nrow(hw_tb), round(nrow(hw_tb)/2)) 
train = hw_tb[n,] 
test = hw_tb[-n,]

str(train)
## tibble [345 x 16] (S3: tbl_df/tbl/data.frame)
##  $ A1   : Factor w/ 3 levels "?","a","b": 3 3 3 3 2 3 3 2 3 3 ...
##  $ A2   : num [1:345] 22.7 37.3 21.8 27.6 18.2 ...
##  $ A3   : num [1:345] 0.75 2.66 1.54 3.25 10 ...
##  $ A4   : Factor w/ 4 levels "?","l","u","y": 3 3 3 4 4 4 3 3 4 3 ...
##  $ A5   : Factor w/ 4 levels "?","g","gg","p": 2 2 2 4 4 4 2 2 4 2 ...
##  $ A6   : Factor w/ 15 levels "?","aa","c","cc",..: 8 4 10 12 12 3 8 3 3 3 ...
##  $ A7   : Factor w/ 10 levels "?","bb","dd",..: 9 9 9 5 5 5 2 9 9 9 ...
##  $ A8   : num [1:345] 1.585 0.165 0.085 5.085 0.165 ...
##  $ A9   : Factor w/ 2 levels "FALSE","TRUE": 1 1 1 1 1 2 1 2 2 2 ...
##  $ A10  : Factor w/ 2 levels "FALSE","TRUE": 2 1 1 2 1 1 1 2 2 2 ...
##  $ A11  : num [1:345] 1 0 0 2 0 0 0 5 8 16 ...
##  $ A12  : Factor w/ 2 levels "FALSE","TRUE": 2 2 2 2 1 1 2 2 2 1 ...
##  $ A13  : Factor w/ 3 levels "g","p","s": 1 1 1 1 1 1 1 1 1 1 ...
##  $ A14  : num [1:345] 400 0 356 369 340 112 440 140 300 0 ...
##  $ A15  : num [1:345] 9 501 0 1 0 0 4500 5 162 5000 ...
##  $ class: Factor w/ 2 levels "-","+": 1 1 1 1 1 1 1 1 2 2 ...
auc = matrix(NA,nrow=10,ncol=10)

for(i1 in 1:10){
  for(i2 in 1:10){
    tree_control = rpart.control(minsplit = 5*i1-4, cp =0.001*i2, xval=0)
    temp_tree = assign(paste('tree',5*i1-4,i2,sep='_'), rpart(class ~ . , data=train, method='class', control=tree_control) )
    temp_prob = assign(paste('prob',5*i1-4,i2,sep='_'), predict(temp_tree, newdata=test, type="prob")  )
    temp_roc = assign(paste('roc',5*i1-4,i2,sep='_'), roc(test$class ~ temp_prob[,2])  )
    auc[i1,i2]=temp_roc$auc
  }
}
colnames(auc) = 0.001*1:10
tb_auc = tbl_df(auc) %>% mutate(minsplit=row_number()*5-4) %>% gather(cp,auc,-minsplit)

plot_ly(tb_auc, x=tb_auc$minsplit, y=tb_auc$cp, z=tb_auc$auc, color=tb_auc$auc) %>%
        add_markers() %>%
        layout(scene = list(
                xaxis = list(title = 'minsplit'),
                yaxis = list(title = 'cp'),
                zaxis = list(title = 'auc'))
               )

hw_tb NOMINAL A1 A4 A5 A6 A7 A9 A10 A12 A13

NUMERIC A2 A3 A8 A11 A14 A15

https://www.openml.org/d/29

Author: Confidential - Donated by Ross Quinlan Source: UCI - 1987 Please cite: UCI

Credit Approval This file concerns credit card applications. All attribute names and values have been changed to meaningless symbols to protect the confidentiality of the data.

This dataset is interesting because there is a good mix of attributes – continuous, nominal with small numbers of values, and nominal with larger numbers of values. There are also a few missing values.

  1. Training 데이터와 Test 데이터를 50:50의 비율로 분할하시오. (단, 시드번호는 학번의 뒤자리수 4개를 사용하시오)

  2. R 프로그램의 ‘rpart’ 명령어를 사용하여 의사결정나무를 수행하고자 한다.

단, hyper-parameter는 아래와 같이 조정한다. A. minsplit = 1 ~ 46 (5의 간격으로) B. cp = 0.001 ~ 0.01 (0.001의 간격으로) C. xval = 0 으로 고정 (pruning 없음) D. 그외 parameter 값들은 default 값을 사용

  1. 위 2번의 조건에 맞는 의사결정나무를 training 데이터를 이용하여 생성하고, test 데이터를 이용하여 예측 정확도를 계산하고자 한다. 이때 예측정확도는 AUROC 값을 사용한다.

  2. 3번의 결과, 총 110개의 AUROC 값을 구할 수 있다. 이를 minsplit과 cp 값의 조합에 따라 AUROC 값으로 3차원 포물선 그래프를 생성하시오. (3D surface plot)

  3. 4번의 결과에서 예측정확도가 가장 높은 최적의 hyper-parameter 조합은 무엇인지 밝히시오.