keras
y lime
.
0 1
44.82759 55.17241
factor
la variable respuesta que está codificada como numeric
. Este paso es importante para garantizar que las proporciones de cada clase (enfermo o sano) se mantengan en las bases de datos train y test.caret
con la función CreateDataPartition()
.set.seed(1000)
library(caret)
df_seno$Classification <- as.factor(df_seno$Classification)
ind <- createDataPartition(y = df_seno$Classification, times = 1,
p = 0.7, list = FALSE)
df_train <- df_seno[ind, ]
df_testi <- df_seno[-ind, ]
keras
keras
es necesario coercionar las bases de datos (data.frame
) train y test a la clase matrix
, de la misma manera que quedó coercionada la variable respuesta en el paso anterior.keras
y muchas otras bibliotecas para Machine Learning los modelos se expresan en términos matriciales; esto debido a la eficiencia algebráica para procesamiento de información. Este requisito no es obligatorio en todos los modelos, puesto que algunos aceptan las variables declaradas como fórmula (formula = y ~ x + w + z
).# Coerción a matriz
x_train <- as.matrix(df_train[, 1:9])
x_testi <- as.matrix(df_testi[, 1:9])
# Eliminando dimensiones
dimnames(x_train) <- NULL
dimnames(x_testi) <- NULL
scale()
para escalar o estandarizar las variables y la función normalize()
del paquete keras
permite aplicar la normalización min-max.normalize()
de la biblioteca keras
.library(keras)
df_train[, 1:9] <- normalize(x_train[, 1:9])
df_testi[, 1:9] <- normalize(x_testi[, 1:9])
df_train
. Corroborando que ninguna de las variables posee valores inferiores a cero o mayores a 1.apply(df_train, 2, range)
Age BMI Glucose Insulin HOMA Leptin Adiponectin Resistin
[1,] "0.02820357" "0.01555693" "0.05288169" "0.001492439" "0.0003313214" "0.005518683" "0.003125271" "0.005109257"
[2,] "0.39514376" "0.17217330" "0.73820809" "0.062640891" "0.0175414790" "0.264769237" "0.172404469" "0.260385811"
MCP.1 Classification
[1,] "0.4829921" "0"
[2,] "0.9979598" "1"
Classification
keras
, es necesario convertir la variable respuesta en Dummy, en regresión se suele hablar de variables indicadoras, aunque también es conocido como one-hot encoding (codificación activa) en Machine Learning.to_categorical()
del paquete keras
permite esta conversión.y_train <- to_categorical(df_train$Classification)
y_testi <- to_categorical(df_testi$Classification)
caret
, y keras
para entrenar los modelos de Machine Learning.Accuracy
o precisión del modelo.caret
son paralelizados con la biblioteca doMC
.k
: número de observaciones vecinas empleadas para realizar la predicción.# Paralelización del proceso
library(doMC)
library(parallel)
registerDoMC(cores = detectCores())
# Submuestras y repeticiones
particiones <- 10
repeticiones <- 10
# Definiendo hiperparámetro k
hiperparametros <- expand.grid(k = seq(1, 30, 2))
# Semillas
set.seed(123)
seeds <- vector(mode = "list", length = (particiones * repeticiones) + 1)
for (i in 1:(particiones * repeticiones)) {
seeds[[i]] <- sample.int(1000, nrow(hiperparametros))
}
seeds[[(particiones * repeticiones) + 1]] <- sample.int(1000, 1)
# Control de entrenamiento
cross_val <- trainControl(
method = "repeatedcv",
number = particiones,
repeats = repeticiones,
returnResamp = "final",
verboseIter = FALSE,
allowParallel = TRUE,
seeds = seeds
)
# Ajuste del modelo (entrenamiento)
set.seed(1000)
mod_knn <- train(
Classification ~ .,
data = df_train,
method = "knn",
tuneGrid = hiperparametros,
metric = "Accuracy",
trControl = cross_val
)
Confusion Matrix and Statistics
Predicho
Real 0 1
0 5 10
1 5 14
Accuracy : 0.5588
95% CI : (0.3789, 0.7281)
No Information Rate : 0.7059
P-Value [Acc > NIR] : 0.9777
Kappa : 0.0727
Mcnemar's Test P-Value : 0.3017
Sensitivity : 0.5833
Specificity : 0.5000
Pos Pred Value : 0.7368
Neg Pred Value : 0.3333
Prevalence : 0.7059
Detection Rate : 0.4118
Detection Prevalence : 0.5588
Balanced Accuracy : 0.5417
'Positive' Class : 1
usekernel
: TRUE
para utilizar un kernel que estime la densidad o FALSE
para asumir una función de densidad gaussiana.fL
: fL = 1
para aplicar el factor de corrección de Laplace. De utilidad cuando se tienen eventos o conjuntos vacios, es decir, ausencia de información que impide el cálculo de probabilidades de manera correcta.adjust
: parámetro que hace parte de la función density()
en caso de usekernel = TRUE
.# Paralelización del proceso
library(doMC)
library(parallel)
registerDoMC(cores = detectCores())
# Submuestras y repeticiones
particiones <- 10
repeticiones <- 10
# Definiendo hiperparámetro k
hiperparametros <- data.frame(usekernel = FALSE, fL = 0 , adjust = 0)
# Semillas
set.seed(123)
seeds <- vector(mode = "list", length = (particiones * repeticiones) + 1)
for (i in 1:(particiones * repeticiones)) {
seeds[[i]] <- sample.int(1000, nrow(hiperparametros))
}
seeds[[(particiones * repeticiones) + 1]] <- sample.int(1000, 1)
# Control de entrenamiento
cross_val <- trainControl(
method = "repeatedcv",
number = particiones,
repeats = repeticiones,
returnResamp = "final",
verboseIter = FALSE,
allowParallel = TRUE,
seeds = seeds
)
# Ajuste del modelo (entrenamiento)
set.seed(1000)
mod_bayes <- train(
Classification ~ .,
data = df_train,
method = "nb",
tuneGrid = hiperparametros,
metric = "Accuracy",
trControl = cross_val
)
Confusion Matrix and Statistics
Predicho
Real 0 1
0 1 14
1 4 15
Accuracy : 0.4706
95% CI : (0.2978, 0.6487)
No Information Rate : 0.8529
P-Value [Acc > NIR] : 1.00000
Kappa : -0.1547
Mcnemar's Test P-Value : 0.03389
Sensitivity : 0.51724
Specificity : 0.20000
Pos Pred Value : 0.78947
Neg Pred Value : 0.06667
Prevalence : 0.85294
Detection Rate : 0.44118
Detection Prevalence : 0.55882
Balanced Accuracy : 0.35862
'Positive' Class : 1
# Paralelización del proceso
library(doMC)
library(parallel)
registerDoMC(cores = detectCores())
# Submuestras y repeticiones
particiones <- 10
repeticiones <- 10
# Definiendo hiperparámetro k
hiperparametros <- data.frame(parameter = "none")
# Semillas
set.seed(123)
seeds <- vector(mode = "list", length = (particiones * repeticiones) + 1)
for (i in 1:(particiones * repeticiones)) {
seeds[[i]] <- sample.int(1000, nrow(hiperparametros))
}
seeds[[(particiones * repeticiones) + 1]] <- sample.int(1000, 1)
# Control de entrenamiento
cross_val <- trainControl(
method = "repeatedcv",
number = particiones,
repeats = repeticiones,
returnResamp = "final",
verboseIter = FALSE,
allowParallel = TRUE,
seeds = seeds
)
# Ajuste del modelo (entrenamiento)
set.seed(1000)
mod_regl <- train(
Classification ~ .,
data = df_train,
method = "glm",
tuneGrid = hiperparametros,
metric = "Accuracy",
trControl = cross_val
)
Confusion Matrix and Statistics
Predicho
Real 0 1
0 8 7
1 2 17
Accuracy : 0.7353
95% CI : (0.5564, 0.8712)
No Information Rate : 0.7059
P-Value [Acc > NIR] : 0.4355
Kappa : 0.4436
Mcnemar's Test P-Value : 0.1824
Sensitivity : 0.7083
Specificity : 0.8000
Pos Pred Value : 0.8947
Neg Pred Value : 0.5333
Prevalence : 0.7059
Detection Rate : 0.5000
Detection Prevalence : 0.5588
Balanced Accuracy : 0.7542
'Positive' Class : 1
CART
: algoritmo original de Leo Breiman.ID3
, C4.5
y C5.0
. Todos desarrollados por Ross Quinlan.# Paralelización del proceso
library(doMC)
library(parallel)
registerDoMC(cores = detectCores())
# Submuestras y repeticiones
particiones <- 10
repeticiones <- 10
# Definiendo hiperparámetro k
hiperparametros <- data.frame(parameter = "none")
# Semillas
set.seed(123)
seeds <- vector(mode = "list", length = (particiones * repeticiones) + 1)
for (i in 1:(particiones * repeticiones)) {
seeds[[i]] <- sample.int(1000, nrow(hiperparametros))
}
seeds[[(particiones * repeticiones) + 1]] <- sample.int(1000, 1)
# Control de entrenamiento
cross_val <- trainControl(
method = "repeatedcv",
number = particiones,
repeats = repeticiones,
returnResamp = "final",
verboseIter = FALSE,
allowParallel = TRUE,
seeds = seeds
)
# Ajuste del modelo (entrenamiento)
set.seed(1000)
mod_c5tree <- train(
Classification ~ .,
data = df_train,
method = "C5.0Tree",
tuneGrid = hiperparametros,
metric = "Accuracy",
trControl = cross_val
)
Confusion Matrix and Statistics
Predicho
Real 0 1
0 5 10
1 3 16
Accuracy : 0.6176
95% CI : (0.4356, 0.7783)
No Information Rate : 0.7647
P-Value [Acc > NIR] : 0.98311
Kappa : 0.1845
Mcnemar's Test P-Value : 0.09609
Sensitivity : 0.6154
Specificity : 0.6250
Pos Pred Value : 0.8421
Neg Pred Value : 0.3333
Prevalence : 0.7647
Detection Rate : 0.4706
Detection Prevalence : 0.5588
Balanced Accuracy : 0.6202
'Positive' Class : 1
randomForest
o ranger
. El método ranger
posee tres hiperparámetros controlables:
mtry
: número de predictores seleccionados aleatoriamente en cada árbol.min.node.size
: tamaño mínimo que debe tener un nodo para ser dividido.splitrule
: criterio de división (por defecto gini).# Paralelización del proceso
library(doMC)
library(parallel)
registerDoMC(cores = detectCores())
# Submuestras y repeticiones
particiones <- 10
repeticiones <- 10
# Definiendo hiperparámetro k
hiperparametros <- expand.grid(mtry = seq(1, 9, 1),
min.node.size = seq(1, 30, 2),
splitrule = "gini")
# Semillas
set.seed(123)
seeds <- vector(mode = "list", length = (particiones * repeticiones) + 1)
for (i in 1:(particiones * repeticiones)) {
seeds[[i]] <- sample.int(1000, nrow(hiperparametros))
}
seeds[[(particiones * repeticiones) + 1]] <- sample.int(1000, 1)
# Control de entrenamiento
cross_val <- trainControl(
method = "repeatedcv",
number = particiones,
repeats = repeticiones,
returnResamp = "final",
verboseIter = FALSE,
allowParallel = TRUE,
seeds = seeds
)
# Ajuste del modelo (entrenamiento)
set.seed(1000)
mod_rf <- train(
Classification ~ .,
data = df_train,
method = "ranger",
tuneGrid = hiperparametros,
metric = "Accuracy",
trControl = cross_val,
num.trees = 500
)
Confusion Matrix and Statistics
Predicho
Real 0 1
0 8 7
1 4 15
Accuracy : 0.6765
95% CI : (0.4947, 0.8261)
No Information Rate : 0.6471
P-Value [Acc > NIR] : 0.4358
Kappa : 0.3297
Mcnemar's Test P-Value : 0.5465
Sensitivity : 0.6818
Specificity : 0.6667
Pos Pred Value : 0.7895
Neg Pred Value : 0.5333
Prevalence : 0.6471
Detection Rate : 0.4412
Detection Prevalence : 0.5588
Balanced Accuracy : 0.6742
'Positive' Class : 1
ksvm()
del paquete kernlab
que implementa caret
son los siguientes:
sigma
: coeficiente del kernel radial.C
: penalización para margen de hiperplano.# Paralelización del proceso
library(doMC)
library(parallel)
registerDoMC(cores = detectCores())
# Submuestras y repeticiones
particiones <- 10
repeticiones <- 10
# Definiendo hiperparámetro k
hiperparametros <- expand.grid(sigma = c(0.001, 0.01, seq(0.1, 1, 0.1)),
C = seq(1, 1000, 20))
# Semillas
set.seed(123)
seeds <- vector(mode = "list", length = (particiones * repeticiones) + 1)
for (i in 1:(particiones * repeticiones)) {
seeds[[i]] <- sample.int(1000, nrow(hiperparametros))
}
seeds[[(particiones * repeticiones) + 1]] <- sample.int(1000, 1)
# Control de entrenamiento
cross_val <- trainControl(
method = "repeatedcv",
number = particiones,
repeats = repeticiones,
returnResamp = "final",
verboseIter = FALSE,
allowParallel = TRUE,
seeds = seeds
)
# Ajuste del modelo (entrenamiento)
set.seed(1000)
mod_svm <- train(
Classification ~ .,
data = df_train,
method = "svmRadial",
tuneGrid = hiperparametros,
metric = "Accuracy",
trControl = cross_val
)
Confusion Matrix and Statistics
Predicho
Real 0 1
0 10 5
1 5 14
Accuracy : 0.7059
95% CI : (0.5252, 0.849)
No Information Rate : 0.5588
P-Value [Acc > NIR] : 0.0582
Kappa : 0.4035
Mcnemar's Test P-Value : 1.0000
Sensitivity : 0.7368
Specificity : 0.6667
Pos Pred Value : 0.7368
Neg Pred Value : 0.6667
Prevalence : 0.5588
Detection Rate : 0.4118
Detection Prevalence : 0.5588
Balanced Accuracy : 0.7018
'Positive' Class : 1
gbm()
del paquete gmb
. El algoritmo tiene 6 hiperparámetros a tener en cuenta:
n.trees
: número de iteraciones del algoritmo. Es el número de modelos que conforma el ensemble.iteration.depth
: complejidad de los árboles empleados como weak learner.shrinkage
: tasa de aprendizaje (learning rate) que controla la influencia que tiene cada modelo individual sobre el conjunto de modelos (ensemble).n.minobsinnode
: número mínimo de observaciones que debe tener un nodo para poder ser dividido.distribution
: determina la función de coste (loss function).
bag.fraction
: submuestra del conjunto de entrenamiento utilizado para ajustar los weak learner. Si el valor es igual a \(1\) se emplea el algoritmo Gradient Boosting. Por defecto la función está con valor de 0.5
, implementando el algoritmo Stochastic Gradient Boosting
.# Paralelización del proceso
library(doMC)
library(parallel)
registerDoMC(cores = detectCores())
# Submuestras y repeticiones
particiones <- 10
repeticiones <- 10
# Definiendo hiperparámetro k
hiperparametros <- expand.grid(interaction.depth = c(1, 3, 5),
n.trees = seq(50, 1000, 100),
shrinkage = c(0.0001, 0.001, 0.01, 0.1, 1),
n.minobsinnode = c(2, 5, 10, 15))
# Semillas
set.seed(123)
seeds <- vector(mode = "list", length = (particiones * repeticiones) + 1)
for (i in 1:(particiones * repeticiones)) {
seeds[[i]] <- sample.int(1000, nrow(hiperparametros))
}
seeds[[(particiones * repeticiones) + 1]] <- sample.int(1000, 1)
# Control de entrenamiento
cross_val <- trainControl(
method = "repeatedcv",
number = particiones,
repeats = repeticiones,
returnResamp = "final",
verboseIter = FALSE,
allowParallel = TRUE,
seeds = seeds
)
# Ajuste del modelo (entrenamiento)
set.seed(1000)
mod_gbm <- train(
Classification ~ .,
data = df_train,
method = "gbm",
tuneGrid = hiperparametros,
metric = "Accuracy",
trControl = cross_val,
distribution = "bernoulli",
verbose = FALSE
)
Confusion Matrix and Statistics
Predicho
Real 0 1
0 5 10
1 5 14
Accuracy : 0.5588
95% CI : (0.3789, 0.7281)
No Information Rate : 0.7059
P-Value [Acc > NIR] : 0.9777
Kappa : 0.0727
Mcnemar's Test P-Value : 0.3017
Sensitivity : 0.5833
Specificity : 0.5000
Pos Pred Value : 0.7368
Neg Pred Value : 0.3333
Prevalence : 0.7059
Detection Rate : 0.4118
Detection Prevalence : 0.5588
Balanced Accuracy : 0.5417
'Positive' Class : 1
keras
# Modelo secuencial: load
mod_keras <- keras_model_sequential()
# Añadiendo capas: configuración del modelo
mod_keras %>%
layer_dense(units = 9, activation = "relu", input_shape = c(9)) %>%
layer_batch_normalization() %>%
layer_dropout(rate = 0.2) %>%
layer_dense(units = 9, activation = "relu") %>%
layer_batch_normalization() %>%
layer_dense(units = 9, activation = "relu") %>%
layer_batch_normalization() %>%
layer_dense(units = 2, activation = "sigmoid")
# Compilando el modelo
mod_keras %>%
compile(loss = "binary_crossentropy",
optimizer = optimizer_rmsprop(),
metrics = "accuracy")
# Ajuste del modelo
mod_nnet <- mod_keras %>%
fit(x_train,
y_train,
epochs = 200,
batch_size = 8,
validation_split = 0.2,
verbose = FALSE)
Confusion Matrix and Statistics
Predicho
Real 0 1
0 14 1
1 8 11
Accuracy : 0.7353
95% CI : (0.5564, 0.8712)
No Information Rate : 0.6471
P-Value [Acc > NIR] : 0.1859
Kappa : 0.4883
Mcnemar's Test P-Value : 0.0455
Sensitivity : 0.9167
Specificity : 0.6364
Pos Pred Value : 0.5789
Neg Pred Value : 0.9333
Prevalence : 0.3529
Detection Rate : 0.3235
Detection Prevalence : 0.5588
Balanced Accuracy : 0.7765
'Positive' Class : 1