library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
## ✔ ggplot2 3.3.6 ✔ purrr 0.3.4
## ✔ tibble 3.2.1 ✔ dplyr 1.1.1
## ✔ tidyr 1.2.0 ✔ stringr 1.4.0
## ✔ readr 2.1.2 ✔ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
library(GGally)
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
library(skimr)
library(reshape2)
##
## Attaching package: 'reshape2'
##
## The following object is masked from 'package:tidyr':
##
## smiths
library(caret)
## Loading required package: lattice
##
## Attaching package: 'caret'
##
## The following object is masked from 'package:purrr':
##
## lift
library(olsrr)
##
## Attaching package: 'olsrr'
##
## The following object is masked from 'package:datasets':
##
## rivers
library(car)
## Loading required package: carData
##
## Attaching package: 'car'
##
## The following object is masked from 'package:dplyr':
##
## recode
##
## The following object is masked from 'package:purrr':
##
## some
library(glmnet)
## Loading required package: Matrix
##
## Attaching package: 'Matrix'
##
## The following objects are masked from 'package:tidyr':
##
## expand, pack, unpack
##
## Loaded glmnet 4.1-6
library(pROC)
## Type 'citation("pROC")' for a citation.
##
## Attaching package: 'pROC'
##
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
library(ResourceSelection)
## ResourceSelection 0.3-5 2019-07-22
library(MASS)
##
## Attaching package: 'MASS'
##
## The following object is masked from 'package:olsrr':
##
## cement
##
## The following object is masked from 'package:dplyr':
##
## select
library(class)
#library(gtsummary)
bank = read.csv("bank-full.csv", stringsAsFactors = T)
head(bank)
## age job marital education default balance housing loan contact day
## 1 58 management married tertiary no 2143 yes no unknown 5
## 2 44 technician single secondary no 29 yes no unknown 5
## 3 33 entrepreneur married secondary no 2 yes yes unknown 5
## 4 47 blue-collar married unknown no 1506 yes no unknown 5
## 5 33 unknown single unknown no 1 no no unknown 5
## 6 35 management married tertiary no 231 yes no unknown 5
## month duration campaign pdays previous poutcome y
## 1 may 261 1 -1 0 unknown no
## 2 may 151 1 -1 0 unknown no
## 3 may 76 1 -1 0 unknown no
## 4 may 92 1 -1 0 unknown no
## 5 may 198 1 -1 0 unknown no
## 6 may 139 1 -1 0 unknown no
summary(bank)
## age job marital education
## Min. :18.00 blue-collar:9732 divorced: 5207 primary : 6851
## 1st Qu.:33.00 management :9458 married :27214 secondary:23202
## Median :39.00 technician :7597 single :12790 tertiary :13301
## Mean :40.94 admin. :5171 unknown : 1857
## 3rd Qu.:48.00 services :4154
## Max. :95.00 retired :2264
## (Other) :6835
## default balance housing loan contact
## no :44396 Min. : -8019 no :20081 no :37967 cellular :29285
## yes: 815 1st Qu.: 72 yes:25130 yes: 7244 telephone: 2906
## Median : 448 unknown :13020
## Mean : 1362
## 3rd Qu.: 1428
## Max. :102127
##
## day month duration campaign
## Min. : 1.00 may :13766 Min. : 0.0 Min. : 1.000
## 1st Qu.: 8.00 jul : 6895 1st Qu.: 103.0 1st Qu.: 1.000
## Median :16.00 aug : 6247 Median : 180.0 Median : 2.000
## Mean :15.81 jun : 5341 Mean : 258.2 Mean : 2.764
## 3rd Qu.:21.00 nov : 3970 3rd Qu.: 319.0 3rd Qu.: 3.000
## Max. :31.00 apr : 2932 Max. :4918.0 Max. :63.000
## (Other): 6060
## pdays previous poutcome y
## Min. : -1.0 Min. : 0.0000 failure: 4901 no :39922
## 1st Qu.: -1.0 1st Qu.: 0.0000 other : 1840 yes: 5289
## Median : -1.0 Median : 0.0000 success: 1511
## Mean : 40.2 Mean : 0.5803 unknown:36959
## 3rd Qu.: -1.0 3rd Qu.: 0.0000
## Max. :871.0 Max. :275.0000
##
There are a total of 45211 rows and 17 columns.
# Look at structure
str(bank)
## 'data.frame': 45211 obs. of 17 variables:
## $ age : int 58 44 33 47 33 35 28 42 58 43 ...
## $ job : Factor w/ 12 levels "admin.","blue-collar",..: 5 10 3 2 12 5 5 3 6 10 ...
## $ marital : Factor w/ 3 levels "divorced","married",..: 2 3 2 2 3 2 3 1 2 3 ...
## $ education: Factor w/ 4 levels "primary","secondary",..: 3 2 2 4 4 3 3 3 1 2 ...
## $ default : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 2 1 1 ...
## $ balance : int 2143 29 2 1506 1 231 447 2 121 593 ...
## $ housing : Factor w/ 2 levels "no","yes": 2 2 2 2 1 2 2 2 2 2 ...
## $ loan : Factor w/ 2 levels "no","yes": 1 1 2 1 1 1 2 1 1 1 ...
## $ contact : Factor w/ 3 levels "cellular","telephone",..: 3 3 3 3 3 3 3 3 3 3 ...
## $ day : int 5 5 5 5 5 5 5 5 5 5 ...
## $ month : Factor w/ 12 levels "apr","aug","dec",..: 9 9 9 9 9 9 9 9 9 9 ...
## $ duration : int 261 151 76 92 198 139 217 380 50 55 ...
## $ campaign : int 1 1 1 1 1 1 1 1 1 1 ...
## $ pdays : int -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
## $ previous : int 0 0 0 0 0 0 0 0 0 0 ...
## $ poutcome : Factor w/ 4 levels "failure","other",..: 4 4 4 4 4 4 4 4 4 4 ...
## $ y : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 1 1 1 ...
# Skim the dataset
skim(bank)
Name | bank |
Number of rows | 45211 |
Number of columns | 17 |
_______________________ | |
Column type frequency: | |
factor | 10 |
numeric | 7 |
________________________ | |
Group variables | None |
Variable type: factor
skim_variable | n_missing | complete_rate | ordered | n_unique | top_counts |
---|---|---|---|---|---|
job | 0 | 1 | FALSE | 12 | blu: 9732, man: 9458, tec: 7597, adm: 5171 |
marital | 0 | 1 | FALSE | 3 | mar: 27214, sin: 12790, div: 5207 |
education | 0 | 1 | FALSE | 4 | sec: 23202, ter: 13301, pri: 6851, unk: 1857 |
default | 0 | 1 | FALSE | 2 | no: 44396, yes: 815 |
housing | 0 | 1 | FALSE | 2 | yes: 25130, no: 20081 |
loan | 0 | 1 | FALSE | 2 | no: 37967, yes: 7244 |
contact | 0 | 1 | FALSE | 3 | cel: 29285, unk: 13020, tel: 2906 |
month | 0 | 1 | FALSE | 12 | may: 13766, jul: 6895, aug: 6247, jun: 5341 |
poutcome | 0 | 1 | FALSE | 4 | unk: 36959, fai: 4901, oth: 1840, suc: 1511 |
y | 0 | 1 | FALSE | 2 | no: 39922, yes: 5289 |
Variable type: numeric
skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
---|---|---|---|---|---|---|---|---|---|---|
age | 0 | 1 | 40.94 | 10.62 | 18 | 33 | 39 | 48 | 95 | ▅▇▃▁▁ |
balance | 0 | 1 | 1362.27 | 3044.77 | -8019 | 72 | 448 | 1428 | 102127 | ▇▁▁▁▁ |
day | 0 | 1 | 15.81 | 8.32 | 1 | 8 | 16 | 21 | 31 | ▇▆▇▆▆ |
duration | 0 | 1 | 258.16 | 257.53 | 0 | 103 | 180 | 319 | 4918 | ▇▁▁▁▁ |
campaign | 0 | 1 | 2.76 | 3.10 | 1 | 1 | 2 | 3 | 63 | ▇▁▁▁▁ |
pdays | 0 | 1 | 40.20 | 100.13 | -1 | -1 | -1 | -1 | 871 | ▇▁▁▁▁ |
previous | 0 | 1 | 0.58 | 2.30 | 0 | 0 | 0 | 0 | 275 | ▇▁▁▁▁ |
No null data in our dataset.
colSums(is.na(bank))
## age job marital education default balance housing loan
## 0 0 0 0 0 0 0 0
## contact day month duration campaign pdays previous poutcome
## 0 0 0 0 0 0 0 0
## y
## 0
sum(is.na(bank))
## [1] 0
Looking at the subscription count, we can see that we have heavily imbalanced dataset.There are almost 40k Nos while there is about about 5k Yes’s.
There are several plots that are noteworthy. One is the housing barplot. Even though, we see that the number of count for those with no housing is lower, the subscription count is higher.
# yes or no subscruption count
ggplot(bank, aes(x = y)) +
geom_bar()
# Job Count
ggplot(bank, aes(x = job, fill = y)) +
geom_bar() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) + ggtitle("Subscriptions vs. Job Count")
# Education Count
ggplot(bank, aes(x = education, fill = y)) +
geom_bar() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) + ggtitle("Subscriptions vs. Education Count")
# Age Distribution
ggplot(bank, aes(x = age, fill = y)) +
geom_histogram(bins = 50) + ggtitle("Subscriptions vs. Age Distribution")
# Duration Distribution
ggplot(bank, aes(x = duration, fill = y)) +
geom_histogram(bins = 50) + ggtitle("Subscriptions vs. Duration Distribution")
ggplot(bank, aes(x = log(duration), fill = y)) +
geom_histogram(bins = 50) + ggtitle("Subscriptions vs. log(Duration) Distribution")
## Warning: Removed 3 rows containing non-finite values (stat_bin).
# Balance Distribution
ggplot(bank, aes(x = balance, fill = y)) +
geom_histogram(bins = 20) + ggtitle("Subscriptions vs. Balance Distribution")
# Housing Count
ggplot(bank, aes(x = housing, fill = y)) +
geom_bar() + ggtitle("Subscriptions vs. Housing Count")
# Loan
ggplot(data = bank, aes(x = loan , fill = y)) +
geom_bar(stat = 'count', position = 'dodge') +
xlab("Loan")+ylab("Response") + ggtitle("Subscriptions vs. Loans")
# Marital Status
ggplot(data = bank, aes(x = marital, fill = y)) +
geom_bar(stat = 'count', position = 'dodge') +
xlab("Marital")+ylab("Response") + ggtitle("Subscriptions vs. Marital Status")
# Default
ggplot(data = bank, aes(x = default , fill = y)) +
geom_bar(stat = 'count', position = 'dodge') +
xlab("Default")+ylab("Response") + ggtitle("Subscriptions vs. Default")
# Poutcome
ggplot(data = bank, aes(x = poutcome , fill = y)) +
geom_bar(stat = 'count', position = 'dodge') +
xlab("Poutcome")+ylab("Response") + ggtitle("Subscriptions vs. Previous Outcome")
# Previous
ggplot(data = bank, aes(x = previous, fill = y)) +
geom_histogram() +
labs(title = "Distribution of Previous Campaign",
x = "Previous Campaign", y = "Count")
library(dplyr)
# group jobs by percent
g1<-bank %>%
group_by(job,y) %>%
summarise(cnt=n()) %>%
mutate(perc=round(cnt/sum(cnt),4))%>%
arrange(desc(perc))
## `summarise()` has grouped output by 'job'. You can override using the `.groups`
## argument.
# Both Yes & No
# ggplot(g1,aes(x=reorder(job,-perc),y=perc,colour=y))+
# geom_bar(aes(fill=y),show.legend=T,stat="identity") + ylab("Proportion of Subscriptions") + xlab("Job Type") + ggtitle("Propotion Subscriptions vs. Job Type")
ggplot(g1[13:24,],aes(x=reorder(job,-perc),y=perc,colour=job))+
geom_bar(aes(fill=job),show.legend=T,stat="identity") + ylab("Proportion of Subscriptions") + xlab("Job Type") + ggtitle("Propotion Subscriptions vs. Job Type")
# group poutcome by percent
g2<-bank %>%
group_by(poutcome,y) %>%
summarise(cnt=n()) %>%
mutate(perc=round(cnt/sum(cnt),4))%>%
arrange(desc(perc))
## `summarise()` has grouped output by 'poutcome'. You can override using the
## `.groups` argument.
# ggplot(g2,aes(x=reorder(poutcome,-perc),y=perc,colour=y))+
# geom_bar(aes(fill=y),show.legend=T,stat="identity") + ylab("Proportion of Subscriptions") + xlab("Previous Outcome") + ggtitle(" Proportion of Subscriptions vs. Previous Outcome")
ggplot(g2[c(4, 6, 7, 8),],aes(x=reorder(poutcome,-perc),y=perc,colour=poutcome))+
geom_bar(aes(fill=poutcome),show.legend=T,stat="identity") + ylab("Proportion of Subscriptions") + xlab("Previous Outcome") + ggtitle(" Proportion of Subscriptions vs. Previous Outcome")
# group default by percent
g3<-bank %>%
group_by(default,y) %>%
summarise(cnt=n()) %>%
mutate(perc=round(cnt/sum(cnt),4))%>%
arrange(desc(perc))
## `summarise()` has grouped output by 'default'. You can override using the
## `.groups` argument.
ggplot(g3,aes(x=reorder(default,-perc),y=perc,colour=y))+
geom_bar(aes(fill=y),show.legend=T,stat="identity") + ylab("Proportion of Subscriptions") + xlab("Default") + ggtitle(" Proportion of Subscriptions vs. Default")
# group month by proportion
g4<-bank %>%
group_by(month,y) %>%
summarise(cnt=n()) %>%
mutate(perc=round(cnt/sum(cnt),4))%>%
arrange(desc(perc))
## `summarise()` has grouped output by 'month'. You can override using the
## `.groups` argument.
# ggplot(g4,aes(x=reorder(month,-perc),y=perc,colour=y))+
# geom_bar(aes(fill=y),show.legend=T,stat="identity") + ylab("Proportion of Subscriptions") + xlab("Month") + ggtitle(" Proportion of Subscriptions vs. Month")
ggplot(g4[c(12,14:24),],aes(x=reorder(month,-perc),y=perc,colour=month))+
geom_bar(aes(fill=month),show.legend=T,stat="identity") + ylab("Proportion of Subscriptions") + xlab("Month") + ggtitle(" Proportion of Subscriptions vs. Month")
# group education by proportion
g5 <-bank %>%
group_by(education,y) %>%
summarise(cnt=n()) %>%
mutate(perc=round(cnt/sum(cnt),4))%>%
arrange(desc(perc))
## `summarise()` has grouped output by 'education'. You can override using the
## `.groups` argument.
g5
## # A tibble: 8 × 4
## # Groups: education [4]
## education y cnt perc
## <fct> <fct> <int> <dbl>
## 1 primary no 6260 0.914
## 2 secondary no 20752 0.894
## 3 unknown no 1605 0.864
## 4 tertiary no 11305 0.850
## 5 tertiary yes 1996 0.150
## 6 unknown yes 252 0.136
## 7 secondary yes 2450 0.106
## 8 primary yes 591 0.0863
ggplot(g5[c(5:8),],aes(x=reorder(education,-perc),y=perc,colour=education))+
geom_bar(aes(fill=education),show.legend=T,stat="identity") + ylab("Proportion of Subscriptions") + xlab("Month") + ggtitle(" Proportion of Subscriptions vs. Month")
# group marital status by proportion
g6 <-bank %>%
group_by(marital,y) %>%
summarise(cnt=n()) %>%
mutate(perc=round(cnt/sum(cnt),4))%>%
arrange(desc(perc))
## `summarise()` has grouped output by 'marital'. You can override using the
## `.groups` argument.
g6
## # A tibble: 6 × 4
## # Groups: marital [3]
## marital y cnt perc
## <fct> <fct> <int> <dbl>
## 1 married no 24459 0.899
## 2 divorced no 4585 0.880
## 3 single no 10878 0.850
## 4 single yes 1912 0.150
## 5 divorced yes 622 0.120
## 6 married yes 2755 0.101
ggplot(g6[c(4:6),],aes(x=reorder(marital,-perc),y=perc,colour=marital))+
geom_bar(aes(fill=marital),show.legend=T,stat="identity") + ylab("Proportion of Subscriptions") + xlab("Month") + ggtitle(" Proportion of Subscriptions vs. Marital")
After creating a dummy column to make our y column numeric, we can see that there is hardly any correlation between our response variable and the other variables. The strongest relationship is y_num and duration at 0.395.
# make new numeric column for "y" column
bank$y_num = num(ifelse(bank$y == "yes",1,0))
## Correlation map
num_cols = unlist(lapply(bank, is.numeric))
data_num = bank[ , num_cols]
corr_mat = round(cor(data_num),2)
# reduce the size of correlation matrix
melted_corr_mat = melt(corr_mat)
# head(melted_corr_mat)
# plotting the correlation heatmap
ggplot(data = melted_corr_mat, aes(x=Var1, y=Var2,
fill=value)) +
geom_tile() +
geom_text(aes(Var2, Var1, label = value),
color = "white", size = 4) +
ggtitle("Heatmap of Correalation For Numeric Variables")
# ggpairs
ggpairs(data_num)
# Age (check)
ggplot(bank,aes(x=age,y=y_num))+geom_point()+
geom_smooth(method="loess",size=1,span=.75, se = FALSE) + ggtitle("Age vs. Subscription Loess Plot")
## `geom_smooth()` using formula 'y ~ x'
# Balance
ggplot(bank,aes(x=balance,y=y_num))+geom_point()+
geom_smooth(method="loess",size=1,span=0.1, se = FALSE) + ggtitle("Balance vs. Subscription Loess Plot")
## `geom_smooth()` using formula 'y ~ x'
# Duration (maybe add poly to it)
ggplot(bank,aes(x=duration,y=y_num))+geom_point()+
geom_smooth(method="loess",size=1,span=.75, se = FALSE) + ggtitle("Duration vs. Subscription Loess Plot")
## `geom_smooth()` using formula 'y ~ x'
# Pdays (check)
ggplot(bank,aes(x=pdays,y=y_num))+geom_point()+
geom_smooth(method="loess",size=1,span=1, se = FALSE) + ggtitle("Pdays vs. Subscription Loess Plot")
## `geom_smooth()` using formula 'y ~ x'
# campaign
ggplot(bank,aes(x=campaign,y=y_num))+geom_point()+
geom_smooth(method="loess",size=1,span=1, se = FALSE) + ggtitle("Campain vs. Subscription Loess Plot")
## `geom_smooth()` using formula 'y ~ x'
# day
ggplot(bank,aes(x=day,y=y_num))+geom_point()+
geom_smooth(method="loess",size=1,span=1, se = FALSE) + ggtitle("Day vs. Subscription Loess Plot")
## `geom_smooth()` using formula 'y ~ x'
AUROC: 0.9085 LogLoss: 0.2409315 AIC: 15206 Accuracy: 0.814 Sensitivity: 0.8064 Specificity: 0.8714
Note that because we have such unbalanced data, our accuracy is always expected to be high. Only 10% of the results were “yes”, so just picking “no” 100% of the time would result in an accuracy of 90%.
However, once we try and increase the specificity, we realize that the ideal threshold for this base model is 0.096, which reduces our accuracy down to 81%. The decrease in accuracy results in a much better improvement and equality in sensitivity and specificity.
bank = bank[,-c(18)] # remove y_num from dataset
set.seed(124)
trainIndex = createDataPartition(bank$y, p= .7, list = F)
training = bank[trainIndex,]
test = bank[-trainIndex,]
model1 = glm(factor(y)~., data = training, family = "binomial")
summary(model1)
##
## Call:
## glm(formula = factor(y) ~ ., family = "binomial", data = training)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -5.7184 -0.3780 -0.2526 -0.1485 3.4431
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.540e+00 2.202e-01 -11.537 < 2e-16 ***
## age 1.136e-03 2.645e-03 0.429 0.667657
## jobblue-collar -3.342e-01 8.792e-02 -3.801 0.000144 ***
## jobentrepreneur -3.327e-01 1.507e-01 -2.207 0.027298 *
## jobhousemaid -5.736e-01 1.674e-01 -3.427 0.000610 ***
## jobmanagement -1.343e-01 8.788e-02 -1.528 0.126495
## jobretired 2.826e-01 1.154e-01 2.449 0.014308 *
## jobself-employed -1.625e-01 1.308e-01 -1.242 0.214069
## jobservices -2.555e-01 1.024e-01 -2.496 0.012575 *
## jobstudent 4.549e-01 1.280e-01 3.553 0.000381 ***
## jobtechnician -1.335e-01 8.258e-02 -1.616 0.106106
## jobunemployed -1.438e-01 1.323e-01 -1.087 0.276846
## jobunknown -1.199e-01 2.639e-01 -0.454 0.649696
## maritalmarried -1.740e-01 7.040e-02 -2.472 0.013454 *
## maritalsingle 1.203e-01 8.053e-02 1.494 0.135171
## educationsecondary 1.879e-01 7.791e-02 2.411 0.015896 *
## educationtertiary 3.713e-01 9.000e-02 4.125 3.70e-05 ***
## educationunknown 1.147e-01 1.259e-01 0.911 0.362262
## defaultyes 1.401e-01 1.800e-01 0.778 0.436585
## balance 1.610e-05 5.839e-06 2.758 0.005809 **
## housingyes -7.378e-01 5.261e-02 -14.024 < 2e-16 ***
## loanyes -4.688e-01 7.264e-02 -6.454 1.09e-10 ***
## contacttelephone -1.198e-01 8.894e-02 -1.346 0.178159
## contactunknown -1.566e+00 8.780e-02 -17.833 < 2e-16 ***
## day 7.758e-03 2.984e-03 2.600 0.009323 **
## monthaug -7.622e-01 9.386e-02 -8.120 4.65e-16 ***
## monthdec 6.109e-01 2.070e-01 2.951 0.003164 **
## monthfeb -2.235e-01 1.065e-01 -2.100 0.035764 *
## monthjan -1.221e+00 1.423e-01 -8.578 < 2e-16 ***
## monthjul -8.678e-01 9.274e-02 -9.357 < 2e-16 ***
## monthjun 3.016e-01 1.127e-01 2.676 0.007442 **
## monthmar 1.437e+00 1.467e-01 9.790 < 2e-16 ***
## monthmay -4.477e-01 8.626e-02 -5.190 2.10e-07 ***
## monthnov -8.698e-01 1.003e-01 -8.676 < 2e-16 ***
## monthoct 8.064e-01 1.285e-01 6.274 3.51e-10 ***
## monthsep 6.953e-01 1.419e-01 4.902 9.50e-07 ***
## duration 4.156e-03 7.794e-05 53.314 < 2e-16 ***
## campaign -9.286e-02 1.213e-02 -7.658 1.89e-14 ***
## pdays 2.810e-04 3.650e-04 0.770 0.441484
## previous 1.187e-02 7.506e-03 1.581 0.113860
## poutcomeother 2.454e-01 1.057e-01 2.321 0.020287 *
## poutcomesuccess 2.315e+00 9.842e-02 23.520 < 2e-16 ***
## poutcomeunknown -4.092e-02 1.119e-01 -0.366 0.714603
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 22845 on 31648 degrees of freedom
## Residual deviance: 15120 on 31606 degrees of freedom
## AIC: 15206
##
## Number of Fisher Scoring iterations: 6
vif(model1)
## GVIF Df GVIF^(1/(2*Df))
## age 2.216913 1 1.488930
## job 4.243808 11 1.067909
## marital 1.461161 2 1.099448
## education 2.225993 3 1.142670
## default 1.020532 1 1.010214
## balance 1.043881 1 1.021705
## housing 1.433865 1 1.197441
## loan 1.067951 1 1.033417
## contact 1.886652 2 1.171987
## day 1.344743 1 1.159631
## month 3.713619 11 1.061451
## duration 1.122924 1 1.059681
## campaign 1.105656 1 1.051502
## pdays 3.756409 1 1.938146
## previous 1.270182 1 1.127024
## poutcome 4.313674 3 1.275874
fitControl = trainControl(method = "repeatedcv", number = 5, repeats = 1, classProbs = TRUE, summaryFunction = mnLogLoss)
logit_base = train(factor(y) ~ ., data = training, method = "glm", trControl = fitControl, metric = "logLoss")
summary(logit_base$finalModel)
##
## Call:
## NULL
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -5.7184 -0.3780 -0.2526 -0.1485 3.4431
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.540e+00 2.202e-01 -11.537 < 2e-16 ***
## age 1.136e-03 2.645e-03 0.429 0.667657
## `jobblue-collar` -3.342e-01 8.792e-02 -3.801 0.000144 ***
## jobentrepreneur -3.327e-01 1.507e-01 -2.207 0.027298 *
## jobhousemaid -5.736e-01 1.674e-01 -3.427 0.000610 ***
## jobmanagement -1.343e-01 8.788e-02 -1.528 0.126495
## jobretired 2.826e-01 1.154e-01 2.449 0.014308 *
## `jobself-employed` -1.625e-01 1.308e-01 -1.242 0.214069
## jobservices -2.555e-01 1.024e-01 -2.496 0.012575 *
## jobstudent 4.549e-01 1.280e-01 3.553 0.000381 ***
## jobtechnician -1.335e-01 8.258e-02 -1.616 0.106106
## jobunemployed -1.438e-01 1.323e-01 -1.087 0.276846
## jobunknown -1.199e-01 2.639e-01 -0.454 0.649696
## maritalmarried -1.740e-01 7.040e-02 -2.472 0.013454 *
## maritalsingle 1.203e-01 8.053e-02 1.494 0.135171
## educationsecondary 1.879e-01 7.791e-02 2.411 0.015896 *
## educationtertiary 3.713e-01 9.000e-02 4.125 3.70e-05 ***
## educationunknown 1.147e-01 1.259e-01 0.911 0.362262
## defaultyes 1.401e-01 1.800e-01 0.778 0.436585
## balance 1.610e-05 5.839e-06 2.758 0.005809 **
## housingyes -7.378e-01 5.261e-02 -14.024 < 2e-16 ***
## loanyes -4.688e-01 7.264e-02 -6.454 1.09e-10 ***
## contacttelephone -1.198e-01 8.894e-02 -1.346 0.178159
## contactunknown -1.566e+00 8.780e-02 -17.833 < 2e-16 ***
## day 7.758e-03 2.984e-03 2.600 0.009323 **
## monthaug -7.622e-01 9.386e-02 -8.120 4.65e-16 ***
## monthdec 6.109e-01 2.070e-01 2.951 0.003164 **
## monthfeb -2.235e-01 1.065e-01 -2.100 0.035764 *
## monthjan -1.221e+00 1.423e-01 -8.578 < 2e-16 ***
## monthjul -8.678e-01 9.274e-02 -9.357 < 2e-16 ***
## monthjun 3.016e-01 1.127e-01 2.676 0.007442 **
## monthmar 1.437e+00 1.467e-01 9.790 < 2e-16 ***
## monthmay -4.477e-01 8.626e-02 -5.190 2.10e-07 ***
## monthnov -8.698e-01 1.003e-01 -8.676 < 2e-16 ***
## monthoct 8.064e-01 1.285e-01 6.274 3.51e-10 ***
## monthsep 6.953e-01 1.419e-01 4.902 9.50e-07 ***
## duration 4.156e-03 7.794e-05 53.314 < 2e-16 ***
## campaign -9.286e-02 1.213e-02 -7.658 1.89e-14 ***
## pdays 2.810e-04 3.650e-04 0.770 0.441484
## previous 1.187e-02 7.506e-03 1.581 0.113860
## poutcomeother 2.454e-01 1.057e-01 2.321 0.020287 *
## poutcomesuccess 2.315e+00 9.842e-02 23.520 < 2e-16 ***
## poutcomeunknown -4.092e-02 1.119e-01 -0.366 0.714603
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 22845 on 31648 degrees of freedom
## Residual deviance: 15120 on 31606 degrees of freedom
## AIC: 15206
##
## Number of Fisher Scoring iterations: 6
length(predictors(logit_base))
## [1] 42
# Generate an ROC curve to help us determine the best threshold
logit_base_predictions = predict(logit_base, test, type = "prob")$yes
logit_base_roc = roc(response = test$y, predictor = logit_base_predictions, levels = c("no", "yes"))
## Setting direction: controls < cases
auc(logit_base_roc)
## Area under the curve: 0.9085
plot(logit_base_roc, print.thres = "best", col = "black")
# Predict
threshold = 0.096
logit_base_predictions_categorical = factor(ifelse(predict(logit_base, test, type = "prob")$yes >= threshold, "yes", "no"), levels = c("no", "yes"))
confusionMatrix(data = logit_base_predictions_categorical, reference = factor(test$y, levels = c("no", "yes")))
## Confusion Matrix and Statistics
##
## Reference
## Prediction no yes
## no 9658 204
## yes 2318 1382
##
## Accuracy : 0.814
## 95% CI : (0.8074, 0.8206)
## No Information Rate : 0.8831
## P-Value [Acc > NIR] : 1
##
## Kappa : 0.4295
##
## Mcnemar's Test P-Value : <2e-16
##
## Sensitivity : 0.8064
## Specificity : 0.8714
## Pos Pred Value : 0.9793
## Neg Pred Value : 0.3735
## Prevalence : 0.8831
## Detection Rate : 0.7121
## Detection Prevalence : 0.7272
## Balanced Accuracy : 0.8389
##
## 'Positive' Class : no
##
We remove the insignificant variables from
summary(model1)
.
AUROC: 0.9087 AIC: 15203 Accuracy: 0.8082 Sensitivity: 0.7987 Specificity: 0.8802
However, once we try and increase the specificity, we realize that the ideal threshold for this base model is 0.093, which reduces our accuracy down to 80.82% which is lower than our base model. We see that our sensitivity suffered heavily but our specificity increased slightly.
training1 = training[,-c(1,5,14,15)]
adj.model1 = glm(factor(y)~., data = training1, family = "binomial")
summary(adj.model1)
##
## Call:
## glm(formula = factor(y) ~ ., family = "binomial", data = training1)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -5.7147 -0.3782 -0.2526 -0.1488 3.4359
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.384e+00 1.548e-01 -15.402 < 2e-16 ***
## jobblue-collar -3.350e-01 8.784e-02 -3.814 0.000137 ***
## jobentrepreneur -3.277e-01 1.504e-01 -2.178 0.029376 *
## jobhousemaid -5.708e-01 1.668e-01 -3.422 0.000622 ***
## jobmanagement -1.302e-01 8.777e-02 -1.483 0.138063
## jobretired 3.013e-01 1.037e-01 2.905 0.003669 **
## jobself-employed -1.618e-01 1.308e-01 -1.237 0.216015
## jobservices -2.574e-01 1.023e-01 -2.517 0.011850 *
## jobstudent 4.419e-01 1.255e-01 3.521 0.000430 ***
## jobtechnician -1.328e-01 8.255e-02 -1.609 0.107566
## jobunemployed -1.413e-01 1.322e-01 -1.069 0.284997
## jobunknown -1.151e-01 2.637e-01 -0.437 0.662452
## maritalmarried -1.780e-01 7.008e-02 -2.539 0.011103 *
## maritalsingle 1.076e-01 7.548e-02 1.426 0.153845
## educationsecondary 1.838e-01 7.758e-02 2.369 0.017832 *
## educationtertiary 3.639e-01 8.938e-02 4.072 4.66e-05 ***
## educationunknown 1.135e-01 1.259e-01 0.902 0.367199
## balance 1.606e-05 5.818e-06 2.761 0.005768 **
## housingyes -7.357e-01 5.213e-02 -14.113 < 2e-16 ***
## loanyes -4.653e-01 7.243e-02 -6.425 1.32e-10 ***
## contacttelephone -1.132e-01 8.784e-02 -1.289 0.197366
## contactunknown -1.565e+00 8.770e-02 -17.847 < 2e-16 ***
## day 7.628e-03 2.982e-03 2.558 0.010528 *
## monthaug -7.601e-01 9.374e-02 -8.109 5.12e-16 ***
## monthdec 6.124e-01 2.067e-01 2.962 0.003052 **
## monthfeb -2.227e-01 1.063e-01 -2.096 0.036071 *
## monthjan -1.218e+00 1.421e-01 -8.571 < 2e-16 ***
## monthjul -8.645e-01 9.265e-02 -9.332 < 2e-16 ***
## monthjun 3.015e-01 1.126e-01 2.677 0.007423 **
## monthmar 1.436e+00 1.466e-01 9.795 < 2e-16 ***
## monthmay -4.449e-01 8.621e-02 -5.160 2.47e-07 ***
## monthnov -8.733e-01 9.966e-02 -8.763 < 2e-16 ***
## monthoct 8.083e-01 1.284e-01 6.296 3.06e-10 ***
## monthsep 6.984e-01 1.418e-01 4.924 8.49e-07 ***
## duration 4.155e-03 7.794e-05 53.311 < 2e-16 ***
## campaign -9.218e-02 1.210e-02 -7.616 2.63e-14 ***
## poutcomeother 2.548e-01 1.051e-01 2.424 0.015362 *
## poutcomesuccess 2.297e+00 9.504e-02 24.167 < 2e-16 ***
## poutcomeunknown -1.413e-01 6.776e-02 -2.085 0.037110 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 22845 on 31648 degrees of freedom
## Residual deviance: 15125 on 31610 degrees of freedom
## AIC: 15203
##
## Number of Fisher Scoring iterations: 6
vif(adj.model1)
## GVIF Df GVIF^(1/(2*Df))
## job 2.949218 11 1.050389
## marital 1.187971 2 1.044002
## education 2.180470 3 1.138741
## balance 1.034920 1 1.017310
## housing 1.408584 1 1.186838
## loan 1.061581 1 1.030330
## contact 1.838442 2 1.164428
## day 1.344080 1 1.159345
## month 3.594816 11 1.059883
## duration 1.123002 1 1.059718
## campaign 1.104763 1 1.051077
## poutcome 1.226809 3 1.034656
fitControl = trainControl(method = "repeatedcv", number = 5, repeats = 1, classProbs = TRUE, summaryFunction = mnLogLoss)
fit.adj = train(factor(y) ~ ., data = training1, method = "glm", trControl = fitControl, metric = "logLoss")
summary(fit.adj$finalModel)
##
## Call:
## NULL
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -5.7147 -0.3782 -0.2526 -0.1488 3.4359
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.384e+00 1.548e-01 -15.402 < 2e-16 ***
## `jobblue-collar` -3.350e-01 8.784e-02 -3.814 0.000137 ***
## jobentrepreneur -3.277e-01 1.504e-01 -2.178 0.029376 *
## jobhousemaid -5.708e-01 1.668e-01 -3.422 0.000622 ***
## jobmanagement -1.302e-01 8.777e-02 -1.483 0.138063
## jobretired 3.013e-01 1.037e-01 2.905 0.003669 **
## `jobself-employed` -1.618e-01 1.308e-01 -1.237 0.216015
## jobservices -2.574e-01 1.023e-01 -2.517 0.011850 *
## jobstudent 4.419e-01 1.255e-01 3.521 0.000430 ***
## jobtechnician -1.328e-01 8.255e-02 -1.609 0.107566
## jobunemployed -1.413e-01 1.322e-01 -1.069 0.284997
## jobunknown -1.151e-01 2.637e-01 -0.437 0.662452
## maritalmarried -1.780e-01 7.008e-02 -2.539 0.011103 *
## maritalsingle 1.076e-01 7.548e-02 1.426 0.153845
## educationsecondary 1.838e-01 7.758e-02 2.369 0.017832 *
## educationtertiary 3.639e-01 8.938e-02 4.072 4.66e-05 ***
## educationunknown 1.135e-01 1.259e-01 0.902 0.367199
## balance 1.606e-05 5.818e-06 2.761 0.005768 **
## housingyes -7.357e-01 5.213e-02 -14.113 < 2e-16 ***
## loanyes -4.653e-01 7.243e-02 -6.425 1.32e-10 ***
## contacttelephone -1.132e-01 8.784e-02 -1.289 0.197366
## contactunknown -1.565e+00 8.770e-02 -17.847 < 2e-16 ***
## day 7.628e-03 2.982e-03 2.558 0.010528 *
## monthaug -7.601e-01 9.374e-02 -8.109 5.12e-16 ***
## monthdec 6.124e-01 2.067e-01 2.962 0.003052 **
## monthfeb -2.227e-01 1.063e-01 -2.096 0.036071 *
## monthjan -1.218e+00 1.421e-01 -8.571 < 2e-16 ***
## monthjul -8.645e-01 9.265e-02 -9.332 < 2e-16 ***
## monthjun 3.015e-01 1.126e-01 2.677 0.007423 **
## monthmar 1.436e+00 1.466e-01 9.795 < 2e-16 ***
## monthmay -4.449e-01 8.621e-02 -5.160 2.47e-07 ***
## monthnov -8.733e-01 9.966e-02 -8.763 < 2e-16 ***
## monthoct 8.083e-01 1.284e-01 6.296 3.06e-10 ***
## monthsep 6.984e-01 1.418e-01 4.924 8.49e-07 ***
## duration 4.155e-03 7.794e-05 53.311 < 2e-16 ***
## campaign -9.218e-02 1.210e-02 -7.616 2.63e-14 ***
## poutcomeother 2.548e-01 1.051e-01 2.424 0.015362 *
## poutcomesuccess 2.297e+00 9.504e-02 24.167 < 2e-16 ***
## poutcomeunknown -1.413e-01 6.776e-02 -2.085 0.037110 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 22845 on 31648 degrees of freedom
## Residual deviance: 15125 on 31610 degrees of freedom
## AIC: 15203
##
## Number of Fisher Scoring iterations: 6
length(predictors(fit.adj))
## [1] 38
# Generate an ROC curve to help us determine the best threshold
fit.adj_predictions = predict(fit.adj, test, type = "prob")$yes
fit.adj_roc = roc(response = test$y, predictor = fit.adj_predictions, levels = c("no", "yes"))
## Setting direction: controls < cases
auc(fit.adj_roc)
## Area under the curve: 0.9087
plot(fit.adj_roc, print.thres = "best", col = "black")
# Predict
threshold = 0.093
fit.adj_predictions_categorical = factor(ifelse(predict(fit.adj, test, type = "prob")$yes >= threshold, "yes", "no"), levels = c("no", "yes"))
confusionMatrix(data = fit.adj_predictions_categorical, reference = factor(test$y, levels = c("no", "yes")))
## Confusion Matrix and Statistics
##
## Reference
## Prediction no yes
## no 9565 190
## yes 2411 1396
##
## Accuracy : 0.8082
## 95% CI : (0.8015, 0.8148)
## No Information Rate : 0.8831
## P-Value [Acc > NIR] : 1
##
## Kappa : 0.4223
##
## Mcnemar's Test P-Value : <2e-16
##
## Sensitivity : 0.7987
## Specificity : 0.8802
## Pos Pred Value : 0.9805
## Neg Pred Value : 0.3667
## Prevalence : 0.8831
## Detection Rate : 0.7053
## Detection Prevalence : 0.7193
## Balanced Accuracy : 0.8394
##
## 'Positive' Class : no
##
Used in objective 2.
AUROC: 0.9102 AIC: 15201.86 Accuracy: 0.8289 Sensitivity: 0.8258 Specificity: 0.8525
Note that because we have such unbalanced data, our accuracy is always expected to be high. Only 10% of the results were “yes”, so just picking “no” 100% of the time would result in an accuracy of 90%.
However, once we try and increase the specificity, we realize that the ideal threshold for this base model is 0.107, which our accuracy is 0.8289.
fitControl=trainControl(method="repeatedcv",number=5,repeats=1)
set.seed(124)
lambda=seq(0,.05,.001)
fit.glmnet = train(factor(y)~.,
data = training,
method = "glmnet",
trControl = fitControl,
tuneGrid = expand.grid(data.frame(alpha = 1, lambda = lambda)))
fit.glmnet
## glmnet
##
## 31649 samples
## 16 predictor
## 2 classes: 'no', 'yes'
##
## No pre-processing
## Resampling: Cross-Validated (5 fold, repeated 1 times)
## Summary of sample sizes: 25320, 25318, 25319, 25319, 25320
## Resampling results across tuning parameters:
##
## lambda Accuracy Kappa
## 0.000 0.9019875 0.4022474
## 0.001 0.9022086 0.3992743
## 0.002 0.9023034 0.3957782
## 0.003 0.9028406 0.3946518
## 0.004 0.9028406 0.3889748
## 0.005 0.9020822 0.3792938
## 0.006 0.9013871 0.3702335
## 0.007 0.9012291 0.3648284
## 0.008 0.9011028 0.3600185
## 0.009 0.9009448 0.3560971
## 0.010 0.9009132 0.3525515
## 0.011 0.9005972 0.3467591
## 0.012 0.9001548 0.3402719
## 0.013 0.9000916 0.3364585
## 0.014 0.8999652 0.3328241
## 0.015 0.8997756 0.3274568
## 0.016 0.8996176 0.3229941
## 0.017 0.8992385 0.3177516
## 0.018 0.8987013 0.3099459
## 0.019 0.8983538 0.3044727
## 0.020 0.8979115 0.2970359
## 0.021 0.8975007 0.2902943
## 0.022 0.8969951 0.2831910
## 0.023 0.8964896 0.2760122
## 0.024 0.8963000 0.2712149
## 0.025 0.8962052 0.2674412
## 0.026 0.8955101 0.2579662
## 0.027 0.8953521 0.2528487
## 0.028 0.8946886 0.2426713
## 0.029 0.8942146 0.2345472
## 0.030 0.8938670 0.2272993
## 0.031 0.8934246 0.2185806
## 0.032 0.8929823 0.2117265
## 0.033 0.8923188 0.2013404
## 0.034 0.8917817 0.1928894
## 0.035 0.8913709 0.1855636
## 0.036 0.8909286 0.1783645
## 0.037 0.8905178 0.1715052
## 0.038 0.8903914 0.1662652
## 0.039 0.8899175 0.1588041
## 0.040 0.8899175 0.1547399
## 0.041 0.8895699 0.1487580
## 0.042 0.8893488 0.1443191
## 0.043 0.8890644 0.1387166
## 0.044 0.8887168 0.1332446
## 0.045 0.8885273 0.1298093
## 0.046 0.8882429 0.1247858
## 0.047 0.8883061 0.1226102
## 0.048 0.8879585 0.1163336
## 0.049 0.8875162 0.1094384
## 0.050 0.8874214 0.1074797
##
## Tuning parameter 'alpha' was held constant at a value of 1
## Accuracy was used to select the optimal model using the largest value.
## The final values used for the model were alpha = 1 and lambda = 0.003.
plot(fit.glmnet)
opt.pen= fit.glmnet$finalModel$lambdaOpt
coef(fit.glmnet$finalModel, opt.pen)
## 43 x 1 sparse Matrix of class "dgCMatrix"
## s1
## (Intercept) -2.552925e+00
## age .
## jobblue-collar -1.579392e-01
## jobentrepreneur .
## jobhousemaid -1.951650e-01
## jobmanagement .
## jobretired 2.994994e-01
## jobself-employed .
## jobservices .
## jobstudent 5.222552e-01
## jobtechnician .
## jobunemployed .
## jobunknown .
## maritalmarried -1.364113e-01
## maritalsingle 1.009321e-01
## educationsecondary .
## educationtertiary 1.481663e-01
## educationunknown .
## defaultyes .
## balance 1.019485e-05
## housingyes -6.457751e-01
## loanyes -3.557147e-01
## contacttelephone .
## contactunknown -1.226280e+00
## day .
## monthaug -3.186051e-01
## monthdec 7.343465e-01
## monthfeb .
## monthjan -5.355335e-01
## monthjul -4.300466e-01
## monthjun 2.636016e-01
## monthmar 1.611861e+00
## monthmay -1.457283e-01
## monthnov -3.724500e-01
## monthoct 1.050138e+00
## monthsep 8.888944e-01
## duration 3.865347e-03
## campaign -6.197404e-02
## pdays .
## previous 5.945810e-03
## poutcomeother 1.170247e-01
## poutcomesuccess 2.196243e+00
## poutcomeunknown -1.720155e-01
training2 = training[,-c(1,5,14)]
pen.model1 = glm(factor(y)~., data = training2, family = "binomial")
summary(pen.model1)
##
## Call:
## glm(formula = factor(y) ~ ., family = "binomial", data = training2)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -5.7145 -0.3781 -0.2524 -0.1488 3.4404
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.417e+00 1.563e-01 -15.466 < 2e-16 ***
## jobblue-collar -3.333e-01 8.785e-02 -3.794 0.000148 ***
## jobentrepreneur -3.258e-01 1.504e-01 -2.166 0.030321 *
## jobhousemaid -5.688e-01 1.668e-01 -3.411 0.000648 ***
## jobmanagement -1.316e-01 8.779e-02 -1.499 0.133920
## jobretired 3.032e-01 1.037e-01 2.923 0.003462 **
## jobself-employed -1.617e-01 1.308e-01 -1.237 0.216202
## jobservices -2.555e-01 1.023e-01 -2.497 0.012513 *
## jobstudent 4.415e-01 1.255e-01 3.517 0.000437 ***
## jobtechnician -1.328e-01 8.256e-02 -1.609 0.107719
## jobunemployed -1.406e-01 1.322e-01 -1.063 0.287570
## jobunknown -1.155e-01 2.638e-01 -0.438 0.661557
## maritalmarried -1.790e-01 7.008e-02 -2.554 0.010644 *
## maritalsingle 1.074e-01 7.547e-02 1.423 0.154672
## educationsecondary 1.850e-01 7.758e-02 2.385 0.017099 *
## educationtertiary 3.649e-01 8.938e-02 4.083 4.45e-05 ***
## educationunknown 1.153e-01 1.259e-01 0.916 0.359616
## balance 1.606e-05 5.817e-06 2.761 0.005757 **
## housingyes -7.372e-01 5.215e-02 -14.136 < 2e-16 ***
## loanyes -4.654e-01 7.242e-02 -6.427 1.30e-10 ***
## contacttelephone -1.148e-01 8.786e-02 -1.306 0.191489
## contactunknown -1.566e+00 8.769e-02 -17.855 < 2e-16 ***
## day 7.733e-03 2.982e-03 2.593 0.009517 **
## monthaug -7.619e-01 9.374e-02 -8.128 4.38e-16 ***
## monthdec 6.101e-01 2.068e-01 2.950 0.003180 **
## monthfeb -2.265e-01 1.063e-01 -2.130 0.033151 *
## monthjan -1.223e+00 1.421e-01 -8.602 < 2e-16 ***
## monthjul -8.670e-01 9.265e-02 -9.357 < 2e-16 ***
## monthjun 2.997e-01 1.126e-01 2.661 0.007787 **
## monthmar 1.434e+00 1.466e-01 9.779 < 2e-16 ***
## monthmay -4.458e-01 8.621e-02 -5.171 2.33e-07 ***
## monthnov -8.755e-01 9.967e-02 -8.784 < 2e-16 ***
## monthoct 8.048e-01 1.284e-01 6.268 3.65e-10 ***
## monthsep 6.960e-01 1.419e-01 4.906 9.29e-07 ***
## duration 4.155e-03 7.794e-05 53.315 < 2e-16 ***
## campaign -9.270e-02 1.212e-02 -7.649 2.03e-14 ***
## previous 1.170e-02 7.429e-03 1.575 0.115164
## poutcomeother 2.402e-01 1.056e-01 2.275 0.022891 *
## poutcomesuccess 2.295e+00 9.504e-02 24.147 < 2e-16 ***
## poutcomeunknown -1.072e-01 7.121e-02 -1.505 0.132346
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 22845 on 31648 degrees of freedom
## Residual deviance: 15122 on 31609 degrees of freedom
## AIC: 15202
##
## Number of Fisher Scoring iterations: 6
vif(pen.model1)
## GVIF Df GVIF^(1/(2*Df))
## job 2.951293 11 1.050423
## marital 1.188100 2 1.044031
## education 2.180369 3 1.138732
## balance 1.034862 1 1.017282
## housing 1.409205 1 1.187100
## loan 1.061566 1 1.030323
## contact 1.838422 2 1.164424
## day 1.344355 1 1.159463
## month 3.595446 11 1.059892
## duration 1.123020 1 1.059727
## campaign 1.105342 1 1.051352
## previous 1.264204 1 1.124368
## poutcome 1.497659 3 1.069635
# Generate an ROC curve to help us determine the best threshold
fit.glmnet_predictions = predict(fit.glmnet, test, type = "prob")$yes
fit.glmnet_roc = roc(response = test$y, predictor = fit.glmnet_predictions, levels = c("no", "yes"))
## Setting direction: controls < cases
auc(fit.glmnet_roc)
## Area under the curve: 0.9102
plot(fit.glmnet_roc, print.thres = "best", col = "black")
# Predict
threshold = 0.107
fit.glmnet_predictions_categorical = factor(ifelse(predict(fit.glmnet, test, type = "prob")$yes >= threshold, "yes", "no"), levels = c("no", "yes"))
confusionMatrix(data = fit.glmnet_predictions_categorical, reference = factor(test$y, levels = c("no", "yes")))
## Confusion Matrix and Statistics
##
## Reference
## Prediction no yes
## no 9890 234
## yes 2086 1352
##
## Accuracy : 0.8289
## 95% CI : (0.8225, 0.8352)
## No Information Rate : 0.8831
## P-Value [Acc > NIR] : 1
##
## Kappa : 0.4502
##
## Mcnemar's Test P-Value : <2e-16
##
## Sensitivity : 0.8258
## Specificity : 0.8525
## Pos Pred Value : 0.9769
## Neg Pred Value : 0.3933
## Prevalence : 0.8831
## Detection Rate : 0.7292
## Detection Prevalence : 0.7465
## Balanced Accuracy : 0.8391
##
## 'Positive' Class : no
##
AUROC: 0.9087 AIC: 15201.86 Accuracy: 0.8087 Sensitivity: 0.7991 Specificity: 0.8808
Note that because we have such unbalanced data, our accuracy is always expected to be high. Only 10% of the results were “yes”.
However, once we try and increase the specificity, we realize that the ideal threshold for this base model is 0.093, which our accuracy is 0.8087.
set.seed(124)
fit.step = glm(factor(y) ~., data = training, family = binomial) %>%
stepAIC(trace = FALSE)
summary(fit.step)
##
## Call:
## glm(formula = factor(y) ~ job + marital + education + balance +
## housing + loan + contact + day + month + duration + campaign +
## previous + poutcome, family = binomial, data = training)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -5.7145 -0.3781 -0.2524 -0.1488 3.4404
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.417e+00 1.563e-01 -15.466 < 2e-16 ***
## jobblue-collar -3.333e-01 8.785e-02 -3.794 0.000148 ***
## jobentrepreneur -3.258e-01 1.504e-01 -2.166 0.030321 *
## jobhousemaid -5.688e-01 1.668e-01 -3.411 0.000648 ***
## jobmanagement -1.316e-01 8.779e-02 -1.499 0.133920
## jobretired 3.032e-01 1.037e-01 2.923 0.003462 **
## jobself-employed -1.617e-01 1.308e-01 -1.237 0.216202
## jobservices -2.555e-01 1.023e-01 -2.497 0.012513 *
## jobstudent 4.415e-01 1.255e-01 3.517 0.000437 ***
## jobtechnician -1.328e-01 8.256e-02 -1.609 0.107719
## jobunemployed -1.406e-01 1.322e-01 -1.063 0.287570
## jobunknown -1.155e-01 2.638e-01 -0.438 0.661557
## maritalmarried -1.790e-01 7.008e-02 -2.554 0.010644 *
## maritalsingle 1.074e-01 7.547e-02 1.423 0.154672
## educationsecondary 1.850e-01 7.758e-02 2.385 0.017099 *
## educationtertiary 3.649e-01 8.938e-02 4.083 4.45e-05 ***
## educationunknown 1.153e-01 1.259e-01 0.916 0.359616
## balance 1.606e-05 5.817e-06 2.761 0.005757 **
## housingyes -7.372e-01 5.215e-02 -14.136 < 2e-16 ***
## loanyes -4.654e-01 7.242e-02 -6.427 1.30e-10 ***
## contacttelephone -1.148e-01 8.786e-02 -1.306 0.191489
## contactunknown -1.566e+00 8.769e-02 -17.855 < 2e-16 ***
## day 7.733e-03 2.982e-03 2.593 0.009517 **
## monthaug -7.619e-01 9.374e-02 -8.128 4.38e-16 ***
## monthdec 6.101e-01 2.068e-01 2.950 0.003180 **
## monthfeb -2.265e-01 1.063e-01 -2.130 0.033151 *
## monthjan -1.223e+00 1.421e-01 -8.602 < 2e-16 ***
## monthjul -8.670e-01 9.265e-02 -9.357 < 2e-16 ***
## monthjun 2.997e-01 1.126e-01 2.661 0.007787 **
## monthmar 1.434e+00 1.466e-01 9.779 < 2e-16 ***
## monthmay -4.458e-01 8.621e-02 -5.171 2.33e-07 ***
## monthnov -8.755e-01 9.967e-02 -8.784 < 2e-16 ***
## monthoct 8.048e-01 1.284e-01 6.268 3.65e-10 ***
## monthsep 6.960e-01 1.419e-01 4.906 9.29e-07 ***
## duration 4.155e-03 7.794e-05 53.315 < 2e-16 ***
## campaign -9.270e-02 1.212e-02 -7.649 2.03e-14 ***
## previous 1.170e-02 7.429e-03 1.575 0.115164
## poutcomeother 2.402e-01 1.056e-01 2.275 0.022891 *
## poutcomesuccess 2.295e+00 9.504e-02 24.147 < 2e-16 ***
## poutcomeunknown -1.072e-01 7.121e-02 -1.505 0.132346
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 22845 on 31648 degrees of freedom
## Residual deviance: 15122 on 31609 degrees of freedom
## AIC: 15202
##
## Number of Fisher Scoring iterations: 6
coef(fit.step)
## (Intercept) jobblue-collar jobentrepreneur jobhousemaid
## -2.416939e+00 -3.333024e-01 -3.257645e-01 -5.687815e-01
## jobmanagement jobretired jobself-employed jobservices
## -1.315824e-01 3.032136e-01 -1.617472e-01 -2.554693e-01
## jobstudent jobtechnician jobunemployed jobunknown
## 4.414831e-01 -1.327954e-01 -1.405869e-01 -1.154612e-01
## maritalmarried maritalsingle educationsecondary educationtertiary
## -1.789881e-01 1.074058e-01 1.849937e-01 3.649409e-01
## educationunknown balance housingyes loanyes
## 1.153179e-01 1.606222e-05 -7.371729e-01 -4.654309e-01
## contacttelephone contactunknown day monthaug
## -1.147624e-01 -1.565769e+00 7.733248e-03 -7.618837e-01
## monthdec monthfeb monthjan monthjul
## 6.100588e-01 -2.264698e-01 -1.222727e+00 -8.669716e-01
## monthjun monthmar monthmay monthnov
## 2.997300e-01 1.434038e+00 -4.457667e-01 -8.755030e-01
## monthoct monthsep duration campaign
## 8.048252e-01 6.960106e-01 4.155302e-03 -9.270440e-02
## previous poutcomeother poutcomesuccess poutcomeunknown
## 1.170318e-02 2.401987e-01 2.295025e+00 -1.071710e-01
vif(fit.step)
## GVIF Df GVIF^(1/(2*Df))
## job 2.951293 11 1.050423
## marital 1.188100 2 1.044031
## education 2.180369 3 1.138732
## balance 1.034862 1 1.017282
## housing 1.409205 1 1.187100
## loan 1.061566 1 1.030323
## contact 1.838422 2 1.164424
## day 1.344355 1 1.159463
## month 3.595446 11 1.059892
## duration 1.123020 1 1.059727
## campaign 1.105342 1 1.051352
## previous 1.264204 1 1.124368
## poutcome 1.497659 3 1.069635
# Generate an ROC curve to help us determine the best threshold
fit.step_predictions = predict(fit.step, test, type = "response")
fit.step_roc = roc(response = test$y, predictor = fit.step_predictions, levels = c("no", "yes"))
## Setting direction: controls < cases
auc(fit.step_roc)
## Area under the curve: 0.9087
plot(fit.step_roc, print.thres = "best", col = "black")
# Predict
threshold = 0.093
fit.step_predictions_categorical = factor(ifelse(predict(fit.step, test, "response") >= threshold, "yes", "no"), levels = c("no", "yes"))
confusionMatrix(data = fit.step_predictions_categorical, reference = factor(test$y, levels = c("no", "yes")))
## Confusion Matrix and Statistics
##
## Reference
## Prediction no yes
## no 9570 189
## yes 2406 1397
##
## Accuracy : 0.8087
## 95% CI : (0.8019, 0.8152)
## No Information Rate : 0.8831
## P-Value [Acc > NIR] : 1
##
## Kappa : 0.4233
##
## Mcnemar's Test P-Value : <2e-16
##
## Sensitivity : 0.7991
## Specificity : 0.8808
## Pos Pred Value : 0.9806
## Neg Pred Value : 0.3673
## Prevalence : 0.8831
## Detection Rate : 0.7056
## Detection Prevalence : 0.7196
## Balanced Accuracy : 0.8400
##
## 'Positive' Class : no
##
NOTE: The final model was produced elsewhere through a manual stepping process as some of the automated routines failed
AUROC: 0.9045 AIC: 15484.51 Accuracy: 0.8188 Sensitivity: 0.8137 Specificity: 0.8569 Prevalence: 0.8831 PPV: 0.9806 NPV: 0.3673
Note that because we have such unbalanced data, our accuracy is always expected to be high. Only 10% of the results were “yes”.
However, once we try and increase the specificity, we realize that the ideal threshold for this base model is 0.093, which our accuracy is 0.8087.
set.seed(124)
stepwiseResults = read.csv("Stepwise Regression Results.csv")
ggplot(stepwiseResults, aes(x = reorder(Variable.Added, AIC, decreasing = T), y = AIC)) +
geom_point(size = 3) +
labs(title = "AIC Metric with Additional Variables being Added", x= "Variable Added", y = "AIC") +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
logit_step = glm(factor(y) ~ housing + contact + month + duration + poutcome , data = training, family = "binomial")
summary(logit_step)
##
## Call:
## glm(formula = factor(y) ~ housing + contact + month + duration +
## poutcome, family = "binomial", data = training)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -5.6143 -0.3832 -0.2706 -0.1604 3.3708
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.304e+00 9.292e-02 -24.792 < 2e-16 ***
## housingyes -8.748e-01 5.049e-02 -17.327 < 2e-16 ***
## contacttelephone -1.907e-01 8.488e-02 -2.247 0.024633 *
## contactunknown -1.672e+00 8.716e-02 -19.185 < 2e-16 ***
## monthaug -9.394e-01 9.023e-02 -10.411 < 2e-16 ***
## monthdec 6.813e-01 2.058e-01 3.310 0.000933 ***
## monthfeb -3.426e-01 9.894e-02 -3.462 0.000536 ***
## monthjan -1.158e+00 1.387e-01 -8.353 < 2e-16 ***
## monthjul -1.107e+00 9.048e-02 -12.230 < 2e-16 ***
## monthjun 2.159e-01 1.091e-01 1.979 0.047871 *
## monthmar 1.501e+00 1.435e-01 10.460 < 2e-16 ***
## monthmay -4.852e-01 8.407e-02 -5.771 7.90e-09 ***
## monthnov -9.130e-01 9.853e-02 -9.266 < 2e-16 ***
## monthoct 9.236e-01 1.279e-01 7.219 5.23e-13 ***
## monthsep 7.666e-01 1.397e-01 5.487 4.08e-08 ***
## duration 4.106e-03 7.647e-05 53.697 < 2e-16 ***
## poutcomeother 2.501e-01 1.038e-01 2.410 0.015948 *
## poutcomesuccess 2.385e+00 9.430e-02 25.294 < 2e-16 ***
## poutcomeunknown -1.530e-01 6.737e-02 -2.272 0.023104 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 22845 on 31648 degrees of freedom
## Residual deviance: 15447 on 31630 degrees of freedom
## AIC: 15485
##
## Number of Fisher Scoring iterations: 6
vif(logit_step)
## GVIF Df GVIF^(1/(2*Df))
## housing 1.340648 1 1.157864
## contact 1.772873 2 1.153903
## month 2.345615 11 1.039513
## duration 1.105390 1 1.051376
## poutcome 1.222927 3 1.034110
# Generate an ROC curve to help us determine the best threshold
logit_step_predictions = predict(logit_step, test, type = "response")
logit_step_roc = roc(response = test$y, predictor = logit_step_predictions, levels = c("no", "yes"))
## Setting direction: controls < cases
auc(logit_step_roc)
## Area under the curve: 0.9045
plot(logit_step_roc, print.thres = "best", col = "black")
# Predict
threshold = 0.101
logit_step_predictions_categorical = factor(ifelse(predict(logit_step, test, "response") >= threshold, "yes", "no"), levels = c("no", "yes"))
confusionMatrix(data = logit_step_predictions_categorical, reference = factor(test$y, levels = c("no", "yes")))
## Confusion Matrix and Statistics
##
## Reference
## Prediction no yes
## no 9745 227
## yes 2231 1359
##
## Accuracy : 0.8188
## 95% CI : (0.8122, 0.8252)
## No Information Rate : 0.8831
## P-Value [Acc > NIR] : 1
##
## Kappa : 0.4332
##
## Mcnemar's Test P-Value : <2e-16
##
## Sensitivity : 0.8137
## Specificity : 0.8569
## Pos Pred Value : 0.9772
## Neg Pred Value : 0.3786
## Prevalence : 0.8831
## Detection Rate : 0.7186
## Detection Prevalence : 0.7353
## Balanced Accuracy : 0.8353
##
## 'Positive' Class : no
##
AIC(model1)
## [1] 15206.49
AIC(adj.model1)
## [1] 15202.89
AIC(pen.model1)
## [1] 15201.86
AIC(fit.step)
## [1] 15201.86
AIC(logit_step)
## [1] 15484.51
library(gtsummary)
##
## Attaching package: 'gtsummary'
## The following object is masked from 'package:MASS':
##
## select
# Create a nice looking table
tbl_regression(logit_step, exponentiate = TRUE) %>%
as_gt() %>%
gt::tab_options(table.font.size = 10)
Characteristic | OR1 | 95% CI1 | p-value |
---|---|---|---|
housing | |||
no | — | — | |
yes | 0.42 | 0.38, 0.46 | <0.001 |
contact | |||
cellular | — | — | |
telephone | 0.83 | 0.70, 0.97 | 0.025 |
unknown | 0.19 | 0.16, 0.22 | <0.001 |
month | |||
apr | — | — | |
aug | 0.39 | 0.33, 0.47 | <0.001 |
dec | 1.98 | 1.32, 2.95 | <0.001 |
feb | 0.71 | 0.58, 0.86 | <0.001 |
jan | 0.31 | 0.24, 0.41 | <0.001 |
jul | 0.33 | 0.28, 0.39 | <0.001 |
jun | 1.24 | 1.00, 1.54 | 0.048 |
mar | 4.49 | 3.38, 5.94 | <0.001 |
may | 0.62 | 0.52, 0.73 | <0.001 |
nov | 0.40 | 0.33, 0.49 | <0.001 |
oct | 2.52 | 1.96, 3.23 | <0.001 |
sep | 2.15 | 1.64, 2.83 | <0.001 |
duration | 1.00 | 1.00, 1.00 | <0.001 |
poutcome | |||
failure | — | — | |
other | 1.28 | 1.05, 1.57 | 0.016 |
success | 10.9 | 9.04, 13.1 | <0.001 |
unknown | 0.86 | 0.75, 0.98 | 0.023 |
1 OR = Odds Ratio, CI = Confidence Interval |
# make new numeric column for "y" column
bank$y_num = num(ifelse(bank$y == "yes",1,0))
## Age
ggplot(bank,aes(x=age,y=y_num, color = marital))+geom_point()+
geom_smooth(method="loess",size=1,span=.75, se = FALSE) + ggtitle("Loess Plot for Age vs. Subscriptions vs. Marital Status")
## `geom_smooth()` using formula 'y ~ x'
ggplot(bank,aes(x=age,y=y_num, color = education))+geom_point()+
geom_smooth(method="loess",size=1,span=.75, se = FALSE) + ggtitle("Loess Plot for Age vs. Subscriptions vs. Education") # no difference
## `geom_smooth()` using formula 'y ~ x'
ggplot(bank,aes(x=age,y=y_num, color = housing))+geom_point()+
geom_smooth(method="loess",size=1,span=.75, se = FALSE) + ggtitle("Loess Plot for Age vs. Subscriptions vs. Housing")
## `geom_smooth()` using formula 'y ~ x'
ggplot(bank,aes(x=age,y=y_num, color = loan))+geom_point()+
geom_smooth(method="loess",size=1,span=.75, se = FALSE)+ ggtitle("Loess Plot for Age vs. Subscriptions vs. Loan")
## `geom_smooth()` using formula 'y ~ x'
## Balance
ggplot(bank,aes(x=balance,y=y_num, color = marital))+geom_point()+
geom_smooth(method="loess",size=1,span=.75, se = FALSE) + ggtitle("Loess Plot for Balance vs. Subscriptions vs. Marital")
## `geom_smooth()` using formula 'y ~ x'
ggplot(bank,aes(x=balance,y=y_num, color = housing))+geom_point()+
geom_smooth(method="loess",size=1,span=.75, se = FALSE) + ggtitle("Loess Plot for Balance vs. Subscriptions vs. Housing")# no difference
## `geom_smooth()` using formula 'y ~ x'
ggplot(bank,aes(x=balance,y=y_num, color = education))+geom_point()+
geom_smooth(method="loess",size=1,span=.75, se = FALSE) + ggtitle("Loess Plot for Balance vs. Subscriptions vs. Education")
## `geom_smooth()` using formula 'y ~ x'
ggplot(bank,aes(x=balance,y=y_num, color = month))+geom_point()+
geom_smooth(method="loess",size=1,span=.75, se = FALSE) + ggtitle("Loess Plot for Balance vs. Subscriptions vs. Loan")
## `geom_smooth()` using formula 'y ~ x'
## Duration
bank2 = bank
bank2$dur.poly <- poly(bank2$duration^2)
ggplot(bank, aes(x = duration, y = y_num)) +
geom_point() +
geom_smooth(method = "loess", size = 1, span = 3, se = FALSE) +
facet_wrap(~marital)+
ggtitle("Loess Plot for Duration vs. Subscriptions vs. Marital")
## `geom_smooth()` using formula 'y ~ x'
ggplot(bank,aes(x=duration,y=y_num))+geom_point()+
geom_smooth(method="loess",size=1,span=.75, se = FALSE)+
facet_wrap(~housing) +
ggtitle("Loess Plot for Duration vs. Subscriptions vs. Housing")
## `geom_smooth()` using formula 'y ~ x'
ggplot(bank,aes(x=duration,y=y_num, color = education))+geom_point()+
geom_smooth(method="loess",size=1,span=.75, se = FALSE)+ ggtitle("Loess Plot for Duration vs. Subscriptions vs. Education")
## `geom_smooth()` using formula 'y ~ x'
ggplot(bank,aes(x=duration,y=y_num, color = job))+geom_point()+
geom_smooth(method="loess",size=1,span=.75, se = FALSE) + ggtitle("Loess Plot for Duration vs. Subscriptions vs. Job")
## `geom_smooth()` using formula 'y ~ x'
ggplot(bank,aes(x=duration,y=y_num, color = poutcome))+geom_point()+
geom_smooth(method="loess",size=1,span=.75, se = FALSE) + ggtitle("Loess Plot for Duration vs. Subscriptions vs. Poutcome")
## `geom_smooth()` using formula 'y ~ x'
ggplot(bank,aes(x=duration,y=y_num, color = month))+geom_point()+
geom_smooth(method="loess",size=1,span=.75, se = FALSE) + ggtitle("Loess Plot for Duration vs. Subscriptions vs. Month")
## `geom_smooth()` using formula 'y ~ x'
ggplot(bank,aes(x=duration,y=y_num))+geom_point()+
geom_smooth(method="loess",size=1,span=.75, se = FALSE) + ggtitle("Loess Plot for Duration vs. Subscriptions")
## `geom_smooth()` using formula 'y ~ x'
## Pdays
ggplot(bank,aes(x=pdays,y=y_num, color = marital))+geom_point()+
geom_smooth(method="loess",size=1,span=1, se = FALSE) + ggtitle("Loess Plot for Previous Days vs. Subscriptions vs. Marital")
## `geom_smooth()` using formula 'y ~ x'
ggplot(bank,aes(x=pdays,y=y_num, color = housing))+geom_point()+
geom_smooth(method="loess",size=1,span=1, se = FALSE) + ggtitle("Loess Plot for Previous Days vs. Subscriptions vs. Housing")
## `geom_smooth()` using formula 'y ~ x'
ggplot(bank,aes(x=pdays,y=y_num, color = education))+geom_point()+
geom_smooth(method="loess",size=1,span=1, se = FALSE) + ggtitle("Loess Plot for Previous Days vs. Subscriptions vs. Education")
## `geom_smooth()` using formula 'y ~ x'
ggplot(bank,aes(x=pdays,y=y_num, color = loan))+geom_point()+
geom_smooth(method="loess",size=1,span=1, se = FALSE) + ggtitle("Loess Plot for Previous Days vs. Subscriptions vs. Loan")
## `geom_smooth()` using formula 'y ~ x'
bank = bank[,-c(18)] # remove y_num from dataset
ggplot(bank, aes(x = poutcome, y = duration, fill = y)) +
geom_boxplot() + ggtitle("Boxplot for Previous Outcome vs. Duration by Subscription Outcome")
ggplot(bank, aes(x =month, y = duration, fill = y)) +
geom_boxplot() + ggtitle("Boxplot for Month vs. Duration by Subscription Outcome")
ggplot(bank, aes(x =marital, y = duration, fill = y)) +
geom_boxplot() + ggtitle("Boxplot for Marital Status vs. Duration by Subscription Outcome")
ggplot(bank, aes(x = housing, y = duration, fill = y)) +
geom_boxplot() + ggtitle("Boxplot for Housing vs. Duration by Subscription Outcome")
ggplot(bank, aes(x = loan, y = duration, fill = y)) +
geom_boxplot() + ggtitle("Boxplot for Housing vs. Duration by Subscription Outcome")
ggplot(bank, aes(x =month, y = log(balance), fill = y)) +
geom_boxplot() + ggtitle("Boxplot for Month vs. log(Balance) by Subscription Outcome")
## Warning in log(balance): NaNs produced
## Warning in log(balance): NaNs produced
## Warning: Removed 7280 rows containing non-finite values (stat_boxplot).
ggplot(bank, aes(x = housing, y = log(balance), fill = y)) +
geom_boxplot() + ggtitle("Boxplot for Housing vs. log(Balance) by Subscription Outcome")
## Warning in log(balance): NaNs produced
## Warning in log(balance): NaNs produced
## Warning: Removed 7280 rows containing non-finite values (stat_boxplot).
ggplot(bank, aes(x = housing, y = log(campaign), fill = y)) +
geom_boxplot() + ggtitle("Boxplot for Housing vs. log(Campaign) by Subscription Outcome")
ggplot(bank, aes(x = month, y = log(balance), fill = y)) +
geom_boxplot() + ggtitle("Boxplot for Month vs. Balance by Subscription Outcome")
## Warning in log(balance): NaNs produced
## Warning in log(balance): NaNs produced
## Warning: Removed 7280 rows containing non-finite values (stat_boxplot).
ggplot(bank, aes(x = poutcome, y = log(previous), fill = y)) +
geom_boxplot() + ggtitle("Boxplot for Previous Outcome vs. log(Previous) by Subscription Outcome")
## Warning: Removed 36954 rows containing non-finite values (stat_boxplot).
Please refer to the penalized regression/LASSO to see how we determine these variables.
AUROC: 0.9147 AIC: 14222.29 Accuracy: 0.8389
Sensitivity: 0.8378
Specificity: 0.8474
Prevalence: 0.8831 PPV: 0.9764
NPV: 0.4089
logit_complex = glm(factor(y) ~ poutcome + poly(duration,2) + poutcome:poly(duration,2) + month + month:poly(duration,2) + contact + housing + housing:poly(duration,2) + job + campaign + loan + job:poly(duration,2) + marital + education + day + balance + month:balance,
data = training, family = "binomial")
summary(logit_complex)
##
## Call:
## glm(formula = factor(y) ~ poutcome + poly(duration, 2) + poutcome:poly(duration,
## 2) + month + month:poly(duration, 2) + contact + housing +
## housing:poly(duration, 2) + job + campaign + loan + job:poly(duration,
## 2) + marital + education + day + balance + month:balance,
## family = "binomial", data = training)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.9323 -0.3564 -0.1893 -0.0834 4.1629
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.188e+00 1.723e-01 -6.895 5.39e-12 ***
## poutcomeother 3.028e-01 1.238e-01 2.446 0.014432 *
## poutcomesuccess 2.330e+00 1.089e-01 21.392 < 2e-16 ***
## poutcomeunknown -1.879e-01 8.031e-02 -2.339 0.019320 *
## poly(duration, 2)1 6.803e+01 1.793e+01 3.795 0.000148 ***
## poly(duration, 2)2 -1.280e+02 2.807e+01 -4.559 5.13e-06 ***
## monthaug -1.169e+00 1.204e-01 -9.710 < 2e-16 ***
## monthdec 3.475e-01 2.644e-01 1.314 0.188788
## monthfeb -2.348e-01 1.247e-01 -1.883 0.059702 .
## monthjan -1.524e+00 1.851e-01 -8.236 < 2e-16 ***
## monthjul -1.270e+00 1.282e-01 -9.902 < 2e-16 ***
## monthjun 2.582e-01 1.366e-01 1.889 0.058861 .
## monthmar 1.516e+00 1.886e-01 8.037 9.20e-16 ***
## monthmay -1.153e+00 1.247e-01 -9.244 < 2e-16 ***
## monthnov -9.008e-01 1.278e-01 -7.051 1.77e-12 ***
## monthoct 8.102e-01 1.501e-01 5.397 6.78e-08 ***
## monthsep 6.723e-01 1.749e-01 3.844 0.000121 ***
## contacttelephone -5.148e-02 8.902e-02 -0.578 0.563077
## contactunknown -1.820e+00 9.850e-02 -18.474 < 2e-16 ***
## housingyes -9.081e-01 6.601e-02 -13.756 < 2e-16 ***
## jobblue-collar -5.384e-01 1.173e-01 -4.589 4.45e-06 ***
## jobentrepreneur -5.291e-01 2.096e-01 -2.525 0.011578 *
## jobhousemaid -4.387e-01 1.957e-01 -2.241 0.025029 *
## jobmanagement -1.051e-01 9.995e-02 -1.051 0.293244
## jobretired 2.508e-01 1.201e-01 2.088 0.036820 *
## jobself-employed -2.000e-01 1.612e-01 -1.240 0.214846
## jobservices -2.515e-01 1.304e-01 -1.929 0.053762 .
## jobstudent 3.754e-01 1.440e-01 2.606 0.009154 **
## jobtechnician -1.343e-01 9.929e-02 -1.353 0.176092
## jobunemployed -2.014e-01 1.652e-01 -1.219 0.222776
## jobunknown -2.344e-01 3.833e-01 -0.612 0.540777
## campaign -9.333e-02 1.253e-02 -7.451 9.27e-14 ***
## loanyes -4.799e-01 7.387e-02 -6.496 8.23e-11 ***
## maritalmarried -1.816e-01 7.184e-02 -2.527 0.011494 *
## maritalsingle 1.008e-01 7.763e-02 1.298 0.194225
## educationsecondary 1.618e-01 7.899e-02 2.049 0.040474 *
## educationtertiary 3.468e-01 9.098e-02 3.812 0.000138 ***
## educationunknown 3.252e-02 1.296e-01 0.251 0.801893
## day 8.481e-03 3.077e-03 2.756 0.005850 **
## balance 2.416e-05 2.105e-05 1.148 0.250993
## poutcomeother:poly(duration, 2)1 -7.120e+00 1.705e+01 -0.418 0.676300
## poutcomesuccess:poly(duration, 2)1 -6.029e+00 2.261e+01 -0.267 0.789733
## poutcomeunknown:poly(duration, 2)1 5.386e+01 1.126e+01 4.784 1.72e-06 ***
## poutcomeother:poly(duration, 2)2 2.105e+00 2.952e+01 0.071 0.943160
## poutcomesuccess:poly(duration, 2)2 1.677e+01 3.438e+01 0.488 0.625645
## poutcomeunknown:poly(duration, 2)2 6.646e+01 1.828e+01 3.636 0.000277 ***
## poly(duration, 2)1:monthaug 8.180e+01 1.431e+01 5.717 1.08e-08 ***
## poly(duration, 2)2:monthaug -8.609e+01 2.301e+01 -3.741 0.000183 ***
## poly(duration, 2)1:monthdec 6.822e+01 4.052e+01 1.684 0.092236 .
## poly(duration, 2)2:monthdec -4.307e+01 5.465e+01 -0.788 0.430628
## poly(duration, 2)1:monthfeb 1.641e+01 1.534e+01 1.070 0.284569
## poly(duration, 2)2:monthfeb 4.569e+01 2.211e+01 2.066 0.038824 *
## poly(duration, 2)1:monthjan 4.461e+01 2.052e+01 2.174 0.029672 *
## poly(duration, 2)2:monthjan 1.126e+01 2.485e+01 0.453 0.650581
## poly(duration, 2)1:monthjul 8.500e+01 1.386e+01 6.132 8.69e-10 ***
## poly(duration, 2)2:monthjul -2.574e+01 2.123e+01 -1.212 0.225369
## poly(duration, 2)1:monthjun 8.988e+01 1.479e+01 6.078 1.22e-09 ***
## poly(duration, 2)2:monthjun 3.734e+00 2.022e+01 0.185 0.853482
## poly(duration, 2)1:monthmar 6.582e+01 4.238e+01 1.553 0.120415
## poly(duration, 2)2:monthmar -1.087e+01 4.397e+01 -0.247 0.804745
## poly(duration, 2)1:monthmay 1.232e+02 1.285e+01 9.585 < 2e-16 ***
## poly(duration, 2)2:monthmay -9.163e+01 1.990e+01 -4.605 4.12e-06 ***
## poly(duration, 2)1:monthnov 3.355e+01 1.417e+01 2.367 0.017912 *
## poly(duration, 2)2:monthnov -2.517e+00 2.193e+01 -0.115 0.908616
## poly(duration, 2)1:monthoct -2.932e+01 2.335e+01 -1.256 0.209234
## poly(duration, 2)2:monthoct -1.691e+01 3.077e+01 -0.550 0.582656
## poly(duration, 2)1:monthsep 1.902e+01 2.562e+01 0.742 0.457805
## poly(duration, 2)2:monthsep -1.448e+01 3.733e+01 -0.388 0.698092
## poly(duration, 2)1:housingyes 3.936e+01 7.613e+00 5.170 2.34e-07 ***
## poly(duration, 2)2:housingyes 6.839e+00 1.122e+01 0.610 0.542003
## poly(duration, 2)1:jobblue-collar 1.479e+01 1.270e+01 1.164 0.244446
## poly(duration, 2)2:jobblue-collar -3.740e+01 1.759e+01 -2.126 0.033508 *
## poly(duration, 2)1:jobentrepreneur 3.039e+01 2.225e+01 1.366 0.172054
## poly(duration, 2)2:jobentrepreneur -2.235e+01 2.567e+01 -0.871 0.383903
## poly(duration, 2)1:jobhousemaid -3.134e+01 2.017e+01 -1.554 0.120162
## poly(duration, 2)2:jobhousemaid 2.372e+00 2.666e+01 0.089 0.929120
## poly(duration, 2)1:jobmanagement -1.748e+01 1.182e+01 -1.479 0.139084
## poly(duration, 2)2:jobmanagement -1.384e+01 1.592e+01 -0.869 0.384736
## poly(duration, 2)1:jobretired -3.606e+01 1.624e+01 -2.221 0.026365 *
## poly(duration, 2)2:jobretired -4.471e+01 2.374e+01 -1.883 0.059694 .
## poly(duration, 2)1:jobself-employed 1.699e+01 1.995e+01 0.852 0.394440
## poly(duration, 2)2:jobself-employed 2.287e+01 3.022e+01 0.757 0.449178
## poly(duration, 2)1:jobservices 4.084e-01 1.483e+01 0.028 0.978025
## poly(duration, 2)2:jobservices -3.233e+00 2.193e+01 -0.147 0.882805
## poly(duration, 2)1:jobstudent -4.411e+01 2.767e+01 -1.594 0.110832
## poly(duration, 2)2:jobstudent -9.919e+01 4.644e+01 -2.136 0.032687 *
## poly(duration, 2)1:jobtechnician -9.709e+00 1.255e+01 -0.774 0.439194
## poly(duration, 2)2:jobtechnician -2.804e+01 1.626e+01 -1.725 0.084578 .
## poly(duration, 2)1:jobunemployed -1.334e+01 1.860e+01 -0.717 0.473499
## poly(duration, 2)2:jobunemployed -4.697e+01 2.503e+01 -1.877 0.060521 .
## poly(duration, 2)1:jobunknown 8.459e+01 7.653e+01 1.105 0.269025
## poly(duration, 2)2:jobunknown 5.402e+01 1.390e+02 0.389 0.697573
## monthaug:balance 1.143e-05 2.540e-05 0.450 0.652622
## monthdec:balance -2.177e-06 6.141e-05 -0.035 0.971728
## monthfeb:balance 9.858e-06 3.060e-05 0.322 0.747352
## monthjan:balance 1.554e-04 5.057e-05 3.073 0.002122 **
## monthjul:balance 1.535e-05 2.966e-05 0.518 0.604707
## monthjun:balance -2.463e-05 2.734e-05 -0.901 0.367574
## monthmar:balance -8.173e-05 4.772e-05 -1.713 0.086744 .
## monthmay:balance -1.180e-05 2.751e-05 -0.429 0.668025
## monthnov:balance -1.718e-05 2.648e-05 -0.649 0.516372
## monthoct:balance -4.975e-05 3.210e-05 -1.550 0.121260
## monthsep:balance -5.463e-05 4.506e-05 -1.212 0.225342
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 22845 on 31648 degrees of freedom
## Residual deviance: 14013 on 31546 degrees of freedom
## AIC: 14219
##
## Number of Fisher Scoring iterations: 7
# Generate an ROC curve to help us determine the best threshold
logit_complex_predictions = predict(logit_complex, test, type = "response")
logit_complex_roc = roc(response = test$y, predictor = logit_complex_predictions, levels = c("no", "yes"))
## Setting direction: controls < cases
auc(logit_complex_roc)
## Area under the curve: 0.9145
plot(logit_complex_roc, print.thres = "best", col = "black")
# Predict
threshold = 0.124
logit_complex_predictions_categorical = factor(ifelse(predict(logit_complex, test, "response") >= threshold, "yes", "no"), levels = c("no", "yes"))
confusionMatrix(data = logit_complex_predictions_categorical, reference = factor(test$y, levels = c("no", "yes")))
## Confusion Matrix and Statistics
##
## Reference
## Prediction no yes
## no 10033 242
## yes 1943 1344
##
## Accuracy : 0.8389
## 95% CI : (0.8326, 0.845)
## No Information Rate : 0.8831
## P-Value [Acc > NIR] : 1
##
## Kappa : 0.4676
##
## Mcnemar's Test P-Value : <2e-16
##
## Sensitivity : 0.8378
## Specificity : 0.8474
## Pos Pred Value : 0.9764
## Neg Pred Value : 0.4089
## Prevalence : 0.8831
## Detection Rate : 0.7398
## Detection Prevalence : 0.7576
## Balanced Accuracy : 0.8426
##
## 'Positive' Class : no
##
AIC(logit_complex)
## [1] 14218.68
anova(logit_complex, test="Chisq")
## Analysis of Deviance Table
##
## Model: binomial, link: logit
##
## Response: factor(y)
##
## Terms added sequentially (first to last)
##
##
## Df Deviance Resid. Df Resid. Dev Pr(>Chi)
## NULL 31648 22845
## poutcome 3 1952.1 31645 20893 < 2.2e-16 ***
## poly(duration, 2) 2 4185.8 31643 16707 < 2.2e-16 ***
## month 11 1153.3 31632 15554 < 2.2e-16 ***
## contact 2 441.3 31630 15112 < 2.2e-16 ***
## housing 1 308.6 31629 14804 < 2.2e-16 ***
## job 11 140.5 31618 14663 < 2.2e-16 ***
## campaign 1 53.6 31617 14610 2.425e-13 ***
## loan 1 46.6 31616 14563 8.685e-12 ***
## marital 2 38.1 31614 14525 5.439e-09 ***
## education 3 19.9 31611 14505 0.0001801 ***
## day 1 8.0 31610 14497 0.0047028 **
## balance 1 6.2 31609 14491 0.0124291 *
## poutcome:poly(duration, 2) 6 87.4 31603 14404 < 2.2e-16 ***
## poly(duration, 2):month 22 280.9 31581 14123 < 2.2e-16 ***
## poly(duration, 2):housing 2 41.8 31579 14081 8.452e-10 ***
## poly(duration, 2):job 22 44.2 31557 14037 0.0033831 **
## month:balance 11 24.0 31546 14013 0.0129425 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
training %>% ggplot(aes(x =age,y = balance, color = as.factor(y))) +
geom_point()+geom_density_2d()
training %>% ggplot(aes(x =age,y = day, color = as.factor(y))) +
geom_point()+geom_density_2d()
training %>% ggplot(aes(x =age,y = duration, color = as.factor(y))) +
geom_point()+geom_density_2d()
training %>% ggplot(aes(x =age,y = campaign, color = as.factor(y))) +
geom_point()+geom_density_2d()
training %>% ggplot(aes(x =log(balance),y = day, color = as.factor(y))) +
geom_point()+geom_density_2d()
## Warning in log(balance): NaNs produced
## Warning in log(balance): NaNs produced
## Warning in log(balance): NaNs produced
## Warning: Removed 5189 rows containing non-finite values (stat_density2d).
## Warning: Removed 2714 rows containing missing values (geom_point).
training %>% ggplot(aes(x =log(balance),y = duration, color = as.factor(y))) +
geom_point()+geom_density_2d()
## Warning in log(balance): NaNs produced
## Warning in log(balance): NaNs produced
## Warning in log(balance): NaNs produced
## Warning: Removed 5189 rows containing non-finite values (stat_density2d).
## Warning: Removed 2714 rows containing missing values (geom_point).
training %>% ggplot(aes(x =log(balance),y = log(campaign), color = as.factor(y))) +
geom_point()+geom_density_2d()
## Warning in log(balance): NaNs produced
## Warning in log(balance): NaNs produced
## Warning in log(balance): NaNs produced
## Warning: Removed 5189 rows containing non-finite values (stat_density2d).
## Warning: Removed 2714 rows containing missing values (geom_point).
training %>% ggplot(aes(x =day,y = duration, color = as.factor(y))) +
geom_point()+geom_density_2d()
training %>% ggplot(aes(x =day,y = campaign, color = as.factor(y))) +
geom_point()+geom_density_2d()
#### LDA
AUROC: 0.9117 Accuracy: 0.826
Sensitivity: 0.8217
Specificity: 0.8581
Prevalence: 0.8831 PPV: 0.9776
NPV: 0.3893
set.seed(1234)
fitControl = trainControl(method = "repeatedcv", number = 5, repeats = 1, classProbs = TRUE, summaryFunction = mnLogLoss)
lda_base = train(factor(y) ~ ., data = training, method = "lda", trControl = fitControl, metric = "logLoss")
summary(lda_base)
## Length Class Mode
## prior 2 -none- numeric
## counts 2 -none- numeric
## means 84 -none- numeric
## scaling 42 -none- numeric
## lev 2 -none- character
## svd 1 -none- numeric
## N 1 -none- numeric
## call 3 -none- call
## xNames 42 -none- character
## problemType 1 -none- character
## tuneValue 1 data.frame list
## obsLevels 2 -none- character
## param 0 -none- list
# Generate an ROC curve to help us determine the best threshold
lda_base_predictions = predict(lda_base, test, type = "prob")$yes
lda_base_roc = roc(response = test$y, predictor = lda_base_predictions, levels = c("no", "yes"))
## Setting direction: controls < cases
auc(lda_base_roc)
## Area under the curve: 0.9117
plot(lda_base_roc, print.thres = "best", col = "black")
# Predict
threshold = 0.045
lda_base_predictions_categorical = factor(ifelse(predict(lda_base, test, type = "prob")$yes >= threshold, "yes", "no"), levels = c("no", "yes"))
confusionMatrix(data = lda_base_predictions_categorical, reference = factor(test$y, levels = c("no", "yes")))
## Confusion Matrix and Statistics
##
## Reference
## Prediction no yes
## no 9841 225
## yes 2135 1361
##
## Accuracy : 0.826
## 95% CI : (0.8195, 0.8323)
## No Information Rate : 0.8831
## P-Value [Acc > NIR] : 1
##
## Kappa : 0.4466
##
## Mcnemar's Test P-Value : <2e-16
##
## Sensitivity : 0.8217
## Specificity : 0.8581
## Pos Pred Value : 0.9776
## Neg Pred Value : 0.3893
## Prevalence : 0.8831
## Detection Rate : 0.7256
## Detection Prevalence : 0.7422
## Balanced Accuracy : 0.8399
##
## 'Positive' Class : no
##
NOTE: QDA does not perform very well here. The optimal threshold was 0 which returns NaN’s in certain performance metrics
AUROC: 0.838 Accuracy: 0.1169
Sensitivity: 0.0
Specificity: 1.0
Prevalence: 0.8831 PPV: NaN
NPV: 0.1169
set.seed(1234)
fitControl = trainControl(method = "repeatedcv", number = 5, repeats = 1, classProbs = TRUE, summaryFunction = mnLogLoss)
qda_base = train(factor(y) ~ ., data = training, method = "qda", trControl = fitControl, metric = "logLoss")
summary(qda_base)
## Length Class Mode
## prior 2 -none- numeric
## counts 2 -none- numeric
## means 84 -none- numeric
## scaling 3528 -none- numeric
## ldet 2 -none- numeric
## lev 2 -none- character
## N 1 -none- numeric
## call 3 -none- call
## xNames 42 -none- character
## problemType 1 -none- character
## tuneValue 1 data.frame list
## obsLevels 2 -none- character
## param 0 -none- list
# Generate an ROC curve to help us determine the best threshold
qda_base_predictions = predict(qda_base, test, type = "prob")$yes
qda_base_roc = roc(response = test$y, predictor = qda_base_predictions, levels = c("no", "yes"))
## Setting direction: controls < cases
auc(qda_base_roc)
## Area under the curve: 0.838
plot(qda_base_roc, print.thres = "best", col = "black")
# Predict
threshold = 0
qda_base_predictions_categorical = factor(ifelse(predict(qda_base, test, type = "prob")$yes >= threshold, "yes", "no"), levels = c("no", "yes"))
confusionMatrix(data = qda_base_predictions_categorical, reference = factor(test$y, levels = c("no", "yes")))
## Confusion Matrix and Statistics
##
## Reference
## Prediction no yes
## no 0 0
## yes 11976 1586
##
## Accuracy : 0.1169
## 95% CI : (0.1116, 0.1225)
## No Information Rate : 0.8831
## P-Value [Acc > NIR] : 1
##
## Kappa : 0
##
## Mcnemar's Test P-Value : <2e-16
##
## Sensitivity : 0.0000
## Specificity : 1.0000
## Pos Pred Value : NaN
## Neg Pred Value : 0.1169
## Prevalence : 0.8831
## Detection Rate : 0.0000
## Detection Prevalence : 0.0000
## Balanced Accuracy : 0.5000
##
## 'Positive' Class : no
##
AUROC: 0.7963 Accuracy: 0.8084
Sensitivity: 0.8286
Specificity: 0.6564
Prevalence: 0.8831 PPV: 0.9479
NPV: 0.3365
## KNN
set.seed(1234)
fitControl = trainControl(method = "repeatedcv", number = 5, repeats = 1, classProbs = TRUE, summaryFunction = mnLogLoss)
knn.base = train(factor(y) ~ ., data = training, method = "knn", trControl = fitControl, metric = "logLoss")
# Generate an ROC curve to help us determine the best threshold
knn.base_predictions = predict(knn.base, test, type = "prob")$yes
knn.base_roc = roc(response = test$y, predictor = knn.base_predictions, levels = c("no", "yes"))
## Setting direction: controls < cases
auc(knn.base_roc)
## Area under the curve: 0.7963
plot(knn.base_roc, print.thres = "best", col = "black")
# Predict
threshold = 0.211
knn.base_predictions_categorical = factor(ifelse(predict(knn.base, test, type = "prob")$yes >= threshold, "yes", "no"), levels = c("no", "yes"))
confusionMatrix(data = knn.base_predictions_categorical, reference = factor(test$y, levels = c("no", "yes")))
## Confusion Matrix and Statistics
##
## Reference
## Prediction no yes
## no 9923 545
## yes 2053 1041
##
## Accuracy : 0.8084
## 95% CI : (0.8017, 0.815)
## No Information Rate : 0.8831
## P-Value [Acc > NIR] : 1
##
## Kappa : 0.3433
##
## Mcnemar's Test P-Value : <2e-16
##
## Sensitivity : 0.8286
## Specificity : 0.6564
## Pos Pred Value : 0.9479
## Neg Pred Value : 0.3365
## Prevalence : 0.8831
## Detection Rate : 0.7317
## Detection Prevalence : 0.7719
## Balanced Accuracy : 0.7425
##
## 'Positive' Class : no
##
AUROC: 0.9281 Accuracy: 0.8363
Sensitivity: 0.8267
Specificity: 0.9086
Prevalence: 0.8831 PPV: 0.9856
NPV: 0.4098
## Random Forest
set.seed(1234)
fitControl = trainControl(method = "repeatedcv", number = 5, repeats = 1, classProbs = TRUE, summaryFunction = mnLogLoss)
rf.base = train(y ~ ., data = training, method = "rf", trControl = fitControl, metric = "logLoss")
summary(rf.base)
## Length Class Mode
## call 4 -none- call
## type 1 -none- character
## predicted 31649 factor numeric
## err.rate 1500 -none- numeric
## confusion 6 -none- numeric
## votes 63298 matrix numeric
## oob.times 31649 -none- numeric
## classes 2 -none- character
## importance 42 -none- numeric
## importanceSD 0 -none- NULL
## localImportance 0 -none- NULL
## proximity 0 -none- NULL
## ntree 1 -none- numeric
## mtry 1 -none- numeric
## forest 14 -none- list
## y 31649 factor numeric
## test 0 -none- NULL
## inbag 0 -none- NULL
## xNames 42 -none- character
## problemType 1 -none- character
## tuneValue 1 data.frame list
## obsLevels 2 -none- character
## param 0 -none- list
# Generate an ROC curve to help us determine the best threshold
rf.base_predictions = predict(rf.base, test, type = "prob")$yes
rf.base_roc = roc(response = test$y, predictor = rf.base_predictions, levels = c("no", "yes"))
## Setting direction: controls < cases
auc(rf.base_roc)
## Area under the curve: 0.9281
plot(rf.base_roc, print.thres = "best", col = "black")
# Predict
threshold = 0.123
rf.base_predictions_categorical = factor(ifelse(predict(rf.base, test, type = "prob")$yes >= threshold, "yes", "no"), levels = c("no", "yes"))
confusionMatrix(data = rf.base_predictions_categorical, reference = factor(test$y, levels = c("no", "yes")))
## Confusion Matrix and Statistics
##
## Reference
## Prediction no yes
## no 9901 145
## yes 2075 1441
##
## Accuracy : 0.8363
## 95% CI : (0.83, 0.8425)
## No Information Rate : 0.8831
## P-Value [Acc > NIR] : 1
##
## Kappa : 0.4813
##
## Mcnemar's Test P-Value : <2e-16
##
## Sensitivity : 0.8267
## Specificity : 0.9086
## Pos Pred Value : 0.9856
## Neg Pred Value : 0.4098
## Prevalence : 0.8831
## Detection Rate : 0.7301
## Detection Prevalence : 0.7407
## Balanced Accuracy : 0.8677
##
## 'Positive' Class : no
##
AUROC: 0.9333
Accuracy: 0.834
Sensitivity: 0.8228
Specificity: 0.9187
Prevalence: 0.8831 PPV: 0.9871
NPV: 0.4071
## XGB
set.seed(1234)
fitControl = trainControl(method = "repeatedcv", number = 5, repeats = 1, classProbs = TRUE, summaryFunction = mnLogLoss)
xgb.base = train(factor(y) ~ ., data = training, method = "xgbTree", trControl = fitControl, metric = "logLoss")
## [13:17:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:17:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:17:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:17:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:17:53] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:17:53] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:17:53] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:17:53] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:17:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:17:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:17:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:17:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:17:55] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:17:55] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:17:55] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:17:55] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:17:56] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:17:56] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:17:56] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:17:56] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:17:57] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:17:57] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:17:57] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:17:57] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:17:58] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:17:58] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:17:58] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:17:58] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:00] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:00] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:00] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:00] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:03] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:03] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:03] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:03] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:04] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:04] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:04] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:04] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:08] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:08] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:08] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:08] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:10] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:10] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:10] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:10] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:12] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:12] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:12] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:12] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:14] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:14] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:14] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:14] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:17] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:17] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:17] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:17] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:19] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:19] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:19] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:19] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:21] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:21] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:21] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:21] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:22] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:22] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:22] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:22] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:24] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:24] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:24] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:24] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:26] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:26] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:26] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:26] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:27] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:27] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:27] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:27] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:28] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:28] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:28] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:28] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:30] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:30] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:30] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:30] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:32] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:32] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:32] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:32] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:33] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:33] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:33] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:33] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:35] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:36] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:36] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:36] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:37] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:37] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:37] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:37] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:47] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:47] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:47] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:47] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:48] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:48] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:48] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:48] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:49] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:49] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:49] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:49] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:50] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:50] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:50] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:50] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:51] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:51] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:51] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:51] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:53] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:53] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:53] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:53] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:55] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:55] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:56] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:56] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:56] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:56] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:58] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:58] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:58] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:58] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:59] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:59] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:59] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:18:59] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:03] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:03] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:03] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:03] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:05] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:05] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:05] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:05] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:11] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:11] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:11] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:11] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:13] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:13] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:13] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:13] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:14] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:14] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:14] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:14] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:15] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:15] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:15] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:15] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:16] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:16] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:16] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:16] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:17] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:17] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:17] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:17] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:18] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:18] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:18] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:18] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:19] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:19] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:19] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:19] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:22] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:22] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:22] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:22] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:25] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:25] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:25] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:25] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:26] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:26] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:26] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:26] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:28] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:28] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:28] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:28] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:30] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:30] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:30] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:30] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:32] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:32] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:32] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:32] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:34] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:34] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:34] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:34] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:36] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:36] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:36] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:36] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:41] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:41] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:41] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:41] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:43] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:43] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:43] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:43] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:45] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:45] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:45] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:45] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:48] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:48] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:48] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:48] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:49] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:49] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:49] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:49] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:50] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:50] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:50] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:50] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:55] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:55] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:55] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:55] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:57] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:57] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:57] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:57] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:59] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:59] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:59] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:19:59] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:04] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:04] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:04] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:04] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:08] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:08] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:08] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:08] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:10] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:10] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:10] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:10] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:11] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:11] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:11] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:11] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:12] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:12] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:12] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:12] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:13] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:13] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:13] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:13] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:14] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:14] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:14] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:14] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:15] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:15] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:15] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:15] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:17] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:17] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:17] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:17] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:18] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:18] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:18] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:18] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:21] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:21] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:21] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:21] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:25] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:25] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:25] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:25] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:27] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:27] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:27] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:27] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:29] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:29] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:29] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:29] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:32] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:32] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:32] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:32] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:34] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:34] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:34] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:34] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:36] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:36] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:36] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:36] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:37] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:37] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:37] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:37] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:38] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:38] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:38] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:38] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:40] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:40] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:40] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:40] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:41] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:41] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:41] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:41] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:43] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:43] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:43] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:43] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:47] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:47] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:47] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:47] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:49] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:49] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:49] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:49] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:51] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:51] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:51] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:51] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:53] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:53] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:53] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:53] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:55] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:55] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:55] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:55] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:56] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:56] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:56] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:56] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:59] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:59] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:59] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:20:59] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:03] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:03] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:03] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:03] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:04] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:04] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:04] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:04] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:05] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:05] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:05] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:05] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:07] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:07] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:07] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:07] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:08] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:08] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:08] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:08] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:10] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:10] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:10] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:10] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:12] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:12] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:12] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:12] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:13] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:13] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:13] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:13] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:15] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:15] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:15] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:15] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:16] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:16] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:16] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:16] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:18] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:18] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:18] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:18] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:22] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:22] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:22] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:22] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:26] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:26] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:26] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:26] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:28] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:28] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:28] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:28] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:30] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:30] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:30] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:30] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:31] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:31] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:31] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:31] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:32] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:32] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:32] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:32] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:33] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:33] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:33] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:33] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:34] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:34] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:34] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:34] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:35] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:35] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:35] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:35] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:36] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:36] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:36] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:36] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:38] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:38] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:38] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:38] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:40] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:40] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:40] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:40] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:45] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:45] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:45] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:45] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:47] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:47] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:47] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:47] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:49] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:49] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:49] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:49] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:51] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:51] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:51] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:51] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:56] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:56] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:56] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:56] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:58] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:58] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:58] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:58] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:59] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:59] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:59] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:21:59] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:00] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:00] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:00] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:00] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:02] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:02] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:02] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:02] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:03] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:03] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:03] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:03] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:04] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:04] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:04] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:04] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:05] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:05] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:05] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:05] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:08] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:08] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:08] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:08] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:11] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:11] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:11] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:11] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:12] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:12] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:13] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:13] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:15] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:15] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:15] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:15] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:16] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:16] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:16] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:16] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:18] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:18] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:18] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:18] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:21] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:21] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:21] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:21] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:25] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:25] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:25] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [13:22:25] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
summary(xgb.base)
## Length Class Mode
## handle 1 xgb.Booster.handle externalptr
## raw 175792 -none- raw
## niter 1 -none- numeric
## call 5 -none- call
## params 8 -none- list
## callbacks 1 -none- list
## feature_names 42 -none- character
## nfeatures 1 -none- numeric
## xNames 42 -none- character
## problemType 1 -none- character
## tuneValue 7 data.frame list
## obsLevels 2 -none- character
## param 0 -none- list
# Generate an ROC curve to help us determine the best threshold
xgb.base_predictions = predict(xgb.base, test, type = "prob")$yes
xgb.base_roc = roc(response = test$y, predictor = xgb.base_predictions, levels = c("no", "yes"))
auc(xgb.base_roc)
## Area under the curve: 0.9324
plot(xgb.base_roc, print.thres = "best", col = "black")
# Predict
threshold = 0.096
xgb.base_predictions_categorical = factor(ifelse(predict(xgb.base, test, type = "prob")$yes >= threshold, "yes", "no"), levels = c("no", "yes"))
confusionMatrix(data = xgb.base_predictions_categorical, reference = factor(test$y, levels = c("no", "yes")))
## Confusion Matrix and Statistics
##
## Reference
## Prediction no yes
## no 9854 129
## yes 2122 1457
##
## Accuracy : 0.834
## 95% CI : (0.8277, 0.8402)
## No Information Rate : 0.8831
## P-Value [Acc > NIR] : 1
##
## Kappa : 0.4799
##
## Mcnemar's Test P-Value : <2e-16
##
## Sensitivity : 0.8228
## Specificity : 0.9187
## Pos Pred Value : 0.9871
## Neg Pred Value : 0.4071
## Prevalence : 0.8831
## Detection Rate : 0.7266
## Detection Prevalence : 0.7361
## Balanced Accuracy : 0.8707
##
## 'Positive' Class : no
##
AIC(model1)
## [1] 15206.49
AIC(adj.model1)
## [1] 15202.89
AIC(pen.model1)
## [1] 15201.86
AIC(fit.step)
## [1] 15201.86
AIC(logit_step)
## [1] 15484.51
AIC(logit_complex)
## [1] 14218.68