7 Modelos de regularización
7.1 Introducción
En este capítulo, exploraremos los modelos de regularización (y el concepto de regresión penalizada), que es una técnica poderosa para lidiar con el sobreajuste en modelos de aprendizaje automático. El sobreajuste ocurre cuando un modelo se ajusta demasiado bien a los datos de entrenamiento pero tiene un rendimiento deficiente en datos no vistos. La regularización es un método que introduce un término de penalización en la función de pérdida del modelo para evitar el sobreajuste. A grandes rasgos podemos resumir que
Hay dos tipos comunes de regularización utilizados en la regresión penalizada:
Regularización L1 (Regresión Lasso): Agrega el valor absoluto de los coeficientes como término de penalización a la función de pérdida.
Regularización L2 (Regresión Ridge): Agrega el cuadrado de los coeficientes como término de penalización a la función de pérdida.
La regularización ridge es suave y la regularización lasso es áspera tal y como se puede ver en la siguiente figura
Es esta diferencia entre las restricciones suaves y ásperas lo que resulta en que el Lasso tenga estimaciones de coeficientes que son exactamente cero, mientras que Ridge no lo hace. Ilustramos esto aún más en la siguiente figura. La solución de mínimos cuadrados se marca como \(\hat{\beta}\), mientras que el diamante azul y el círculo representan las restricciones de regresión Lasso y Ridge (como en la Figura anterior). Si la penalización (\(t\) en la figura anterior) es lo suficientemente grande (aumentar la penalización hace que el diamante y el círculo sean más grandes, respectivamente), entonces las regiones de restricción contendrán a \(\hat{\beta}\), por lo que las estimaciones de Ridge y Lasso serán iguales a las estimaciones de mínimos cuadrados.
Las curvas que están centradas alrededor de \(\hat{\beta}\) representan regiones de RSS constante. A medida que las elipses se alejan de las estimaciones de coeficientes de mínimos cuadrados, el RSS aumenta. Las estimaciones de coeficientes de regresión Lasso y Ridge se dan en el primer punto en el que una elipse toca la región de restricción. Podemos observar como la estimación de \(\beta_2\) sería diferente para la Ridge regression.
La regularización proporciona varios beneficios:
- Ayuda a prevenir el sobreajuste al reducir la complejidad del modelo.
- Mejora la generalización, lo que hace que el modelo tenga un mejor rendimiento en datos no vistos.
- Puede realizar automáticamente la selección de características al establecer algunos coeficientes en cero.
Regularización L1 (Regresión Lasso) La regresión Lasso agrega la suma de los valores absolutos de los coeficientes como término de penalización a la función de pérdida. Esta penalización fomenta que algunos coeficientes sean exactamente cero, lo que efectivamente realiza la selección de características.
7.2 Cómo regularizar
El procedimiento habitual para ajustar un modelo de regresión lineal es emplear mínimos cuadrados, es decir, utilizar como criterio de error la suma de cuadrados residual
\[\mbox{RSS} = \sum\limits_{i=1}^{n}\left( y_{i} - \beta_0 - \boldsymbol{\beta}^t \mathbf{x}_{i} \right)^{2}\]
Si el modelo lineal es razonablemente adecuado, utilizar RSS va a dar lugar a estimaciones con poco sesgo, y si además \(n\gg p\), entonces el modelo también va a tener poca varianza. Las dificultades surgen cuando \(p\) es grande o cuando hay correlaciones altas entre las variables predictoras: tener muchas variables dificulta la interpretación del modelo, y si además hay problemas de colinealidad o se incumple \(n\gg p\), entonces la estimación del modelo va a tener muchas varianza y el modelo estará sobreajustado. La solución pasa por forzar a que el modelo tenga menos complejidad para así reducir su varianza. Una forma de conseguirlo es mediante la regularización (regularization o shrinkage) de la estimación de los parámetros \(\beta_1, \beta_2,\ldots, \beta_p\) que consiste en considerar todas las variables predictoras pero forzando a que algunos de los parámetros se estimen mediante valores muy próximos a cero, o directamente con ceros. Esta técnica va a provocar un pequeño aumento en el sesgo pero a cambio una notable reducción en la varianza y una interpretación más sencilla del modelo resultante.
Como ya hemos anticipado, hay dos formas básicas de lograr esta simplificación de los parámetros (con la consiguiente simplificación del modelo), utilizando una penalización cuadrática (norma \(L_2\)) o en valor absoluto (norma \(L_1\)):
Hay dos formas básicas de lograr esta simplificación de los parámetros (con la consiguiente simplificación del modelo), utilizando una penalización cuadrática (norma \(L_2\)) o en valor absoluto (norma \(L_1\)):
Ridge regression \[\mbox{min}_{\beta_0, \boldsymbol{\beta}} \mbox{RSS} + \lambda\sum_{j=1}^{p}\beta_{j}^{2}\]
Equivalentemente, \[\mbox{min}_{\beta_0, \boldsymbol{\beta}} \mbox{RSS}\] sujeto a \[\sum_{j=1}^{p}\beta_{j}^{2} \le s\]
Lasso [least absolute shrinkage and selection operator] \[\mbox{min}_{\beta_0, \boldsymbol{\beta}} RSS + \lambda\sum_{j=1}^{p}|\beta_{j}|\]
Equivalentemente, \[\mbox{min}_{\beta_0, \boldsymbol{\beta}} \mbox{RSS}\] sujeto a \[\sum_{j=1}^{p}|\beta_{j}| \le s\]
Una formulación unificada consiste en considerar el problema \[\mbox{min}_{\beta_0, \boldsymbol{\beta}} RSS + \lambda\sum_{j=1}^{p}|\beta_{j}|^d\]
Si \(d=0\), la penalización consiste en el número de variables utilizadas, por tanto se corresponde con el problema de selección de variables; \(d=1\) se corresponde con lasso y \(d=2\) con ridge.
La ventaja de utilizar lasso es que va a forzar a que algunos parámetros sean cero, con lo cual también se realiza una selección de las variables más influyentes. Por el contrario, ridge regression va a incluir todas las variables predictoras en el modelo final, si bien es cierto que algunas con parámetros muy próximos a cero: de este modo va a reducir el riesgo del sobreajuste, pero no resuelve el problema de la interpretabilidad. Otra posible ventaja de utilizar lasso es que cuando hay variables predictoras correlacionadas tiene tendencia a seleccionar una y anular las demás (esto también se puede ver como un inconveniente, ya que pequeños cambios en los datos pueden dar lugar a distintos modelos), mientras que ridge tiende a darles igual peso.
Una generalización de lasso muy utilizada en ciencias ómicas es elastic net que combina las ventajas de ridge y lasso, minimizando \[\mbox{min}_{\beta_0, \boldsymbol{\beta}} \ \mbox{RSS} + \lambda \left( \frac{1 - \alpha}{2}\sum_{j=1}^{p}\beta_{j}^{2} + \alpha \sum_{j=1}^{p}|\beta_{j}| \right)\] con \(0 \leq \alpha \leq 1\).
IMPORTANTE: Es crucial estandarizar (centrar y reescalar) las variables predictoras antes de realizar estas técnicas. Fijémonos en que, así como \(\mbox{RSS}\) es insensible a los cambios de escala, la penalización es muy sensible. Previa estandarización, el término independiente \(\beta_0\) (que no interviene en la penalización) tiene una interpretación muy directa, ya que \[\widehat \beta_0 = \bar y =\sum_{i=1}^n \frac{y_i}{n}\]
Los dos métodos de regularización comentados dependen del hiperparámetro \(\lambda\) (equivalentemente, \(s\)). Como en cualquier otro método de aprendizaje automático, es muy importante seleccionar adecuadamente el valor del hiperparámetro. Un método que podemos usar es, por ejemplo, validación cruzada. Hay algoritmos muy eficientes que permiten el ajuste, tanto de ridge regression como de lasso de forma conjunta (simultánea) para todos los valores de \(\lambda\).
7.3 Implementación en R
Hay varios paquetes que implementan estos métodos: h2o
, elasticnet
, penalized
, lasso2
, biglasso
, etc., pero el paquete glmnet
(https://glmnet.stanford.edu)` es el más usado y tiene una implementación muy eficiente (tener el cuenta que la minimización puede ser costosa computacionalmente)
library(glmnet)
El paquete glmnet
no emplea formulación de modelos (es decir, no usa el simbolo ‘~’), hay que establecer la respuesta y
y la matriz numérica x
correspondiente a las variables explicativas.
Por tanto no se pueden incluir directamente predictores categóricos, habrá que codificarlos empleando variables auxiliares numéricas. Se puede emplear la función model.matrix()
(o Matrix::sparse.model.matrix()
si el conjunto de datos es muy grande) para construir la matriz de diseño x
a partir de una fórmula (alternativamente se pueden emplear la herramientas implementadas en el paquete caret
). Además, esta función tampoco admite datos faltantes.
La función principal es:
glmnet(x, y, family, alpha = 1, lambda = NULL, ...)
family
: familia del modelo lineal generalizado; por defecto"gaussian"
(modelo lineal con ajuste cuadrático), también admite"binomial"
,"poisson"
,"multinomial"
,"cox"
o"mgaussian"
(modelo lineal con respuesta multivariante).alpha
: parámetro \(\alpha\) de elasticnet \(0 \leq \alpha \leq 1\). Por defectoalpha = 1
penalización lasso (alpha = 0
para ridge regression).lambda
: secuencia (opcional) de valores de \(\lambda\); si no se especifica se establece una secuencia por defecto (en base a los argumentos adicionalesnlambda
ylambda.min.ratio
). Se devolverán los ajustes para todos los valores de esta secuencia (también se podrán obtener posteriormente para otros valores).
Entre los métodos genéricos disponibles del objeto resultante, coef()
y predict()
permiten obtener los coeficientes y las predicciones para un valor concreto de \(\lambda\), que se debe especificar mediante el argumento s = valor
(los autores usan s
en vez de lambda
ya que inicialmente usaban ese nombre).
El valor “óptimo” del hiperparámetro \(\lambda\) se puede calcular mediante validación cruzada con la siguiente instrucción:
cv.glmnet(x, y, family, alpha, lambda, type.measure = "default", nfolds = 10, ...)
Esta función también devuelve los ajustes con toda la muestra de entrenamiento (en la componente $glmnet.fit
) y se puede emplear el resultado directamente para predecir o obtener los coeficientes del modelo. Por defecto, selecciona \(\lambda\) mediante la regla de “un error estándar” (componente $lambda.1se
), aunque también calcula el valor óptimo (componente $lambda.min
; que se puede seleccionar con estableciendo s = "lambda.min"
). Para más detalles consultar la vignette del paquete An Introduction to glmnet.
Para ilustrar cómo llevar a cabo estos análisis utilizaremos los datos de cáncer de mama que ya hemos trabajado en el capítulo de preproceso de datos. Este ejemplo tiene mucho sentido (aunque no se cumpla que \(p \gg n\)) ya que también existe mucha correlación entre las variables dependientes, que es un caso donde también se suele utilizar estos modelos.
Los datos ya pre-procesados se pueden cargar de la siguiente manera (nota, yo uso “data” porque están en ese directorio en mi ordenador):
load("data/breast.Rdata")
Ahora debemos extraer la matriz de datos \(x\) (variables independientes) y el vector con la variable que queremos predecir \(y\) (outcome). Recordemos que las variables son las siguientes:
names(breast_train_prep)
[1] "texture_mean" "area_mean" "smoothness_mean"
[4] "compactness_mean" "symmetry_mean" "fractal_dimension_mean"
[7] "texture_se" "area_se" "smoothness_se"
[10] "compactness_se" "concavity_se" "concave points_se"
[13] "symmetry_se" "fractal_dimension_se" "smoothness_worst"
[16] "compactness_worst" "concave points_worst" "symmetry_worst"
[19] "fractal_dimension_worst" "diagnosis"
<- as.matrix(breast_train_prep[, -ncol(breast_train_prep)])
x <- breast_train_prep$diagnosis y
También podemos extraer x de forma más “clara” con tidyverse
<- breast_train_prep %>% select(-diagnosis) %>% as.matrix() x
o usando el diseño del modelo sin el intercept (nota: en vez de ‘.’ se pueden poner el nombre de las variables predictoras)
<- model.matrix(diagnosis ~ - 1 + . , data=breast_train_prep) x
7.3.1 Ejemplo: Ridge Regression
Ajustamos los modelos de regresión ridge (con la secuencia de valores de \(\lambda\) por defecto) con la función glmnet()
con alpha=0
(ridge penalty) y la opción family = binomial
porque estamos ante un problema de clasificación binaria:
library(glmnet)
<- glmnet(x, y, alpha = 0, family = binomial)
fit.ridge plot(fit.ridge, xvar = "lambda", label = TRUE)
Podemos obtener el modelo o predicciones para un valor concreto de \(\lambda\):
coef(fit.ridge, s = 2) # lambda = 2
20 x 1 sparse Matrix of class "dgCMatrix"
s1
(Intercept) -0.5555635957
texture_mean 0.0735405177
area_mean 0.1206458718
smoothness_mean 0.0413289772
compactness_mean 0.0815272858
symmetry_mean 0.0433533589
fractal_dimension_mean -0.0226349104
texture_se -0.0062811918
area_se 0.0911190933
smoothness_se -0.0165352515
compactness_se 0.0342444176
concavity_se 0.0449677702
`concave points_se` 0.0603394789
symmetry_se -0.0114723777
fractal_dimension_se 0.0003898276
smoothness_worst 0.0591408831
compactness_worst 0.0844100996
`concave points_worst` 0.1249016680
symmetry_worst 0.0631948865
fractal_dimension_worst 0.0395917038
Para seleccionar el parámetro de penalización por validación cruzada empleamos cv.glmnet()
(usamos la semilla para que sea reproducible en cualquier ordenador):
set.seed(12345)
<- cv.glmnet(x, y, alpha = 0, family = "binomial")
cv.ridge plot(cv.ridge)
En este caso el parámetro óptimo (según la regla de un error estándar) sería:
$lambda.1se cv.ridge
[1] 0.05646944
# cv.ridge$lambda.min
y el correspondiente modelo contiene todas las variables explicativas:
coef(cv.ridge) # s = "lambda.1se"
20 x 1 sparse Matrix of class "dgCMatrix"
s1
(Intercept) -0.72707742
texture_mean 0.51292464
area_mean 0.79924145
smoothness_mean 0.10549462
compactness_mean 0.26016484
symmetry_mean 0.09346757
fractal_dimension_mean -0.34641170
texture_se -0.01697213
area_se 0.59895989
smoothness_se -0.06167636
compactness_se -0.05639525
concavity_se 0.14078849
`concave points_se` 0.21961982
symmetry_se -0.14877280
fractal_dimension_se -0.17141822
smoothness_worst 0.27744261
compactness_worst 0.32579681
`concave points_worst` 0.68781501
symmetry_worst 0.36925943
fractal_dimension_worst 0.15699353
# coef(cv.ridge, s = "lambda.min")
Finalmente evaluamos la precisión en la muestra de test:
<- breast_test_prep %>% select(-diagnosis) %>% as.matrix()
newx <- predict(cv.ridge, newx = newx, type = "class") # s = "lambda.1se"
pred
# es necesario poner `pred` como un vector
<- table(as.vector(pred), breast_test_prep$diagnosis)
xtab
::confusionMatrix(xtab) caret
Confusion Matrix and Statistics
B M
B 105 6
M 2 57
Accuracy : 0.9529
95% CI : (0.9094, 0.9795)
No Information Rate : 0.6294
P-Value [Acc > NIR] : <2e-16
Kappa : 0.8978
Mcnemar's Test P-Value : 0.2888
Sensitivity : 0.9813
Specificity : 0.9048
Pos Pred Value : 0.9459
Neg Pred Value : 0.9661
Prevalence : 0.6294
Detection Rate : 0.6176
Detection Prevalence : 0.6529
Balanced Accuracy : 0.9430
'Positive' Class : B
7.3.2 Ejemplo: Lasso
También podríamos ajustar modelos lasso con la opción por defecto de glmnet()
(alpha = 1
, lasso penalty).
Pero en este caso lo haremos al mismo tiempo que seleccionamos el parámetro de penalización por validación cruzada:
set.seed(12345)
<- cv.glmnet(x, y, family = "binomial")
cv.lasso plot(cv.lasso)
plot(cv.lasso$glmnet.fit, xvar = "lambda", label = TRUE)
abline(v = log(cv.lasso$lambda.1se), lty = 2)
abline(v = log(cv.lasso$lambda.min), lty = 3)
El modelo resultante (oneSE rule) solo contiene 9 variables explicativas:
coef(cv.lasso) # s = "lambda.1se"
20 x 1 sparse Matrix of class "dgCMatrix"
s1
(Intercept) -0.55527533
texture_mean 0.89281924
area_mean 2.06965054
smoothness_mean .
compactness_mean .
symmetry_mean .
fractal_dimension_mean .
texture_se .
area_se 1.30248883
smoothness_se .
compactness_se -0.02882114
concavity_se .
`concave points_se` .
symmetry_se -0.08721175
fractal_dimension_se -0.01522821
smoothness_worst 0.28720064
compactness_worst .
`concave points_worst` 2.01615906
symmetry_worst 0.66553914
fractal_dimension_worst .
Por tanto este método también podría ser empleando para la selección de variables (puede hacerse automáticamente estableciendo relax = TRUE
, ajustará los modelos sin regularización).
Finalmente evaluamos también la precisión en la muestra de test:
<- predict(cv.lasso, newx = newx, type = "class")
pred <- table(as.vector(pred), breast_test_prep$diagnosis)
xtab
::confusionMatrix(xtab) caret
Confusion Matrix and Statistics
B M
B 105 4
M 2 59
Accuracy : 0.9647
95% CI : (0.9248, 0.9869)
No Information Rate : 0.6294
P-Value [Acc > NIR] : <2e-16
Kappa : 0.9238
Mcnemar's Test P-Value : 0.6831
Sensitivity : 0.9813
Specificity : 0.9365
Pos Pred Value : 0.9633
Neg Pred Value : 0.9672
Prevalence : 0.6294
Detection Rate : 0.6176
Detection Prevalence : 0.6412
Balanced Accuracy : 0.9589
'Positive' Class : B
Podemos observar que lo hace mejor que el modelo Ridge que tiene más sobreajuste.
7.3.3 Ejemplo: Elastic Net
Podemos ajustar modelos elastic net para un valor concreto de alpha
empleando la función glmnet()
, pero las opciones del paquete no incluyen la selección de este hiperparámetro.
Aunque se podría implementar fácilmente (como se muestra en help(cv.glmnet)
), resulta mucho más cómodo emplear el método "glmnet"
de caret
(NOTA: en este caso no hace falta indicarle `family = binomial” ya que le pasamos una variable factor como variable respuesta):
library(caret)
modelLookup("glmnet")
model parameter label forReg forClass probModel
1 glmnet alpha Mixing Percentage TRUE TRUE TRUE
2 glmnet lambda Regularization Parameter TRUE TRUE TRUE
set.seed(12345)
# Se podría emplear train(fidelida ~ ., data = train, ...)
<- train(x, y, method = "glmnet",
caret.glmnet trControl = trainControl(method = "cv", number = 10),
tuneGrid = expand.grid(
.alpha = seq(0, 1, length.out = 10), # optimize an elnet regression
.lambda = seq(0, 0.2, length.out = 20)
))
caret.glmnet
glmnet
399 samples
19 predictor
2 classes: 'B', 'M'
No pre-processing
Resampling: Cross-Validated (10 fold)
Summary of sample sizes: 359, 359, 359, 360, 359, 359, ...
Resampling results across tuning parameters:
alpha lambda Accuracy Kappa
0.0000000 0.00000000 0.9575000 0.9070474
0.0000000 0.01052632 0.9575000 0.9070474
0.0000000 0.02105263 0.9575000 0.9070474
0.0000000 0.03157895 0.9575000 0.9070474
0.0000000 0.04210526 0.9575000 0.9070474
0.0000000 0.05263158 0.9500000 0.8905369
0.0000000 0.06315789 0.9475000 0.8846684
0.0000000 0.07368421 0.9475000 0.8840697
0.0000000 0.08421053 0.9475000 0.8840697
0.0000000 0.09473684 0.9475000 0.8840697
0.0000000 0.10526316 0.9424359 0.8731520
0.0000000 0.11578947 0.9399359 0.8671269
0.0000000 0.12631579 0.9399359 0.8671269
0.0000000 0.13684211 0.9374359 0.8617234
0.0000000 0.14736842 0.9349359 0.8561699
0.0000000 0.15789474 0.9349359 0.8561699
0.0000000 0.16842105 0.9349359 0.8561699
0.0000000 0.17894737 0.9349359 0.8561699
0.0000000 0.18947368 0.9299359 0.8444259
0.0000000 0.20000000 0.9274359 0.8387244
0.1111111 0.00000000 0.9675000 0.9300161
0.1111111 0.01052632 0.9750000 0.9457920
0.1111111 0.02105263 0.9575000 0.9070474
0.1111111 0.03157895 0.9550000 0.9011875
0.1111111 0.04210526 0.9500000 0.8902304
0.1111111 0.05263158 0.9475000 0.8840697
0.1111111 0.06315789 0.9475000 0.8840697
0.1111111 0.07368421 0.9475000 0.8840697
0.1111111 0.08421053 0.9449359 0.8784093
0.1111111 0.09473684 0.9449359 0.8784093
0.1111111 0.10526316 0.9449359 0.8784093
0.1111111 0.11578947 0.9449359 0.8784093
0.1111111 0.12631579 0.9424359 0.8723842
0.1111111 0.13684211 0.9399359 0.8668307
0.1111111 0.14736842 0.9374359 0.8614272
0.1111111 0.15789474 0.9324359 0.8505967
0.1111111 0.16842105 0.9324359 0.8496833
0.1111111 0.17894737 0.9299359 0.8439755
0.1111111 0.18947368 0.9274359 0.8381070
0.1111111 0.20000000 0.9274359 0.8381070
0.2222222 0.00000000 0.9625000 0.9190533
0.2222222 0.01052632 0.9750000 0.9457920
0.2222222 0.02105263 0.9600000 0.9121584
0.2222222 0.03157895 0.9550000 0.9011875
0.2222222 0.04210526 0.9525000 0.8954917
0.2222222 0.05263158 0.9475000 0.8840697
0.2222222 0.06315789 0.9475000 0.8840697
0.2222222 0.07368421 0.9474359 0.8838147
0.2222222 0.08421053 0.9474359 0.8838147
0.2222222 0.09473684 0.9474359 0.8838147
0.2222222 0.10526316 0.9499359 0.8890778
0.2222222 0.11578947 0.9499359 0.8890778
0.2222222 0.12631579 0.9474359 0.8836724
0.2222222 0.13684211 0.9449359 0.8781189
0.2222222 0.14736842 0.9424359 0.8724112
0.2222222 0.15789474 0.9399359 0.8663861
0.2222222 0.16842105 0.9349359 0.8548098
0.2222222 0.17894737 0.9349359 0.8548098
0.2222222 0.18947368 0.9374359 0.8600412
0.2222222 0.20000000 0.9324359 0.8489281
0.3333333 0.00000000 0.9625000 0.9190533
0.3333333 0.01052632 0.9700000 0.9345266
0.3333333 0.02105263 0.9650000 0.9237261
0.3333333 0.03157895 0.9575000 0.9067571
0.3333333 0.04210526 0.9575000 0.9067571
0.3333333 0.05263158 0.9575000 0.9061517
0.3333333 0.06315789 0.9550000 0.9005982
0.3333333 0.07368421 0.9524359 0.8949378
0.3333333 0.08421053 0.9499359 0.8890778
0.3333333 0.09473684 0.9474359 0.8836724
0.3333333 0.10526316 0.9474359 0.8836724
0.3333333 0.11578947 0.9474359 0.8836724
0.3333333 0.12631579 0.9449359 0.8782670
0.3333333 0.13684211 0.9424359 0.8727135
0.3333333 0.14736842 0.9399359 0.8665406
0.3333333 0.15789474 0.9374359 0.8606720
0.3333333 0.16842105 0.9374359 0.8606720
0.3333333 0.17894737 0.9349359 0.8551185
0.3333333 0.18947368 0.9324359 0.8490823
0.3333333 0.20000000 0.9324359 0.8490823
0.4444444 0.00000000 0.9625000 0.9190533
0.4444444 0.01052632 0.9725000 0.9403866
0.4444444 0.02105263 0.9675000 0.9291315
0.4444444 0.03157895 0.9625000 0.9174256
0.4444444 0.04210526 0.9600000 0.9120202
0.4444444 0.05263158 0.9600000 0.9120202
0.4444444 0.06315789 0.9524359 0.8949378
0.4444444 0.07368421 0.9499359 0.8890778
0.4444444 0.08421053 0.9499359 0.8890778
0.4444444 0.09473684 0.9474359 0.8836724
0.4444444 0.10526316 0.9474359 0.8836724
0.4444444 0.11578947 0.9474359 0.8832072
0.4444444 0.12631579 0.9474359 0.8832072
0.4444444 0.13684211 0.9374359 0.8609871
0.4444444 0.14736842 0.9374359 0.8609871
0.4444444 0.15789474 0.9374359 0.8609871
0.4444444 0.16842105 0.9349359 0.8551185
0.4444444 0.17894737 0.9324359 0.8492500
0.4444444 0.18947368 0.9299359 0.8432138
0.4444444 0.20000000 0.9274359 0.8373452
0.5555556 0.00000000 0.9625000 0.9190533
0.5555556 0.01052632 0.9700000 0.9348331
0.5555556 0.02105263 0.9650000 0.9231334
0.5555556 0.03157895 0.9625000 0.9174256
0.5555556 0.04210526 0.9600000 0.9120202
0.5555556 0.05263158 0.9575000 0.9064667
0.5555556 0.06315789 0.9524359 0.8949464
0.5555556 0.07368421 0.9499359 0.8890778
0.5555556 0.08421053 0.9474359 0.8836724
0.5555556 0.09473684 0.9474359 0.8832072
0.5555556 0.10526316 0.9449359 0.8776537
0.5555556 0.11578947 0.9449359 0.8776537
0.5555556 0.12631579 0.9399359 0.8660774
0.5555556 0.13684211 0.9349359 0.8551185
0.5555556 0.14736842 0.9349359 0.8551185
0.5555556 0.15789474 0.9349359 0.8551185
0.5555556 0.16842105 0.9324359 0.8495650
0.5555556 0.17894737 0.9199359 0.8200478
0.5555556 0.18947368 0.9149359 0.8081288
0.5555556 0.20000000 0.9124359 0.8017349
0.6666667 0.00000000 0.9600000 0.9137920
0.6666667 0.01052632 0.9725000 0.9402385
0.6666667 0.02105263 0.9675000 0.9286869
0.6666667 0.03157895 0.9625000 0.9174256
0.6666667 0.04210526 0.9575000 0.9064667
0.6666667 0.05263158 0.9550000 0.9006068
0.6666667 0.06315789 0.9524359 0.8949464
0.6666667 0.07368421 0.9549359 0.9001890
0.6666667 0.08421053 0.9499359 0.8892301
0.6666667 0.09473684 0.9449359 0.8776537
0.6666667 0.10526316 0.9424359 0.8717852
0.6666667 0.11578947 0.9399359 0.8663798
0.6666667 0.12631579 0.9324359 0.8495650
0.6666667 0.13684211 0.9299359 0.8435288
0.6666667 0.14736842 0.9299359 0.8435288
0.6666667 0.15789474 0.9224359 0.8259163
0.6666667 0.16842105 0.9199359 0.8202085
0.6666667 0.17894737 0.9149359 0.8076035
0.6666667 0.18947368 0.9099359 0.7961880
0.6666667 0.20000000 0.9049359 0.7842832
0.7777778 0.00000000 0.9575000 0.9086749
0.7777778 0.01052632 0.9725000 0.9402385
0.7777778 0.02105263 0.9675000 0.9286869
0.7777778 0.03157895 0.9650000 0.9229791
0.7777778 0.04210526 0.9575000 0.9064667
0.7777778 0.05263158 0.9524359 0.8949464
0.7777778 0.06315789 0.9524359 0.8944812
0.7777778 0.07368421 0.9499359 0.8890758
0.7777778 0.08421053 0.9474359 0.8835223
0.7777778 0.09473684 0.9374359 0.8614375
0.7777778 0.10526316 0.9374359 0.8614375
0.7777778 0.11578947 0.9324359 0.8501824
0.7777778 0.12631579 0.9324359 0.8501824
0.7777778 0.13684211 0.9299359 0.8444747
0.7777778 0.14736842 0.9274359 0.8386061
0.7777778 0.15789474 0.9224359 0.8270298
0.7777778 0.16842105 0.9199359 0.8205370
0.7777778 0.17894737 0.9149359 0.8089607
0.7777778 0.18947368 0.9124359 0.8027495
0.7777778 0.20000000 0.9049359 0.7842832
0.8888889 0.00000000 0.9575000 0.9086749
0.8888889 0.01052632 0.9750000 0.9456439
0.8888889 0.02105263 0.9675000 0.9286869
0.8888889 0.03157895 0.9625000 0.9174256
0.8888889 0.04210526 0.9500000 0.8900863
0.8888889 0.05263158 0.9474359 0.8845420
0.8888889 0.06315789 0.9424359 0.8737368
0.8888889 0.07368421 0.9374359 0.8624851
0.8888889 0.08421053 0.9374359 0.8624851
0.8888889 0.09473684 0.9374359 0.8620488
0.8888889 0.10526316 0.9349359 0.8564953
0.8888889 0.11578947 0.9374359 0.8622030
0.8888889 0.12631579 0.9349359 0.8565014
0.8888889 0.13684211 0.9299359 0.8450921
0.8888889 0.14736842 0.9224359 0.8274950
0.8888889 0.15789474 0.9149359 0.8102110
0.8888889 0.16842105 0.9124359 0.8041747
0.8888889 0.17894737 0.9124359 0.8032061
0.8888889 0.18947368 0.9073718 0.7913259
0.8888889 0.20000000 0.9023718 0.7784392
1.0000000 0.00000000 0.9550000 0.9035657
1.0000000 0.01052632 0.9725000 0.9400904
1.0000000 0.02105263 0.9650000 0.9239989
1.0000000 0.03157895 0.9525000 0.8962252
1.0000000 0.04210526 0.9525000 0.8960710
1.0000000 0.05263158 0.9424359 0.8735983
1.0000000 0.06315789 0.9399359 0.8681929
1.0000000 0.07368421 0.9374359 0.8626394
1.0000000 0.08421053 0.9349359 0.8570859
1.0000000 0.09473684 0.9324359 0.8518433
1.0000000 0.10526316 0.9324359 0.8518433
1.0000000 0.11578947 0.9299359 0.8461418
1.0000000 0.12631579 0.9349359 0.8565014
1.0000000 0.13684211 0.9349359 0.8565014
1.0000000 0.14736842 0.9299359 0.8450921
1.0000000 0.15789474 0.9224359 0.8276472
1.0000000 0.16842105 0.9173718 0.8159432
1.0000000 0.17894737 0.9098718 0.7981742
1.0000000 0.18947368 0.8998077 0.7740354
1.0000000 0.20000000 0.8896795 0.7496070
Accuracy was used to select the optimal model using the largest value.
The final values used for the model were alpha = 0.1111111 and lambda = 0.01052632.
ggplot(caret.glmnet, highlight = TRUE)
<- predict(caret.glmnet$finalModel, newx,
pred type="class", s = caret.glmnet$finalModel$lambdaOpt)
<- table(as.vector(pred), breast_test_prep$diagnosis)
xtab ::confusionMatrix(xtab) caret
Confusion Matrix and Statistics
B M
B 104 3
M 3 60
Accuracy : 0.9647
95% CI : (0.9248, 0.9869)
No Information Rate : 0.6294
P-Value [Acc > NIR] : <2e-16
Kappa : 0.9243
Mcnemar's Test P-Value : 1
Sensitivity : 0.9720
Specificity : 0.9524
Pos Pred Value : 0.9720
Neg Pred Value : 0.9524
Prevalence : 0.6294
Detection Rate : 0.6118
Detection Prevalence : 0.6294
Balanced Accuracy : 0.9622
'Positive' Class : B
Observamos que alpha
está cerca de 1 (Lasso) y tiene un alpha
un poco mayor que al que se obtiene con la regresión Lasso, pero la matriz de confusión es la misma.