En esta sección se importa la totalidad del conjunto de datos sobre estrellas púlsares (pulsar_stars.csv). Esta fase inicial es fundamental para alimentar el script con la información primaria que servirá tanto para el entrenamiento de los algoritmos como para la evaluación y predicción final de los modelos de clasificación
dataset <- read.csv("C:/Users/Alumnos/Downloads/pulsar_stars.csv")
colnames(dataset)[9] <- "TipoEstrella"
dataset$TipoEstrella <- factor(dataset$TipoEstrella, levels = c("0", "1"), labels = c("NoPulsar", "Pulsar"))
dataset[, c(1:8)] <- scale(dataset[, c(1:8)])
summary(dataset)
## Mean.of.the.integrated.profile Standard.deviation.of.the.integrated.profile
## Min. :-4.1035 Min. :-3.18236
## 1st Qu.:-0.3957 1st Qu.:-0.60988
## Median : 0.1559 Median : 0.05815
## Mean : 0.0000 Mean : 0.00000
## 3rd Qu.: 0.6239 3rd Qu.: 0.65374
## Max. : 3.1785 Max. : 7.63232
## Excess.kurtosis.of.the.integrated.profile Skewness.of.the.integrated.profile
## Min. :-2.212200 Min. :-0.5775
## 1st Qu.:-0.423630 1st Qu.:-0.3176
## Median :-0.239293 Median :-0.2548
## Mean : 0.000000 Mean : 0.0000
## 3rd Qu.:-0.004259 3rd Qu.:-0.1366
## Max. : 7.134757 Max. :10.7543
## Mean.of.the.DM.SNR.curve Standard.deviation.of.the.DM.SNR.curve
## Min. :-0.4208 Min. :-0.9736
## 1st Qu.:-0.3628 1st Qu.:-0.6106
## Median :-0.3329 Median :-0.4040
## Mean : 0.0000 Mean : 0.0000
## 3rd Qu.:-0.2426 3rd Qu.: 0.1079
## Max. : 7.1516 Max. : 4.3304
## Excess.kurtosis.of.the.DM.SNR.curve Skewness.of.the.DM.SNR.curve
## Min. :-2.53941 Min. :-1.0030
## 1st Qu.:-0.55970 1st Qu.:-0.6562
## Median : 0.02884 Median :-0.2046
## Mean : 0.00000 Mean : 0.0000
## 3rd Qu.: 0.53248 3rd Qu.: 0.3234
## Max. : 5.82240 Max. :10.1971
## TipoEstrella
## NoPulsar:16259
## Pulsar : 1639
##
##
##
##
Para evitar el sobreajuste (overfitting) y validar objetivamente el rendimiento de los clasificadores, particionamos la base de datos reservando un 75% para la fase de entrenamiento y un 25% exclusivo para la fase de prueba. Mediante la librería caTools, conservamos la distribución relativa de las clases para garantizar la representatividad estadística del modelo.
library(caTools)
set.seed(1234)
split <- sample.split(dataset$TipoEstrella, SplitRatio = 0.75)
training_set <- subset(dataset, split == TRUE)
test_set <- subset(dataset, split == FALSE)
# Ver cuántos datos quedaron en cada conjunto
table(training_set$TipoEstrella)
##
## NoPulsar Pulsar
## 12194 1229
table(test_set$TipoEstrella)
##
## NoPulsar Pulsar
## 4065 410
Implementamos un algoritmo supervisado de clasificación basada en árboles de decisión (CART). Esta técnica permite modelar relaciones no lineales de manera interpretable mediante la división recursiva de los datos. Evaluamos el sesgo y la varianza inicial del modelo contrastando sus inferencias contra el Test Set mediante una matriz de confusión, y graficamos la estructura de los nodos hoja para interpretar las reglas aprendidas.
library(rpart)
if (!require(rpart.plot)) install.packages("rpart.plot")
## Cargando paquete requerido: rpart.plot
library(rpart.plot)
set.seed(1234)
clasificadorDT <- rpart(TipoEstrella ~ ., data = training_set)
# Matriz de confusión inicial
pred_valid_DT <- predict(clasificadorDT, newdata = test_set, type = 'class')
matrizConfusion_DT <- table(Real = test_set$TipoEstrella, Predicho = pred_valid_DT)
matrizConfusion_DT
## Predicho
## Real NoPulsar Pulsar
## NoPulsar 4037 28
## Pulsar 84 326
# Graficar el árbol
prp(clasificadorDT,
type = 2,
extra = 104,
under = TRUE,
fallen.leaves = TRUE,
shadow.col = "gray",
box.palette = "RdBu",
faclen = 0,
main = "Árbol de Decisión: Clasificación de Estrellas Púlsares")