Ejercicio de regularización en R para predecir la dureza del hormigón

| Última modificación: 8 de julio de 2024 | Tiempo de Lectura: 3 minutos

Algunos de nuestros reconocimientos:

Premios KeepCoding

En este artículo realizaremos un ejercicio de regularización en R para predecir la dureza del hormigón. Para ponernos en contexto, debes saber que el hormigón es el material más importante en la ingeniería civil.

La resistencia a la compresión del hormigón es una función altamente no lineal de la edad e ingredientes. Estos ingredientes incluyen cemento, escoria de alto horno, cenizas volantes, agua, superplastificante, agregado grueso y agregado fino.

Desarrollo de ejercicio de regularización en R

Vamos a empezar con el ejercicio de regularización en R:

In [ ] : concrete <- read.csv ("data/Concrete_Data.csv",
col.names = c ("cemento", "escoria", "cenizas", "agua", "plastificante", "aggrueso", "agfino", "edad", "resistencia")
head (concrete)
ejercicio de regularización en R: tabla 1
In [ ] : options (repr.plot.height = 5, repr.plot.width = 8, repr.plot.res = 200)
GGally::ggpairs (concrete,
#lower = list (continuous = GGally::wrap ("density", alpha = 0.8, size = 0.2, color = "blue'))
lower = list (continuous = GGally::wrap ("points", alpha = 0.3, size = 0.1, color = "blue'))
)
ejercicio de regularización en R: gráfica 1
In [ ] : suppressPackageStartupMessages (library (tidyverse))
suppressPackageStartupMessages (library (glmnetUtils))
In [ ] : set.seed (12)
idx <- sample (1 : nrow (concrete), nrow (concrete) * 0.7)
concrete.train = concrete [idx, ]
concrete.test = concrete [- idx, ]

Regresión lineal

In [47] : Im_model <- lm (resistencia ~ 
cemento * escoria * agua * plastificante * aggrueso * agfino * edad cenizas, data = concrete.train)
Im_yp train <- predict (lm_model, concrete.train) caret::postResample (pred = lm_yp_train, obs = concrete.train$resistencia)
lm_yp_test <- predict (lm_model, concrete.test)
caret::postResample (pred = lm_yp_test, obs = concrete.test$resistencia)

Warning message in predict.lm (lm_model, concrete.train):

“prediction from a rank-deficient fit may be misleading”

RMSE: 5.54817427355096

Rsquared: 0.895541903423443

MAE: 4.27848492717393

Warning message in predict.Im (lm_model, concrete.test):

“prediction from a rank-deficient fit may be misleading”

RMSE: 11.6072399677266

Rsquared: 0.610930208024904

MAE: 7.59596108167767

Siguiendo con nuestro ejercicio de regularización en R, en este caso tenemos variables que provienen de diferentes unidades y tienen rangos muy diferentes de valores, por lo que para hacer los coeficientes comparables entre si, deberíamos estandarizarlos.

El resultado consiste en dejar nuestros datos con media O y varianza 1:

función

Esto lo realiza por sí solo el paquete gimnet o gimnetutils.

In [48] : cv <- glmnetUtils::cv.glmnet (formula = resistencia ~ cemento * escoria * cenizas * agua * plastificante * aggrueso * agfino * edad, data = concrete.train,
alpha = 1,
nfold = 10,
type.measure = "mse",
standardize = T)
ggplot (data.frame (lambda = cv$lambda, cross_validated_mean_error = cvscvm), aes (x = lambda, y = cross_validated_mean_error)) + geom_line()
paste0 ("El valor lambda con el menor error es:", cvslambda.min)
paste0 ("El valor lambda más alto que se encuentra a una distancia 1sd es:", cvslambda.Ise)
paste0 ("EL R ^ 2 estimado es", cv$glmnet.fit$dev.ratio [which (cv$glmnet.fit$lambda == cv$lambda.lse)])
ggplot (data.frame (lambda = cv$lambda, r2 = cv$glmnet.fit$dev.ratio), aes (x = lambda, y = r2)) + geom_line () + xlim (0,1)

El valor lambda con el menor error es: 0.0139192431806921

El valor lambda más alto que se encuentra a una distancia 1sd es: 0.524050568773559

El R ^ 2 estimado es: 0.739486340472894

Warning message:

“Removed 26 row (s) containing missing values (geom_path).”

ejercicio de regularización en R: gráfica 2
ejercicio de regularización en R: gráfica 3
In [49] : reg_yp_train <- predict (cv,
concrete.train,
s = cv$lambda.min)
caret::postResample (reg_yp_train, concrete.train$resistencia)

RMSE: 7.68775094434461

Rsquared: 0.799551675780017

MAE: 6.05153325446913

In [50] : reg_yp_test <- predict (cv,
concrete.test,
s = cv$lambda.min)
caret::postResample (reg_yp_test, concrete.test$resistencia)

RMSE: 8.36112292024709

Rsquared: 0.708476108521642

MAE:5886841734999

función 2
In [ ] : residual test <- concrete.test$resistencia - reg_yp_test
plot (concrete.test$resistencia, residual_test)
qqnorm (residual test)
qqline (residual_test, col = "orange")
ejercicio de regularización en R: gráfica 4
ejercicio de regularización en R: gráfica 5
In [52] : data.frame (real = concrete.test$resistencia,
Im = lm_yp_test,
reg = reg_yp_test [ , 1]) %>%
mutate (res_lm = real - lm) %>%
mutate (res_reg = real - reg) -> total_pred
head (total_pred)
ejercicio de regularización en R: tabla 2
In [ ]: library (reshape2)
total_pred %>% select (res_lm, res_reg) %>% melt()
ggplot (aes (x = value, color = variable)) + geom_density ()
total_pred %>% ggplot (aes (x = real)) +
geom_point (aes (y = reg, color = "Reg"), alpha = 0.5)+
geom point (aes (y = lm, color = "lm"), alpha = 0.5) + geom_abline (intercept = 0, slope = 1)

Attaching package: ‘reshape2’

The following object is masked from ‘package:tidyr’:

smiths

No id variables; using all as measure variables

ejercicio de regularización en R: gráfica 6

Continuando con el ejercicio de regularización en R, aquí tenemos en testing de cómo serían las distribuciones para el ejercicio de regularización en R y para la lineal.

ejercicio de regularización en R: gráfica 7
In [56]: #¿Tiene sesgo nuestro modelo?
colMeans (total_pred [ , c ("res_lm", "res_reg") ] )

res_Im: -1.96769345906342

res_reg: -0.125771239962697

Al final, nuestra regularización no tenía sesgos. En este caso, parece que nuestro modelo tiene menos sesgo que el de la regresión lineal, que tenía un poco más. Lo que se hace con este ejercicio de regularización en R es básicamente sumar los residuos de todas las predicciones y observar hacia dónde tiran, es decir, hacia qué lado se inclinan.

¿Te animas a seguir estudiando este tema? Si te has gustado este ejercicio de regularización en R y su respectiva solución, recuerda que puedes encontrar muchos similares y de otros tipos en nuestro Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp, en donde aprenderás en muy poco tiempo a dominar temas relacionados con el Big Data y el data mining, siempre con el acompañamiento de expertos en la materia. Tendrás la oportunidad de acceder a las mejores ofertas laborales de uno de los mercados más prolíficos del momento. ¡No esperes más para inscribirte!

Sandra Navarro

Business Intelligence & Big Data Advisor & Coordinadora del Bootcamp en Data Science, Big Data & Machine Learning.

Posts más leídos

¡CONVOCATORIA ABIERTA!

Big Data, IA & Machine Learning

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado