library(readr)
Census <- read_csv("E:/U-MAQUINAS DE APRENDIZAJE/EXAMEN PARCIAL/Census.csv")
## Rows: 32561 Columns: 14
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (14): V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Census[,14]<-as.factor(Census$V14)
Census=na.omit(Census)
dim(Census)
## [1] 30162 14
sum(is.na(Census))
## [1] 0
set.seed(2023)
muestra <- sample(nrow(Census), 2000)
Census_data <- Census[muestra,]
set.seed(2023)
muestra <- sample(2000, 1500)
entrenamiento <- Census_data[muestra,]
prueba <- Census_data[-muestra,]
dim(entrenamiento)[1]
## [1] 1500
dim(prueba)[1]
## [1] 500
library("e1071")
## Warning: package 'e1071' was built under R version 4.2.3
svm_model1 <- svm(V14 ~ ., data=entrenamiento, kernel="linear",scale = TRUE)
svm_model2 <- svm(V14 ~ ., data=entrenamiento, kernel="polynomial",scale = TRUE)
svm_model3 <- svm(V14 ~ ., data=entrenamiento, kernel="sigmoid",scale = TRUE)
svm_model4 <- svm(V14 ~ ., data=entrenamiento, kernel="radial",scale = TRUE)
Analisis grafico de la variable V1 y V4
plot(x=svm_model1, data=entrenamiento, V1~V4)
plot(x=svm_model2, data=entrenamiento, V1~V4)
plot(x=svm_model3, data=entrenamiento, V1~V4)
plot(x=svm_model4, data=entrenamiento, V1~V4)
Se observa gráficamente que para las variables V1 y V4 los vectores de soporte clasifican las observaciones uno mejor que otro. Se opto por este par de variables debido a que presentan una mejor visualizacion grafica y comprension de la clasificacion.
Se realizo el analisis manteniendo los hiperparametros por defecto, y creamos 4 modelos modificando solo el kernel para apreciar cual de ellos realiza una mejor clasificacion segun la disposicion de la muestra extraida, que a nivel cuantitativo se reflejara en la menor tasa de error.
summary(svm_model1)
##
## Call:
## svm(formula = V14 ~ ., data = entrenamiento, kernel = "linear", scale = TRUE)
##
##
## Parameters:
## SVM-Type: C-classification
## SVM-Kernel: linear
## cost: 1
##
## Number of Support Vectors: 532
##
## ( 268 264 )
##
##
## Number of Classes: 2
##
## Levels:
## 1 2
Segun el resumen del modelo muestra:
pred = predict(svm_model1,prueba)
tab = table(Predicted=pred, Actual = prueba$V14)
tab
## Actual
## Predicted 1 2
## 1 355 49
## 2 23 73
TCC1 = sum(diag(tab)/sum(tab))
TE1 = 1-sum(diag(tab)/sum(tab))
pred = predict(svm_model2,prueba)
tab = table(Predicted=pred, Actual = prueba$V14)
tab
## Actual
## Predicted 1 2
## 1 368 84
## 2 10 38
TCC2 = sum(diag(tab)/sum(tab))
TE2 = 1-sum(diag(tab)/sum(tab))
pred = predict(svm_model3,prueba)
tab = table(Predicted=pred, Actual = prueba$V14)
tab
## Actual
## Predicted 1 2
## 1 326 59
## 2 52 63
TCC3 = sum(diag(tab)/sum(tab))
TE3 = 1-sum(diag(tab)/sum(tab))
pred = predict(svm_model4,prueba)
tab = table(Predicted=pred, Actual = prueba$V14)
tab
## Actual
## Predicted 1 2
## 1 355 53
## 2 23 69
TCC4 = sum(diag(tab)/sum(tab))
TE4 = 1-sum(diag(tab)/sum(tab))
tabla<-data.frame(row.names = c("Tasa de correcta Clasificacion","Tasa de Error"),
"linear"=c(TCC1,TE1),
"polynomial"=c(TCC2,TE2),
"sigmoid"=c(TCC3,TE3),
"radial"=c(TCC4,TE4))
tabla
## linear polynomial sigmoid radial
## Tasa de correcta Clasificacion 0.856 0.812 0.778 0.848
## Tasa de Error 0.144 0.188 0.222 0.152
Se observa que la menor tasa de error corresponderia al modelo lineal luego el radial aunque la diferencia es minima. Para la cantidad de variables el kernel lineal funciona bien aunque nos inclinariamos por el radial debido a la forma en que esta clasifica graficamente a las observaciones.
Al observar buenos valores de accuracy esto nos indica que el algoritmo de SVM logra buena clasificacion, apesar de las variables originales sin escalamiento V10 y V11 que tienen en su columnas una mayor cantidad de “ceros” y saltos en valores numericos de 4 cifras, ademas la variable V9 que es dicotomica tendria un comportamiento tipo factor, las cuales fueron escaladas en el modelo.
library("e1071")
svm_model1 <- svm(V14 ~ ., data=entrenamiento[,-c(9,10,11)], kernel="linear",scale = TRUE)
svm_model2 <- svm(V14 ~ ., data=entrenamiento[,-c(9,10,11)], kernel="polynomial",scale = TRUE)
svm_model3 <- svm(V14 ~ ., data=entrenamiento[,-c(9,10,11)], kernel="sigmoid",scale = TRUE)
svm_model4 <- svm(V14 ~ ., data=entrenamiento[,-c(9,10,11)], kernel="radial",scale = TRUE)
pred = predict(svm_model1,prueba)
tab = table(Predicted=pred, Actual = prueba$V14)
tab
## Actual
## Predicted 1 2
## 1 352 60
## 2 26 62
TCC1 = sum(diag(tab)/sum(tab))
TE1 = 1-sum(diag(tab)/sum(tab))
pred = predict(svm_model2,prueba)
tab = table(Predicted=pred, Actual = prueba$V14)
tab
## Actual
## Predicted 1 2
## 1 365 78
## 2 13 44
TCC2 = sum(diag(tab)/sum(tab))
TE2 = 1-sum(diag(tab)/sum(tab))
pred = predict(svm_model3,prueba)
tab = table(Predicted=pred, Actual = prueba$V14)
tab
## Actual
## Predicted 1 2
## 1 330 63
## 2 48 59
TCC3 = sum(diag(tab)/sum(tab))
TE3 = 1-sum(diag(tab)/sum(tab))
pred = predict(svm_model4,prueba)
tab = table(Predicted=pred, Actual = prueba$V14)
tab
## Actual
## Predicted 1 2
## 1 357 68
## 2 21 54
TCC4 = sum(diag(tab)/sum(tab))
TE4 = 1-sum(diag(tab)/sum(tab))
tabla<-data.frame(row.names = c("Tasa de correcta Clasificacion","Tasa de Error"),
"linear"=c(TCC1,TE1),
"polynomial"=c(TCC2,TE2),
"sigmoid"=c(TCC3,TE3),
"radial"=c(TCC4,TE4))
tabla
## linear polynomial sigmoid radial
## Tasa de correcta Clasificacion 0.828 0.818 0.778 0.822
## Tasa de Error 0.172 0.182 0.222 0.178
Se puede observar que en comparacion a la tabla anterior el kernel lineal y radial aumentaron la tasa de error en unos puntos porcentuales.
Lo cual nos lleva a la conclusion que no fue tan necesario eliminar las variables, dado que como el algoritmo es robusto realiza el modelamiento sin problema alguno con todas las variables predictoras originales y se obtiene una clasificacion apreciable.