1 Data-Set Completo

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

2 Division Del Dataset

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

3. Árbol de Decisión

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