Diagnóstico Temprano de Tumores con IA
¿Qué hace el modelo?
Este modelo utiliza regresión logística para predecir si un tumor es maligno o benigno, basado en características extraídas de imágenes de células mamarias. Se trabaja con un conjunto de datos que incluye variables como radio, textura, área, suavidad, entre otras.
¿Para qué sirve?
Sirve como herramienta de apoyo diagnóstico en la detección de cáncer de mama. Utiliza aprendizaje supervisado para entrenar un clasificador capaz de identificar patrones asociados a tumores malignos, ayudando así a médicos a tomar decisiones más informadas.
1# Importamos los datos
2dt <- read.csv("/content/Cancer_Data.csv")
1# Sacamos las variables que no necesitamos
2dt <- dt[, 2:32]
3# Convertimos la variable dependiente que está en categórica en binaria
4dt$diagnosis <- ifelse(dt$diagnosis == "M", 1, 0)
5dt
1diagnosis radius_mean texture_mean perimeter_mean area_mean smoothness_mean compactness_mean concavity_mean concave.points_mean symmetry_mean radius_worst texture_worst perimeter_worst area_worst smoothness_worst compactness_worst concavity_worst concave.points_worst symmetry_worst fractal_dimension_worst
2<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
31 17.990 10.38 122.80 1001.0 0.11840 0.27760 0.30010 0.14710 0.2419 25.38 17.33 184.60 2019.0 0.1622 0.6656 0.71190 0.26540 0.4601 0.11890
41 20.570 17.77 132.90 1326.0 0.08474 0.07864 0.08690 0.07017 0.1812 24.99 23.41 158.80 1956.0 0.1238 0.1866 0.24160 0.18600 0.2750 0.08902
1# Instalamos las librerías necesarias
2# caret proporciona funciones para optimizar el proceso de entrenamiento de modelos
3# pROC se usa para visualizar, suavizar y comparar curvas ROC
4install.packages(c("caret", "pROC"))
1# Llamamos a las librerías para poder ejecutarlas en el modelo
2library(caret)
3library(pROC)
1# Normalizamos los datos antes de dividirlos en entrenamiento y testing
2prepoc <- preProcess(dt[, 2:31], method = c("center", "scale"))
3
4# Aplicamos la normalización de los datos
5dt_norm <- predict(prepoc, newdata = dt[, 2:31])
6dt_norm$diagnosis <- dt$diagnosis
1# Dividimos los datos en conjuntos de entrenamiento y testing
2set.seed(123) # Reproducibilidad
3indices <- createDataPartition(dt_norm$diagnosis, p = 0.8, list = FALSE)
4datos_entrenamiento <- dt_norm[indices,]
5datos_prueba <- dt_norm[-indices, ]
1# Vemos el número de datos en cada dataFrame
2print(paste("Datos de entrenamiento: ", nrow(datos_entrenamiento)))
3print(paste("Datos de prueba: ", nrow(datos_prueba)))
1[1] "Datos de entrenamiento: 456"
2[1] "Datos de prueba: 113"
1# Ajustamos el modelo de regresión logística
2modelo <- glm(diagnosis ~ ., data = datos_entrenamiento, family = binomial, control = glm.control(maxit = 50))
3
4# Mostramos los resultados del modelo
5summary(modelo)
1Warning message:
2“glm.fit: fitted probabilities numerically 0 or 1 occurred”
3
4Call:
5glm(formula = diagnosis ~ ., family = binomial, data = datos_entrenamiento,
6 control = glm.control(maxit = 50))
7
8Coefficients:
9 Estimate Std. Error z value Pr(>|z|)
10(Intercept) 1.215e+02 1.029e+06 0.000 1.000
11radius_mean -1.143e+04 2.766e+07 0.000 1.000
12texture_mean 4.530e+01 9.524e+05 0.000 1.000
13perimeter_mean 7.441e+03 3.021e+07 0.000 1.000
14area_mean 4.211e+03 9.534e+06 0.000 1.000
15smoothness_mean 3.023e+02 6.057e+05 0.000 1.000
16compactness_mean -1.178e+03 2.583e+06 0.000 1.000
17concavity_mean 2.084e+02 3.330e+06 0.000 1.000
18concave.points_mean 2.422e+02 1.474e+06 0.000 1.000
19symmetry_mean -1.565e+02 1.034e+06 0.000 1.000
20fractal_dimension_mean 2.845e+02 1.532e+06 0.000 1.000
21radius_se 5.828e+02 6.613e+06 0.000 1.000
22texture_se -6.211e+00 5.612e+05 0.000 1.000
23perimeter_se -5.411e+02 2.994e+06 0.000 1.000
24area_se 6.169e+02 6.891e+06 0.000 1.000
25smoothness_se -1.037e+01 6.861e+05 0.000 1.000
26compactness_se 6.575e+02 1.026e+06 0.001 0.999
27concavity_se -6.201e+02 1.052e+06 -0.001 1.000
28concave.points_se 5.312e+02 1.076e+06 0.000 1.000
29symmetry_se -1.909e+02 6.423e+05 0.000 1.000
30fractal_dimension_se -8.263e+02 1.335e+06 -0.001 1.000
31radius_worst 4.829e+03 1.517e+07 0.000 1.000
32texture_worst 2.160e+02 1.221e+06 0.000 1.000
33perimeter_worst -5.300e+02 8.203e+06 0.000 1.000
34area_worst -3.490e+03 1.192e+07 0.000 1.000
35smoothness_worst -9.288e+01 5.377e+05 0.000 1.000
36compactness_worst -3.980e+02 2.147e+06 0.000 1.000
37concavity_worst 6.502e+02 1.793e+06 0.000 1.000
38concave.points_worst 1.618e+02 1.362e+06 0.000 1.000
39symmetry_worst 3.338e+02 1.498e+06 0.000 1.000
40fractal_dimension_worst 2.578e+02 1.172e+06 0.000 1.000
41
42(Dispersion parameter for binomial family taken to be 1)
43
44 Null deviance: 5.8973e+02 on 455 degrees of freedom
45Residual deviance: 9.0287e-10 on 425 degrees of freedom
46AIC: 62
47
48Number of Fisher Scoring iterations: 34
1# Calcula los intervalos de confianza
2confint(modelo)
12.5 % 97.5 %
2(Intercept) -32794.04 33037.08
3radius_mean -1039960.07 1030739.39
4texture_mean -37139.04 36207.78
5perimeter_mean -1074433.42 1076504.48
6area_mean -360848.90 355051.39
7smoothness_mean -22695.99 23950.37
8compactness_mean -93527.34 95957.62
9concavity_mean -112428.53 114076.84
10concave.points_mean -50840.92 49679.39
11symmetry_mean -39401.93 40197.97
12fractal_dimension_mean -56667.36 57991.30
13radius_se -236234.71 234596.09
14texture_se -18881.83 17939.49
15perimeter_se -117439.58 113144.82
16area_se -223504.25 239438.46
17smoothness_se -24936.91 24037.12
18compactness_se -36338.14 38592.18
19concavity_se -33495.03 32560.72
20concave.points_se -34681.94 34407.72
21symmetry_se -22295.73 22423.22
22fractal_dimension_se -46758.27 46163.83
23radius_worst -611308.82 594165.55
24texture_worst -42982.75 43932.44
25perimeter_worst -280437.03 267873.38
26area_worst -451856.41 470831.32
27smoothness_worst -19701.95 19516.18
28compactness_worst -75994.84 73496.62
29concavity_worst -61068.70 63790.99
30concave.points_worst -47781.35 47025.43
31symmetry_worst -52391.12 51871.49
32fractal_dimension_worst -38063.66 37124.75
1# Predice en el conjunto de prueba
2predicciones <- predict(modelo, newdata = datos_prueba, type = "response")
1# Crea la curva ROC
2roc_obj <- roc(datos_prueba$diagnosis, predicciones)
3plot(roc_obj, print.thres = "best")
1install.packages("ggplot2")
1# Predecimos el conjunto de prueba.
2predicciones <- predict(modelo, newdata = datos_entrenamiento, type = "response")
3
4var_interes <- datos_entrenamiento$area_mean
5df <- data.frame(variable_interes = var_interes, probs = predicciones)
6df <- df[order(df$variable_interes), ]
1# Crea una gráfica de regresión logística con los datos del modelo anterior
2
3# Create a data frame with the variable of interest and the predicted probabilities
4df <- data.frame(variable_interes = datos_entrenamiento$area_mean, probs = predicciones)
5
6# Sort the data frame by the variable of interest
7df <- df[order(df$variable_interes), ]
8
9# Create the logistic regression plot
10ggplot(df, aes(x = variable_interes, y = probs)) +
11 geom_point() +
12 geom_smooth(method = "glm", method.args = list(family = "binomial"))
Los coeficientes del modelo indican qué variables tienen mayor influencia en la probabilidad de que un tumor sea maligno. Se evalúa su desempeño mediante curvas ROC, lo que permite entender la sensibilidad y especificidad del modelo (es decir, qué tan bien distingue entre casos positivos y negativos).
Explora el Proyecto
Contenido Relacionado
Programa especializado: Análisis de datos con R
Análisis de datos maestros con R. Dominio estadístico del análisis de datos, incluida la visualización básica de datos, las pruebas e inferencias estadísticas y la modelización lineal
Logistic Regression in R
Guía práctica sobre regresión logística usando R.
Comentarios
Cargando comentarios...