Entrenamiento y predicciones usando Regresión lineal y SVM

Cargamos librerias

library(e1071)
library(knitr)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(corrplot)
## corrplot 0.92 loaded
library(visreg)
library(ggplot2)
library(caret)
## Loading required package: lattice

Estableemos nuestro directorio para trabajar con los datos y hacemos análisis exploratorio de los datos.

datos_entrenamiento = read.csv(file = "/Users/macbookair/Desktop/R (MASTER)/TABLON_ENTRENAMIENTO.csv", header = TRUE, sep = ";")
summary(datos_entrenamiento) 
##      TARGET            VAR1           VAR2             VAR3            VAR4    
##  Min.   :0.1277   Min.   : 1.0   Min.   : 0.500   Min.   :1.000   Min.   :300  
##  1st Qu.:2.2131   1st Qu.:13.0   1st Qu.: 0.750   1st Qu.:1.000   1st Qu.:300  
##  Median :3.5503   Median :25.5   Median : 2.500   Median :3.000   Median :400  
##  Mean   :3.0593   Mean   :25.5   Mean   : 3.893   Mean   :3.333   Mean   :400  
##  3rd Qu.:4.1773   3rd Qu.:38.0   3rd Qu.: 7.500   3rd Qu.:6.000   3rd Qu.:500  
##  Max.   :4.6191   Max.   :50.0   Max.   :10.000   Max.   :6.000   Max.   :500
str(datos_entrenamiento)
## 'data.frame':    3150 obs. of  5 variables:
##  $ TARGET: num  0.128 0.138 0.167 0.277 0.376 ...
##  $ VAR1  : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ VAR2  : num  0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 ...
##  $ VAR3  : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ VAR4  : int  300 300 300 300 300 300 300 300 300 300 ...
head(datos_entrenamiento)
##     TARGET VAR1 VAR2 VAR3 VAR4
## 1 0.127681    1  0.5    1  300
## 2 0.137929    2  0.5    1  300
## 3 0.166577    3  0.5    1  300
## 4 0.276655    4  0.5    1  300
## 5 0.375599    5  0.5    1  300
## 6 0.537873    6  0.5    1  300

Revisamos si existen nulos

colSums(is.na(datos_entrenamiento))
## TARGET   VAR1   VAR2   VAR3   VAR4 
##      0      0      0      0      0

Graficamos las variables

# Creamos gráficos de dispersión para cada una de las variables independientes y observamos su relación con TARGET

ggplot(datos_entrenamiento, aes(x = VAR1, y = TARGET)) +
  geom_point()

ggplot(datos_entrenamiento, aes(x = VAR2, y = TARGET)) +
  geom_point()

ggplot(datos_entrenamiento, aes(x = VAR3, y = TARGET)) +
  geom_point()

ggplot(datos_entrenamiento, aes(x = VAR4, y = TARGET)) +
  geom_point()

Modelo de regresión lineal

Al ser TARGET, la variable que queremos predecir, una variable continua, el tipo de modelo que tenemos que usar para predecirla es un modelo de regresión lineal.

modelo = lm(TARGET ~ VAR1 + VAR2 + VAR3 + VAR4, data = datos_entrenamiento)
summary(modelo)
## 
## Call:
## lm(formula = TARGET ~ VAR1 + VAR2 + VAR3 + VAR4, data = datos_entrenamiento)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.31196 -0.49367  0.09087  0.47884  1.00021 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.9167535  0.0552213  16.601  < 2e-16 ***
## VAR1         0.0868552  0.0006762 128.455  < 2e-16 ***
## VAR2         0.0574772  0.0028297  20.312  < 2e-16 ***
## VAR3        -0.0196577  0.0047486  -4.140 3.57e-05 ***
## VAR4        -0.0005762  0.0001195  -4.822 1.49e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.5476 on 3145 degrees of freedom
## Multiple R-squared:  0.8435, Adjusted R-squared:  0.8433 
## F-statistic:  4238 on 4 and 3145 DF,  p-value: < 2.2e-16

Todos los coeficientes tienen p-valores muy bajos (< 0.05), lo que sugiere que son estadísticamente significativos.

R-cuadrado indica que el 84.35% de la variabilidad en la variable dependiente es explicada por el modelo.

plot(modelo)

Predicciones

library(e1071)
datos_test =  read.csv(file = "/Users/macbookair/Desktop/R (MASTER)/TABLON_VALIDACION.csv", header = TRUE, sep = ";")
predicciones = predict(modelo, newdata = datos_test )
#Predicciones
head(predicciones)
##         1         2         3         4         5         6 
## 0.8570753 0.9439305 1.0307857 1.1176409 1.2044960 1.2913512
# MSE
print(sprintf("Media de errores al cuadrado (MSE): %.3f", sqrt(mean((predicciones - datos_test$TARGET)^2))))
## [1] "Media de errores al cuadrado (MSE): 0.560"
# R2 
print(sprintf("R2: %.3f", R2(predicciones, datos_test$TARGET)))
## [1] "R2: 0.844"

R-cuadrado sugiere que el 84.4% de la variabilidad en la variable de respuesta es explicada por el modelo. Esto es bastante bueno.

El valor de la Media de errores al cuadrado es 0.560, relativamente bajo, lo cual es un buen indicador.

Modelo de Super Vector Machines (SVM)

modelo_svm = svm(TARGET ~ ., data = datos_entrenamiento, kernel = "linear")
print(modelo_svm)
## 
## Call:
## svm(formula = TARGET ~ ., data = datos_entrenamiento, kernel = "linear")
## 
## 
## Parameters:
##    SVM-Type:  eps-regression 
##  SVM-Kernel:  linear 
##        cost:  1 
##       gamma:  0.25 
##     epsilon:  0.1 
## 
## 
## Number of Support Vectors:  2682

Predicciones y evaluación del modelo

predicciones_svm = predict(modelo_svm, newdata = datos_test)
head(predicciones_svm)
##        1        2        3        4        5        6 
## 1.152199 1.231549 1.310898 1.390248 1.469597 1.548947
# Evalúa el rendimiento del modelo SVM
print(sprintf("Media de errores al cuadrado (MSE) del modelo SVM: %.3f", sqrt(mean((predicciones_svm - datos_test$TARGET)^2))))
## [1] "Media de errores al cuadrado (MSE) del modelo SVM: 0.573"
print(sprintf("R2 del modelo SVM: %.3f", R2(predicciones_svm, datos_test$TARGET)))
## [1] "R2 del modelo SVM: 0.842"

R-cuadrado sugiere que el 84.2% de la variabilidad en la variable de respuesta es explicada por el modelo. Sigue siendo bueno aunque el modelo de regresión lineal tuvo mejor desempeño.

El valor de la Media de errores al cuadrado es 0.573, es bueno pero de igual forma aquí el modelo de regresión lineal se desempeñó mejor con un MSE ligeramente menor.