Contexto

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 .

Objetivo

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.

Descripción

Cargar librerías

# 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)

Cargar funciones

# 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)

Cargar datos

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

Estadísticos descriptivos

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\" ..."

Frecuencia de clases

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)

Desarrollo

Datos de entrenamiento y datos de validación

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

Estandarizar datos de entrenamiento

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 datos de validación

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

Modelo SVM Kernel lineal

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

Modelo SVM Kernel polinomial grado 2

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

Modelo SVM Kernel polinomial grado 3

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

Modelo SVM kernel radial

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 random forest

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 árboles de regresión criterio Gini

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 árboles de regresión criterio entropía

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 regresión logística multinomial

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

Evaluación de modelos

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

Interpretación del caso

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.