Support Vector Machines (SVM) en R

Autor/a

Gerson Rivera

Fecha de publicación

18 octubre 2024

APLICACIÓN SVM

Etapa 1

Leer la base de datos asociada

base <- read_excel("Cáncer.xlsx")
#View(base)
Etapa 2

Filtrado de datos

y_Diag<- factor(base$Diagnóstico, levels=c("B","M"), labels = c(0,1))
base1<-data.frame(Diagnóstico=y_Diag,Suavidad=base$suavidad3,P_Cóncavos=base$puntos_cóncavos3)
#base1
Etapa 3

Segmentación gráfica

# Prepara los datos
x <- cbind(base1$Suavidad, base1$P_Cóncavos)
y <- base1$Diagnóstico
Benigno <- sum(y==0)
Maligno <- sum(y==1)

# Categoría (rojo = maligno, verde = benigno)
colores <- c(rep('green',Benigno),rep('red',Maligno))
pchn <- 21

# Diagrama de dispersión
plot(x, pch = pchn, bg = colores, xlab='Suavidad', ylab='Puntos Cóncavos')

Etapa 4

Aplicación de SVM (Lineal)

C <- 10
svm.lineal <- svm(y~., data=base1, kernel='linear', cost=C, cross=2, scale=FALSE)
summary(svm.lineal)

Call:
svm(formula = y ~ ., data = base1, kernel = "linear", cost = C, cross = 2, 
    scale = FALSE)


Parameters:
   SVM-Type:  C-classification 
 SVM-Kernel:  linear 
       cost:  10 

Number of Support Vectors:  7

 ( 4 3 )


Number of Classes:  2 

Levels: 
 0 1

2-fold cross-validation on training data:

Total Accuracy: 100 
Single Accuracies:
 100 100 
C <- 10^3
svm.lineal <- svm(y~., data=base1, kernel='linear', cost=C, cross=2, scale=FALSE)
summary(svm.lineal)

Call:
svm(formula = y ~ ., data = base1, kernel = "linear", cost = C, cross = 2, 
    scale = FALSE)


Parameters:
   SVM-Type:  C-classification 
 SVM-Kernel:  linear 
       cost:  1000 

Number of Support Vectors:  7

 ( 4 3 )


Number of Classes:  2 

Levels: 
 0 1

2-fold cross-validation on training data:

Total Accuracy: 100 
Single Accuracies:
 100 100 
Etapa 5

Indexación de los vectores soporte

svm.lineal$index
[1]  39 204 380 568  69 193 248
Etapa 6

Obtener los coeficientes


  • Las observaciones se multiplican por los coeficientes para obtener el vector perpendicular al hiperplano que resuelve el problema
svm.lineal$coefs
             [,1]
[1,]  0.367711966
[2,]  0.098151548
[3,]  0.004681961
[4,]  0.529456508
[5,] -0.867651356
[6,] -0.004175613
[7,] -0.128175015
Etapa 6

Obtener w_0 (término independiente)

svm.lineal$rho
[1] -2.17011e-05
Etapa 7

Resultados gráficos

x.svm <- x[svm.lineal$index,]
w <- crossprod(x.svm, svm.lineal$coefs)
w0 <- svm.lineal$rho

plot(x, pch = pchn, bg = colores, xlab='Suavidad', ylab='Puntos Cóncavos')
abline(w0/w[2], -w[1]/w[2], lwd=2, col='blue')

Etapa 8

Interpretaciones