Este conjunto de datos representa un proceso de manufactura industrial, la idea es utilizarlo como fuente para construir, evaluar y comparar modelos de clasificación sobre la calidad de fabricación de cierto producto que pasa por un proceso industrial.
Es un conjunto de datos de 3000 registros, 10 variables independiente y todas ellas son numéricas, las variables independientes son las siguientes:
La variable dependiente es calidad, la cual puede tomar tres categorías:
El caso de estudio se pude ver de manera digital en el servicio rpubs.com en https://rpubs.com/rpizarrog/1444306 .
Los datos para su descarga y verificación se encuentran en https://raw.githubusercontent.com/rpizarrog/Libro-Aprendizaje-Automatico.-Casos-de-Estudio-con-R-y-Python/refs/heads/main/datos/dataset_industrial_clasificacion_multinomial_3000_4decimales.csv .
Las funciones previamente preparadas para la adecuada ejecución de este caso de estudio y de igual manera descargables y verificables, se encuentran en el servicio github.com en https://raw.githubusercontent.com/rpizarrog/Libro-Aprendizaje-Automatico.-Casos-de-Estudio-con-R-y-Python/refs/heads/main/R%20MarkDown/funciones/funciones%20para%20SVM%20ARBOLES%20RANDOM%20FOREST%20y%20regresion%20logistica%20multinomial%20DATOS%20INDUSTRIA.R .
Construir modelos de máquinas de soporte vectorial SVM para resolver una tarea de clasificación con kernels lineal, polinomial y radial. Se se crean otros modelos de clasificación para evaluar y comparar la calidad predictiva y de clasificación de todos los modelos creados.
Los datos que se utilizan son los de la calidad de un proceso industrial en relación a la fabricación de cierto producto.
Los datos se particionan 70% para datos de entrenamiento y 30% para datos de validación.
Los datos de entrenamiento se estandarizan y con las medias y desviaciones estándar de las variables extraídas de los datos de entrenamiento, se estandarizan los datos de validación.
Con los datos de entrenamiento se construyen todos los modelos aquí presentados.
Con los datos de validación se extraen las matrices de confusión con la finalidad de resumir y comparar a través de los estadísticos Accuracy, Kappa, Precision, Recall, Sensitivity, Specificity, F1 Score entre otros, que permiten valorar e interpretar la calidad predictiva y de clasificación de cada modelo.
Al final del caso de estudio se interpretan los resultados de las evaluaciones y comparaciones entre modelos.
# install.packages("readr")
# install.packages("tidyverse")
# install.packages("psych")
# install.packages("dplyr")
# install.packages("ggplot2")
# install.packages("caret")
# install.packages("broom")
# install.packages("lmtest")
# install.packages("car")
# install.packages("stats")
# install.packages("flextable")
# install.packages("officer")
# install.packages("patchwork")
# install.packages("performance")
# install.packages("see")
# install.packages("car")
# install.packages("nortest")
# install.packages("lmtest")
# install,packages("e1071")
# install.packages("rpart")
# install.packages("randomForest")
# install.packages("smotefamily")
# install.packages("themis")
library(readr) # cargar datos datos
library(tidyverse) # Para manipular
library (psych) # Para descriobir datos
library(dplyr) # Manipulación de datos
library(ggplot2) # gráficos
library(caret) # partición de datos y matriz de confusión
library(broom) # tidy modelos
library(lmtest) # Durbin-Watson
library(car) # VIF y diagnóstico, entre otras
library(stats) # lm, shapiro.test
library(patchwork) # Graficos organizados en columnas renglones
# Tablas compatibles con Word
library(flextable)
library(officer)
library(performance) # Para evaluar postulados de modelos
library(see) # Para evaluar postulados de modelos dependencia de performance
library(car) # Para verificar postulados de los modelos
library(nortest) # Para pruebas de normalidad Anderson-Darling
library(lmtest) # Para pruebas de homocedasticidad Breusch–Pagan y prueba de White y otras pruebas
# library(glmnet) # Para modelos Lasso y Ridge
library(e1071) # Para modelos SVM varios kernels
library(rpart) #arboles de clasificación
library(randomForest) # randomForest
library(rpart.plot) # Visualizar arboles de clasificación
library(smotefamily)
library(themis)
# url <- "../funciones/funciones para SVM ARBOLES RANDOM FOREST y regresion logistica multinomial DATOS INDUSTRIA.R" # local
url <- "https://raw.githubusercontent.com/rpizarrog/Libro-Aprendizaje-Automatico.-Casos-de-Estudio-con-R-y-Python/refs/heads/main/R%20MarkDown/funciones/funciones%20para%20SVM%20ARBOLES%20RANDOM%20FOREST%20y%20regresion%20logistica%20multinomial%20DATOS%20INDUSTRIA.R"
source(url)
url <- "https://raw.githubusercontent.com/rpizarrog/Libro-Aprendizaje-Automatico.-Casos-de-Estudio-con-R-y-Python/refs/heads/main/datos/dataset_industrial_clasificacion_multinomial_3000_4decimales.csv"
datos <- f_cargar_datos(url)
f_visualizar_head_tail_reducido_word(datos)
temperatura | presion | velocidad_linea | humedad | ... | mantenimiento_dias | espesor_material | dureza_material | calidad |
|---|---|---|---|---|---|---|---|---|
87.454 | 194.3595 | 68.3431 | 83.9505 | ... | 46.3501 | 10.5974 | 445.8545 | Alta |
145.0714 | 215.4358 | 25.5148 | 56.7752 | ... | 28.8687 | 7.546 | 110.5159 | Baja |
123.1994 | 122.5795 | 88.5155 | 70.7437 | ... | 47.3375 | 1.7799 | 464.3988 | Media |
109.8658 | 186.2286 | 65.1805 | 50.5234 | ... | 4.4105 | 13.8591 | 222.2981 | Media |
65.6019 | 177.1968 | 24.1483 | 64.1024 | ... | 11.4956 | 14.7246 | 303.2891 | Alta |
65.5995 | 221.5812 | 96.6104 | 43.8403 | ... | 33.0921 | 7.0346 | 152.9182 | Baja |
... | ... | ... | ... | ... | ... | ... | ... | ... |
63.1715 | 92.2762 | 36.6459 | 88.4343 | ... | 9.2701 | 6.2983 | 207.7266 | Baja |
136.5296 | 196.354 | 56.3437 | 20.3251 | ... | 54.7983 | 5.6008 | 480.9102 | Media |
65.7273 | 165.5475 | 24.8833 | 81.1568 | ... | 25.7084 | 7.7175 | 399.1297 | Alta |
80.9788 | 210.0753 | 97.9942 | 41.5128 | ... | 22.672 | 13.1394 | 107.7823 | Alta |
79.0046 | 162.4994 | 19.7132 | 85.7012 | ... | 13.8792 | 4.5288 | 260.4019 | Alta |
137.1414 | 105.3949 | 93.875 | 42.1862 | ... | 38.1454 | 2.4135 | 202.9592 | Media |
f_describir_datos(datos)
## $describe
## vars n mean sd median trimmed mad min
## temperatura 1 3000 99.99 29.17 100.54 100.00 37.81 50.00
## presion 2 3000 164.03 48.86 162.97 163.80 62.22 80.01
## velocidad_linea 3 3000 53.87 25.70 53.42 53.65 32.36 10.02
## humedad 4 3000 55.18 20.18 54.93 55.25 25.95 20.00
## vibracion 5 3000 4.99 2.90 4.91 4.98 3.82 0.01
## consumo_energia 6 3000 553.70 258.14 562.32 555.23 325.49 100.23
## experiencia_operador 7 3000 10.75 5.49 10.71 10.79 6.93 1.01
## mantenimiento_dias 8 3000 30.65 17.36 31.04 30.78 22.19 0.00
## espesor_material 9 3000 7.95 4.00 7.98 7.93 5.03 1.00
## dureza_material 10 3000 295.44 113.78 294.78 294.61 143.55 100.05
## calidad* 11 3000 2.00 0.82 2.00 2.00 1.48 1.00
## max range skew kurtosis se
## temperatura 149.97 99.97 -0.01 -1.22 0.53
## presion 249.92 169.92 0.03 -1.19 0.89
## velocidad_linea 99.95 89.93 0.06 -1.17 0.47
## humedad 89.98 69.97 -0.01 -1.20 0.37
## vibracion 10.00 9.99 0.03 -1.21 0.05
## consumo_energia 999.93 899.71 -0.04 -1.17 4.71
## experiencia_operador 20.00 18.99 -0.04 -1.19 0.10
## mantenimiento_dias 59.99 59.99 -0.05 -1.20 0.32
## espesor_material 14.99 13.99 0.01 -1.17 0.07
## dureza_material 499.89 399.84 0.05 -1.18 2.08
## calidad* 3.00 2.00 0.00 -1.50 0.01
##
## $structure
## [1] "'data.frame':\t3000 obs. of 11 variables:\n $ temperatura : num 87.5 145.1 123.2 109.9 65.6 ...\n $ presion : num 194 215 123 186 177 ...\n $ velocidad_linea : num 68.3 25.5 88.5 65.2 24.1 ...\n $ humedad : num 84 56.8 70.7 50.5 64.1 ...\n $ vibracion : num 6.54 0.8 2.42 7.74 5.29 ...\n $ consumo_energia : num 550 772 606 175 267 ...\n $ experiencia_operador: num 13.27 8.65 9.97 14.62 17.65 ...\n $ mantenimiento_dias : num 46.35 28.87 47.34 4.41 11.5 ...\n $ espesor_material : num 10.6 7.55 1.78 13.86 14.72 ...\n $ dureza_material : num 446 111 464 222 303 ...\n $ calidad : chr \"Alta\" \"Baja\" \"Media\" \"Media\" ..."
Se construye el diagrama de barra que presenta la frecuencia de clase de la variable dependiente calidad. Se observa un balance de clases de aproximadamente %33% para cada valor de la clase dependiente. Es un conjnunto de datos con clases balanceadas. La variable calidad se convierte a tipo factor.
variable_dependiente <- "calidad"
datos$calidad <- factor(datos$calidad)
f_frecuencia_clase(datos, variable_dependiente)
Se crean los datos de entrenamiento con el 70% y el 30% para datos de validación. Con la función f_visualizar_head_tail_reducido_word(), se visualizan los primeros registros de los datos de entrenamiento con las primeras y últimas cuatro variables, luego los datos de validación. Ver tablas.
particiones <- f_particionar_datos(datos)
datos_entrenamiento <- particiones$datos_entrenamiento
datos_validacion <- particiones$datos_validacion
f_visualizar_head_tail_reducido_word(datos_entrenamiento)
temperatura | presion | velocidad_linea | humedad | ... | mantenimiento_dias | espesor_material | dureza_material | calidad |
|---|---|---|---|---|---|---|---|---|
116.5197 | 155.9415 | 94.011 | 52.8758 | ... | 28.3491 | 7.9886 | 428.3789 | Alta |
77.2145 | 207.9196 | 31.5954 | 52.9777 | ... | 24.8547 | 13.8211 | 183.3891 | Alta |
57.1008 | 241.2228 | 59.904 | 31.8921 | ... | 34.4385 | 14.0499 | 462.7236 | Baja |
62.7713 | 195.213 | 56.3114 | 82.4018 | ... | 58.4042 | 14.158 | 436.0553 | Baja |
113.6291 | 216.1596 | 59.466 | 47.1104 | ... | 30.8888 | 10.2638 | 450.6444 | Media |
103.5775 | 165.4473 | 43.5076 | 45.7994 | ... | 8.1812 | 1.2809 | 206.8129 | Alta |
... | ... | ... | ... | ... | ... | ... | ... | ... |
98.3407 | 118.2774 | 18.2335 | 44.0401 | ... | 26.429 | 14.4056 | 413.6683 | Alta |
59.7834 | 191.2026 | 35.7652 | 52.2679 | ... | 31.9607 | 9.9123 | 418.5421 | Alta |
104.1901 | 216.9235 | 26.8095 | 43.3038 | ... | 0.391 | 1.8506 | 204.8284 | Media |
148.2379 | 127.7785 | 87.287 | 60.5977 | ... | 53.455 | 6.9847 | 123.357 | Baja |
148.8036 | 134.5695 | 55.8751 | 55.4188 | ... | 19.1623 | 9.3648 | 209.6917 | Media |
74.3172 | 148.5458 | 55.8987 | 40.7148 | ... | 10.8304 | 9.29 | 299.7795 | Media |
Datos de validación:
f_visualizar_head_tail_reducido_word(datos_validacion)
temperatura | presion | velocidad_linea | humedad | ... | mantenimiento_dias | espesor_material | dureza_material | calidad |
|---|---|---|---|---|---|---|---|---|
87.454 | 194.3595 | 68.3431 | 83.9505 | ... | 46.3501 | 10.5974 | 445.8545 | Alta |
145.0714 | 215.4358 | 25.5148 | 56.7752 | ... | 28.8687 | 7.546 | 110.5159 | Baja |
65.5995 | 221.5812 | 96.6104 | 43.8403 | ... | 33.0921 | 7.0346 | 152.9182 | Baja |
133.2443 | 132.152 | 98.1053 | 25.8729 | ... | 49.5331 | 1.2384 | 294.7394 | Media |
68.1825 | 185.6197 | 50.9461 | 37.742 | ... | 11.7848 | 13.3308 | 470.5838 | Alta |
68.3405 | 136.7885 | 77.8128 | 25.1973 | ... | 18.0016 | 4.0457 | 253.5806 | Media |
... | ... | ... | ... | ... | ... | ... | ... | ... |
147.0257 | 177.8847 | 39.9537 | 39.2528 | ... | 50.6647 | 13.3003 | 351.547 | Media |
55.1669 | 176.3659 | 43.8438 | 39.298 | ... | 15.8066 | 10.0523 | 351.4563 | Media |
67.9256 | 82.2578 | 32.6964 | 27.0308 | ... | 12.4427 | 10.2557 | 286.8521 | Baja |
89.6554 | 164.8246 | 52.8911 | 22.6449 | ... | 57.7542 | 11.2545 | 149.3217 | Alta |
136.5296 | 196.354 | 56.3437 | 20.3251 | ... | 54.7983 | 5.6008 | 480.9102 | Media |
137.1414 | 105.3949 | 93.875 | 42.1862 | ... | 38.1454 | 2.4135 | 202.9592 | Media |
Sobre estandarización:
(James, Witten, Hastie, & Tibshirani, 2023) sobre estandarizar datos de entrenamiento luego datos de validación con la ledia y desviación con que se estandarizaron los datos de entrenamiento.
Po otra parte, (Kuhn & Kjell, 2013) mencionan que se puede incurrir en una deficiencia que ellos denominan data leakage (fuga de datos) y recomiendan que cualquier transformación para creación de modelos sea estimada únicamente con los datos de entrenamiento.
(Bishop, 2006), menciona que los parámetros de estandarización deben obtenerse del conjunto de entrenamiento y posteriormente aplicarse a los datos de validación y a los nuevos datos.
Aunque con gran cantidad de registros es poco significante los estadísticos para valorar calidad predictiva es buen práqctica hacer caso a las recomendaciones de particionar en datos de entrenamiento y validación, estandarizar datos de entrenamiento, guardando los argumentos de los valores media y desviación que servirá para estandarizar los datos de validación y de igual manera para nuevos datos, con esto se evita ese famoso precepto de fuga de datos.
Con pocos datos en las muestras si es relevante no hacer caso a esta recomendación.
Finalmente, aunque estandarizar el conjunto completo antes de la partición produce conjuntos con una transformación homogénea, este procedimiento introduce fuga de información (data leakage), ya que los parámetros de estandarización son calculados utilizando también los registros destinados a validación. Por esta razón, la práctica recomendada consiste en particionar primero los datos y posteriormente calcular las medias y desviaciones estándar únicamente sobre el conjunto de entrenamiento, aplicando dichos parámetros al conjunto de validación (OpenAI, 2026)
Termina sobre estandarización
Se ejecuta la función f_estandarizar_entrenamiento() que regresa un resultado con varios elementos, datos estandarizados, la media y desviación estándar que se calcularon para estandarizar los datos y las variables que fueron estandarizadas; con estos argumentos se deben estandarizar por consiguiente los datos de validación.
Los datos de entrenamiento se presentan con cuatro posiciones decimales habiendo llamado la función f_redondear_datos().
resultado_estandarizacion <- f_estandarizar_entrenamiento(datos_entrenamiento, variable_dependiente = "calidad")
datos_entrenamiento <- resultado_estandarizacion$datos_estandarizados
f_visualizar_head_tail_reducido_word(f_redondear_datos(datos_entrenamiento, 4))
temperatura | presion | velocidad_linea | humedad | ... | mantenimiento_dias | espesor_material | dureza_material | calidad |
|---|---|---|---|---|---|---|---|---|
0.5748 | -0.1419 | 1.5863 | -0.1307 | ... | -0.145 | -8e-04 | 1.1781 | Alta |
-0.7686 | 0.9352 | -0.8542 | -0.1256 | ... | -0.3475 | 1.4595 | -0.9793 | Alta |
-1.4561 | 1.6253 | 0.2527 | -1.1725 | ... | 0.208 | 1.5168 | 1.4806 | Baja |
-1.2623 | 0.6719 | 0.1122 | 1.3352 | ... | 1.5971 | 1.5438 | 1.2457 | Baja |
0.476 | 1.1059 | 0.2356 | -0.4169 | ... | 0.0022 | 0.5688 | 1.3742 | Media |
0.1325 | 0.055 | -0.3884 | -0.482 | ... | -1.314 | -1.6803 | -0.773 | Alta |
... | ... | ... | ... | ... | ... | ... | ... | ... |
-0.0465 | -0.9224 | -1.3767 | -0.5694 | ... | -0.2563 | 1.6058 | 1.0486 | Alta |
-1.3644 | 0.5887 | -0.6912 | -0.1609 | ... | 0.0644 | 0.4808 | 1.0915 | Alta |
0.1534 | 1.1217 | -1.0414 | -0.6059 | ... | -1.7655 | -1.5377 | -0.7905 | Media |
1.6589 | -0.7255 | 1.3234 | 0.2527 | ... | 1.3103 | -0.2522 | -1.5079 | Baja |
1.6783 | -0.5848 | 0.0952 | -0.0044 | ... | -0.6775 | 0.3437 | -0.7477 | Media |
-0.8676 | -0.2952 | 0.0961 | -0.7345 | ... | -1.1604 | 0.325 | 0.0457 | Media |
Estandarizar ahora los datos de validación recuperando la media, la desviación estándar y las variables independientes numéricas. Los datos se presentan con cuatro posiciones decimales.
datos_validacion <- f_estandarizar_validacion(datos = datos_validacion,
medias = resultado_estandarizacion$medias,
desviaciones = resultado_estandarizacion$desviaciones,
variables_estandarizadas = resultado_estandarizacion$variables_estandarizadas
)
f_visualizar_head_tail_reducido_word(f_redondear_datos(datos_validacion, 4))
temperatura | presion | velocidad_linea | humedad | ... | mantenimiento_dias | espesor_material | dureza_material | calidad |
|---|---|---|---|---|---|---|---|---|
-0.4186 | 0.6542 | 0.5827 | 1.4121 | ... | 0.8984 | 0.6523 | 1.332 | Alta |
1.5507 | 1.0909 | -1.092 | 0.0629 | ... | -0.1149 | -0.1117 | -1.621 | Baja |
-1.1656 | 1.2183 | 1.688 | -0.5793 | ... | 0.1299 | -0.2397 | -1.2476 | Baja |
1.1465 | -0.6349 | 1.7464 | -1.4713 | ... | 1.0829 | -1.6909 | 0.0013 | Media |
-1.0773 | 0.4731 | -0.0976 | -0.8821 | ... | -1.1051 | 1.3367 | 1.5498 | Alta |
-1.0719 | -0.5388 | 0.9529 | -1.5049 | ... | -0.7448 | -0.9881 | -0.3612 | Media |
... | ... | ... | ... | ... | ... | ... | ... | ... |
1.6175 | 0.3128 | -0.5274 | -0.807 | ... | 1.1485 | 1.3291 | 0.5015 | Media |
-1.5222 | 0.2813 | -0.3753 | -0.8048 | ... | -0.872 | 0.5159 | 0.5008 | Media |
-1.0861 | -1.6688 | -0.8112 | -1.4138 | ... | -1.067 | 0.5668 | -0.0682 | Baja |
-0.3434 | 0.0421 | -0.0215 | -1.6316 | ... | 1.5594 | 0.8169 | -1.2793 | Alta |
1.2588 | 0.6955 | 0.1135 | -1.7468 | ... | 1.3881 | -0.5987 | 1.6408 | Media |
1.2797 | -1.1894 | 1.581 | -0.6614 | ... | 0.4229 | -1.3967 | -0.807 | Media |
Ahora crear el modelo SVM con kernel lineal con los datos de entrenamiento mandando ejecutar la función previamente codificada llamada f_crear_modelo_SVM_lineal().
modelo_SVM_lineal <- f_crear_modelo_SVM_lineal(datos_entrenamiento, variable_dependiente, C = 0.01)
##
## ====================================
## MODELO SVM LINEAL
## ====================================
## Kernel : linear
## Cost (C): 0.01
## Vectores de soporte: 1959
## ====================================
modelo_SVM_lineal
##
## Call:
## svm(formula = formula_modelo, data = datos, kernel = "linear", cost = C,
## probability = TRUE, scale = FALSE)
##
##
## Parameters:
## SVM-Type: C-classification
## SVM-Kernel: linear
## cost: 0.01
##
## Number of Support Vectors: 1959
Se construye el SVM tipo polinomial de grado 2 mediante la función f_crear_modelo_SVM_polinomial().
modelo_SVM_poly2 <- f_crear_modelo_SVM_polinomial(datos_entrenamiento,
variable_dependiente = "calidad", C = 0.1, grado = 2
)
##
## ====================================
## MODELO SVM POLINOMIAL
## ====================================
## Kernel : polynomial
## Cost (C): 0.1
## Grado: 2
## Coef0: 1
## Gamma: 0.1
## Vectores de soporte: 1885
## ====================================
modelo_SVM_poly2
##
## Call:
## svm(formula = formula_modelo, data = datos, kernel = "polynomial",
## degree = grado, cost = C, coef0 = coef0, gamma = gamma, probability = TRUE,
## scale = FALSE)
##
##
## Parameters:
## SVM-Type: C-classification
## SVM-Kernel: polynomial
## cost: 0.1
## degree: 2
## coef.0: 1
##
## Number of Support Vectors: 1885
Se construye el SVM tipo polinomial de grado 3 mediante la función f_crear_modelo_SVM_polinomial().
modelo_SVM_poly3 <- f_crear_modelo_SVM_polinomial(datos_entrenamiento,
variable_dependiente = "calidad", C = 0.1, grado = 3
)
##
## ====================================
## MODELO SVM POLINOMIAL
## ====================================
## Kernel : polynomial
## Cost (C): 0.1
## Grado: 3
## Coef0: 1
## Gamma: 0.1
## Vectores de soporte: 1702
## ====================================
modelo_SVM_poly3
##
## Call:
## svm(formula = formula_modelo, data = datos, kernel = "polynomial",
## degree = grado, cost = C, coef0 = coef0, gamma = gamma, probability = TRUE,
## scale = FALSE)
##
##
## Parameters:
## SVM-Type: C-classification
## SVM-Kernel: polynomial
## cost: 0.1
## degree: 3
## coef.0: 1
##
## Number of Support Vectors: 1702
Se construye el SVM tipo radial mediante la función f_crear_modelo_SVM_radial().
modelo_SVM_radial <- f_crear_modelo_SVM_radial(datos_entrenamiento,
variable_dependiente = "calidad", C = 0.1
)
##
## ====================================
## MODELO SVM RADIAL
## ====================================
## Kernel : radial
## Cost (C): 0.1
## Gamma: 0.1
## Vectores de soporte: 2011
## ====================================
modelo_SVM_radial
##
## Call:
## svm(formula = formula_modelo, data = datos, kernel = "radial", cost = C,
## gamma = gamma, probability = TRUE, scale = FALSE)
##
##
## Parameters:
## SVM-Type: C-classification
## SVM-Kernel: radial
## cost: 0.1
##
## Number of Support Vectors: 2011
modelo_RF <- f_construir_random_forest(datos_entrenamiento, variable_dependiente, semilla=2025)
##
## ====================================
## RANDOM FOREST
## ====================================
## Variable objetivo : calidad
## Número clases : 3
## Variables predictoras : 10
## Número árboles : 500
## mtry : 3
## nodesize : 1
## Observaciones : 2100
##
## Frecuencia de clases:
##
## Alta Baja Media
## 700 671 729
## ====================================
modelo_RF
##
## Call:
## randomForest(formula = formula_modelo, data = datos, ntree = ntree, mtry = mtry, nodesize = nodesize, importance = importance)
## Type of random forest: classification
## Number of trees: 500
## No. of variables tried at each split: 3
##
## OOB estimate of error rate: 19.86%
## Confusion matrix:
## Alta Baja Media class.error
## Alta 568 0 132 0.1885714
## Baja 1 566 104 0.1564829
## Media 107 73 549 0.2469136
modelo_AC_gini <- f_construir_arbol_clasificacion(datos_entrenamiento, variable_dependiente, criterio = "gini")
##
## ====================================
## ÁRBOL DE CLASIFICACIÓN
## ====================================
## Variable objetivo : calidad
## Criterio : gini
## Número clases : 3
## Observaciones : 2100
##
## Frecuencia de clases:
##
## Alta Baja Media
## 700 671 729
## ====================================
modelo_AC_gini
## n= 2100
##
## node), split, n, loss, yval, (yprob)
## * denotes terminal node
##
## 1) root 2100 1371 Media (0.333333333 0.319523810 0.347142857)
## 2) presion< 1.21666 1795 1096 Alta (0.389415042 0.222284123 0.388300836)
## 4) presion>=-1.341533 1565 866 Alta (0.446645367 0.130351438 0.423003195)
## 8) vibracion< 0.121474 853 302 Alta (0.645955451 0.039859320 0.314185229)
## 16) presion< 0.8776628 731 199 Alta (0.727770178 0.023255814 0.248974008)
## 32) presion>=-0.9389845 580 91 Alta (0.843103448 0.001724138 0.155172414) *
## 33) presion< -0.9389845 151 59 Media (0.284768212 0.105960265 0.609271523) *
## 17) presion>=0.8776628 122 36 Media (0.155737705 0.139344262 0.704918033) *
## 9) vibracion>=0.121474 712 318 Media (0.207865169 0.238764045 0.553370787)
## 18) presion>=0.9128894 70 15 Baja (0.000000000 0.785714286 0.214285714) *
## 19) presion< 0.9128894 642 263 Media (0.230529595 0.179127726 0.590342679)
## 38) presion>=-0.7589569 500 187 Media (0.288000000 0.086000000 0.626000000) *
## 39) presion< -0.7589569 142 70 Baja (0.028169014 0.507042254 0.464788732)
## 78) vibracion>=1.206733 61 12 Baja (0.000000000 0.803278689 0.196721311) *
## 79) vibracion< 1.206733 81 27 Media (0.049382716 0.283950617 0.666666667) *
## 5) presion< -1.341533 230 35 Baja (0.000000000 0.847826087 0.152173913) *
## 3) presion>=1.21666 305 33 Baja (0.003278689 0.891803279 0.104918033) *
modelo_AC_entropia <- f_construir_arbol_clasificacion(datos_entrenamiento, variable_dependiente, criterio = "information")
##
## ====================================
## ÁRBOL DE CLASIFICACIÓN
## ====================================
## Variable objetivo : calidad
## Criterio : information
## Número clases : 3
## Observaciones : 2100
##
## Frecuencia de clases:
##
## Alta Baja Media
## 700 671 729
## ====================================
modelo_AC_entropia
## n= 2100
##
## node), split, n, loss, yval, (yprob)
## * denotes terminal node
##
## 1) root 2100 1371 Media (0.333333333 0.319523810 0.347142857)
## 2) presion< 1.149923 1745 1046 Alta (0.400573066 0.214899713 0.384527221)
## 4) presion>=-1.2021 1434 740 Alta (0.483960948 0.103905160 0.412133891)
## 8) vibracion< 0.6139645 967 339 Alta (0.649431231 0.031023785 0.319544984)
## 16) presion< 0.8728025 853 244 Alta (0.713950762 0.014067995 0.271981243)
## 32) presion>=-0.9389845 736 165 Alta (0.775815217 0.002717391 0.221467391) *
## 33) presion< -0.9389845 117 48 Media (0.324786325 0.085470085 0.589743590) *
## 17) presion>=0.8728025 114 37 Media (0.166666667 0.157894737 0.675438596) *
## 9) vibracion>=0.6139645 467 185 Media (0.141327623 0.254817987 0.603854390)
## 18) presion>=0.910583 33 3 Baja (0.000000000 0.909090909 0.090909091) *
## 19) presion< 0.910583 434 155 Media (0.152073733 0.205069124 0.642857143) *
## 5) presion< -1.2021 311 85 Baja (0.016077170 0.726688103 0.257234727)
## 10) vibracion>=-0.2562345 181 15 Baja (0.000000000 0.917127072 0.082872928) *
## 11) vibracion< -0.2562345 130 65 Media (0.038461538 0.461538462 0.500000000)
## 22) presion< -1.357083 84 27 Baja (0.000000000 0.678571429 0.321428571) *
## 23) presion>=-1.357083 46 8 Media (0.108695652 0.065217391 0.826086957) *
## 3) presion>=1.149923 355 59 Baja (0.002816901 0.833802817 0.163380282) *
modelo_RLM <- f_crear_modelo_regresion_logistica(datos_entrenamiento, variable_dependiente, tipo = "multinomial")
##
## ====================================
## REGRESIÓN LOGÍSTICA
## ====================================
## Tipo : multinomial
## Balanceo : ninguno
## Variable objetivo : calidad
## Clases : 3
## Observaciones : 2100
## ====================================
modelo_RLM
## Call:
## nnet::multinom(formula = formula_modelo, data = datos, trace = FALSE)
##
## Coefficients:
## (Intercept) temperatura presion velocidad_linea humedad vibracion
## Baja 0.04669506 -0.02310249 0.31654756 -0.003538909 0.0707544920 1.0979295
## Media 0.21490016 -0.01346276 0.04403282 0.026982823 0.0001885323 0.8432477
## consumo_energia experiencia_operador mantenimiento_dias espesor_material
## Baja -0.01730547 0.070562756 0.1053116 0.004050418
## Media -0.03326402 0.007577901 0.1147000 -0.028888594
## dureza_material
## Baja 0.03060217
## Media 0.01352892
##
## Residual Deviance: 4206.606
## AIC: 4250.606
resultado <- f_evaluar_modelos(
modelos = list(
modelo_RLM,
modelo_AC_gini,
modelo_AC_entropia,
modelo_RF,
modelo_SVM_lineal,
modelo_SVM_poly2,
modelo_SVM_poly3,
modelo_SVM_radial
),
datos_validacion = datos_validacion,
variable_dependiente = "calidad",
nombres_modelos = c(
"RLM",
"AR Gini",
"AR Entropía",
"RF",
"SVM Lineal",
"SVM Poly 2",
"SVM Poly 3",
"SVM Radial"
)
)
resultado
Los resultados muestran que los modelos lineales, tales como la regresión logística multinomial y el SVM con kernel lineal, presentan desempeños modestos con valores de exactitud cercanos al 50%, lo que sugiere que las fronteras de decisión entre las clases Alta, Media y Baja no son lineales.
Por otra parte, los modelos capaces de capturar relaciones no lineales presentan mejoras significativas. El SVM con kernel polinomial de grado 2 alcanzó una exactitud del 71.11%, mientras que el kernel polinomial de grado 3 incrementó dicho valor hasta 79.67%. Los árboles de clasificación obtuvieron exactitudes entre 76% y 78%.
El mejor desempeño correspondió al modelo Random Forest, con una exactitud de 82.89%, un coeficiente Kappa de 0.7429 y un valor F1 de 0.8253, evidenciando una elevada capacidad de generalización sobre los datos de validación.
Estos resultados sugieren que la estructura de los datos presenta patrones predominantemente no lineales, favoreciendo el uso de modelos basados en árboles y kernels polinomiales frente a enfoques lineales. OPENAI.