library(glmnet)
## Cargando paquete requerido: Matrix
## Loaded glmnet 4.1-8
library(caret)
## Cargando paquete requerido: ggplot2
## Cargando paquete requerido: lattice
str(carros)
## 'data.frame': 93 obs. of 27 variables:
## $ ID : int 1 2 3 4 5 6 7 8 9 10 ...
## $ tipo : chr "Small" "Midsize" "Compact" "Midsize" ...
## $ millas_por_galon_ciudad : int 25 18 20 19 22 22 19 16 19 16 ...
## $ millas_por_galon_carretera: int 31 25 26 26 30 31 28 25 27 25 ...
## $ numero_de_airbags : chr "No tiene" "Conductor y copiloto" "Conductor" "Conductor y copiloto" ...
## $ traccion : chr "Delantera" "Delantera" "Delantera" "Delantera" ...
## $ cilindros : int 4 6 6 6 4 4 6 6 6 8 ...
## $ litros_motor : num 1.8 3.2 2.8 2.8 3.5 2.2 3.8 5.7 3.8 4.9 ...
## $ caballos_fuerza : int 140 200 172 172 208 110 170 180 170 200 ...
## $ revoluciones_por_minuto : int 6300 5500 5500 5500 5700 5200 4800 4000 4800 4100 ...
## $ rev_motor_por_milla : int 2890 2335 2280 2535 2545 2565 1570 1320 1690 1510 ...
## $ transmision_manual : chr "Si" "Si" "Si" "Si" ...
## $ capacidad_tanque : num 13.2 18 16.9 21.1 21.1 16.4 18 23 18.8 18 ...
## $ capacidad_pasajeros : int 5 5 5 6 4 6 6 6 5 6 ...
## $ longitud : int 177 195 180 193 186 189 200 216 198 206 ...
## $ distancia_entre_ruedas : int 102 115 102 106 109 105 111 116 108 114 ...
## $ ancho : int 68 71 67 70 69 69 74 78 73 73 ...
## $ espacio_para_dar_la_u : int 37 38 37 37 39 41 42 45 41 43 ...
## $ espacio_asiento_trasero : num 26.5 30 28 31 27 28 30.5 30.5 26.5 35 ...
## $ capacidad_baul : num 11 15 14 17 13 16 17 21 14 18 ...
## $ peso_en_libras : int 2705 3560 3375 3405 3640 2880 3470 4105 3495 3620 ...
## $ hecho_o_no_en_USA : chr "Hecho fuera de USA" "Hecho fuera de USA" "Hecho fuera de USA" "Hecho fuera de USA" ...
## $ precio_basico : num 12.9 29.2 25.9 30.8 23.7 14.2 19.9 22.6 26.3 33 ...
## $ precio_promedio : num 15.9 33.9 29.1 37.7 30 15.7 20.8 23.7 26.3 34.7 ...
## $ precio_equipado : num 18.8 38.7 32.3 44.6 36.2 17.3 21.7 24.9 26.3 36.3 ...
## $ fabricante : chr "Acura" "Acura" "Audi" "Audi" ...
## $ modelo : chr "Integra" "Legend" "90" "100" ...
De la estructura de los datos se obtienen las siguientes observaciones que llevarán a transformaciones de preparación de los datos (feature engineering):
1- Si la variable dependiente es el precio, hay 3 precios disponibles. Usar uno de ellos como predictor del otro probablemente no tiene sentido de negocio, porque no es el tipo de característica que va a estar disponible para predecir el precio de un nuevo vehículo. Por eso, dos de ellos serán descartados (dejaremos el precio promedio)
2- Las variables predictoras numéricas están todas asociadas a características físicas del carro. El ID del caso debe ser retirado como variable predictora.
3- Existen un conjunto de datos categóricos (tipo factor en R) que debemos transformar si deseamos que se incluyan como variables predictoras. Los airbags, el tipo de tracción y de transmisión son características no numéricas del vehículo. El tipo de vehículo. y el lugar de fabricación son posibles condicionantes del precio del vehículo también. La marca (fabricante) puede resultar interesante, más aún si tenemos en cuenta que la marca es un intangible muy importante en un vehículo, y hasta ahora ninguna de las variables podía capturar directamente intangibles de los vehículos. El modelo, en cambio, es casi único por cada vehículo (hay 93 modelos) luego es casi una variable identificadora y será descartada. Todas las demás variables categóricas cada una con k categorías a incluir se convertirán en k-1 variables binarias,
Dado que existen más de 20 posibles variables predictoras para un conjunto de tan solo 97 casos, el riesgo de overfitting puede ser grande, más aún si tenemos en cuenta que vamos a crear variables binarias para múltiples variables categóricas y requerimos bases de datos de entrenamiento y validación, incrementando aún más el riesgo mencionado. Todo ello va a implicar decisiones en el modelo y su validación.
Preparemos la base de datos:
#guardar los modelos de los carros para interpretación
carmodelos<-carros$modelo
#remover el ID, el modelo y dos de los precios
carros<-within(carros,rm(ID,modelo,precio_basico,precio_equipado))
#crear variables dummy (binarias)
set.seed(1)
carroswin<-dummyVars("~.",data=carros)
carrosfin<-as.data.frame(predict(carroswin,newdata=carros))
summary(carrosfin)
## tipoCompact tipoLarge tipoMidsize tipoSmall
## Min. :0.000 Min. :0.0000 Min. :0.0000 Min. :0.0000
## 1st Qu.:0.000 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.0000
## Median :0.000 Median :0.0000 Median :0.0000 Median :0.0000
## Mean :0.172 Mean :0.1183 Mean :0.2366 Mean :0.2258
## 3rd Qu.:0.000 3rd Qu.:0.0000 3rd Qu.:0.0000 3rd Qu.:0.0000
## Max. :1.000 Max. :1.0000 Max. :1.0000 Max. :1.0000
## tipoSporty tipoVan millas_por_galon_ciudad
## Min. :0.0000 Min. :0.00000 Min. :15.00
## 1st Qu.:0.0000 1st Qu.:0.00000 1st Qu.:18.00
## Median :0.0000 Median :0.00000 Median :21.00
## Mean :0.1505 Mean :0.09677 Mean :22.37
## 3rd Qu.:0.0000 3rd Qu.:0.00000 3rd Qu.:25.00
## Max. :1.0000 Max. :1.00000 Max. :46.00
## millas_por_galon_carretera numero_de_airbagsConductor
## Min. :20.00 Min. :0.0000
## 1st Qu.:26.00 1st Qu.:0.0000
## Median :28.00 Median :0.0000
## Mean :29.09 Mean :0.4624
## 3rd Qu.:31.00 3rd Qu.:1.0000
## Max. :50.00 Max. :1.0000
## numero_de_airbagsConductor y copiloto numero_de_airbagsNo tiene
## Min. :0.000 Min. :0.0000
## 1st Qu.:0.000 1st Qu.:0.0000
## Median :0.000 Median :0.0000
## Mean :0.172 Mean :0.3656
## 3rd Qu.:0.000 3rd Qu.:1.0000
## Max. :1.000 Max. :1.0000
## traccionDoble tracci\xf3n traccionDelantera traccionTrasera
## Min. :0.0000 Min. :0.0000 Min. :0.000
## 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.000
## Median :0.0000 Median :1.0000 Median :0.000
## Mean :0.1075 Mean :0.7204 Mean :0.172
## 3rd Qu.:0.0000 3rd Qu.:1.0000 3rd Qu.:0.000
## Max. :1.0000 Max. :1.0000 Max. :1.000
## cilindros litros_motor caballos_fuerza revoluciones_por_minuto
## Min. :3.000 Min. :1.000 Min. : 55.0 Min. :3800
## 1st Qu.:4.000 1st Qu.:1.800 1st Qu.:103.0 1st Qu.:4800
## Median :4.000 Median :2.400 Median :140.0 Median :5200
## Mean :4.957 Mean :2.668 Mean :143.8 Mean :5281
## 3rd Qu.:6.000 3rd Qu.:3.300 3rd Qu.:170.0 3rd Qu.:5750
## Max. :8.000 Max. :5.700 Max. :300.0 Max. :6500
## rev_motor_por_milla transmision_manualNo transmision_manualSi capacidad_tanque
## Min. :1320 Min. :0.0000 Min. :0.0000 Min. : 9.20
## 1st Qu.:1985 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:14.50
## Median :2340 Median :0.0000 Median :1.0000 Median :16.40
## Mean :2332 Mean :0.3441 Mean :0.6559 Mean :16.66
## 3rd Qu.:2565 3rd Qu.:1.0000 3rd Qu.:1.0000 3rd Qu.:18.80
## Max. :3755 Max. :1.0000 Max. :1.0000 Max. :27.00
## capacidad_pasajeros longitud distancia_entre_ruedas ancho
## Min. :2.000 Min. :141.0 Min. : 90.0 Min. :60.00
## 1st Qu.:4.000 1st Qu.:174.0 1st Qu.: 98.0 1st Qu.:67.00
## Median :5.000 Median :183.0 Median :103.0 Median :69.00
## Mean :5.086 Mean :183.2 Mean :103.9 Mean :69.38
## 3rd Qu.:6.000 3rd Qu.:192.0 3rd Qu.:110.0 3rd Qu.:72.00
## Max. :8.000 Max. :219.0 Max. :119.0 Max. :78.00
## espacio_para_dar_la_u espacio_asiento_trasero capacidad_baul peso_en_libras
## Min. :32.00 Min. :17.80 Min. : 6.00 Min. :1695
## 1st Qu.:37.00 1st Qu.:26.00 1st Qu.:12.00 1st Qu.:2620
## Median :39.00 Median :27.50 Median :14.00 Median :3040
## Mean :38.96 Mean :27.68 Mean :14.02 Mean :3073
## 3rd Qu.:41.00 3rd Qu.:30.00 3rd Qu.:16.00 3rd Qu.:3525
## Max. :45.00 Max. :36.00 Max. :22.00 Max. :4105
## hecho_o_no_en_USAHecho en USA hecho_o_no_en_USAHecho fuera de USA
## Min. :0.0000 Min. :0.0000
## 1st Qu.:0.0000 1st Qu.:0.0000
## Median :1.0000 Median :0.0000
## Mean :0.5161 Mean :0.4839
## 3rd Qu.:1.0000 3rd Qu.:1.0000
## Max. :1.0000 Max. :1.0000
## precio_promedio fabricanteAcura fabricanteAudi fabricanteBMW
## Min. : 7.40 Min. :0.00000 Min. :0.00000 Min. :0.00000
## 1st Qu.:12.20 1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.:0.00000
## Median :17.70 Median :0.00000 Median :0.00000 Median :0.00000
## Mean :19.51 Mean :0.02151 Mean :0.02151 Mean :0.01075
## 3rd Qu.:23.30 3rd Qu.:0.00000 3rd Qu.:0.00000 3rd Qu.:0.00000
## Max. :61.90 Max. :1.00000 Max. :1.00000 Max. :1.00000
## fabricanteBuick fabricanteCadillac fabricanteChevrolet fabricanteChrysler
## Min. :0.00000 Min. :0.00000 Min. :0.00000 Min. :0.00000
## 1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.:0.00000
## Median :0.00000 Median :0.00000 Median :0.00000 Median :0.00000
## Mean :0.04301 Mean :0.02151 Mean :0.08602 Mean :0.03226
## 3rd Qu.:0.00000 3rd Qu.:0.00000 3rd Qu.:0.00000 3rd Qu.:0.00000
## Max. :1.00000 Max. :1.00000 Max. :1.00000 Max. :1.00000
## fabricanteDodge fabricanteEagle fabricanteFord fabricanteGeo
## Min. :0.00000 Min. :0.00000 Min. :0.00000 Min. :0.00000
## 1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.:0.00000
## Median :0.00000 Median :0.00000 Median :0.00000 Median :0.00000
## Mean :0.06452 Mean :0.02151 Mean :0.08602 Mean :0.02151
## 3rd Qu.:0.00000 3rd Qu.:0.00000 3rd Qu.:0.00000 3rd Qu.:0.00000
## Max. :1.00000 Max. :1.00000 Max. :1.00000 Max. :1.00000
## fabricanteHonda fabricanteHyundai fabricanteInfiniti fabricanteLexus
## Min. :0.00000 Min. :0.00000 Min. :0.00000 Min. :0.00000
## 1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.:0.00000
## Median :0.00000 Median :0.00000 Median :0.00000 Median :0.00000
## Mean :0.03226 Mean :0.04301 Mean :0.01075 Mean :0.02151
## 3rd Qu.:0.00000 3rd Qu.:0.00000 3rd Qu.:0.00000 3rd Qu.:0.00000
## Max. :1.00000 Max. :1.00000 Max. :1.00000 Max. :1.00000
## fabricanteLincoln fabricanteMazda fabricanteMercedes-Benz fabricanteMercury
## Min. :0.00000 Min. :0.00000 Min. :0.00000 Min. :0.00000
## 1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.:0.00000
## Median :0.00000 Median :0.00000 Median :0.00000 Median :0.00000
## Mean :0.02151 Mean :0.05376 Mean :0.02151 Mean :0.02151
## 3rd Qu.:0.00000 3rd Qu.:0.00000 3rd Qu.:0.00000 3rd Qu.:0.00000
## Max. :1.00000 Max. :1.00000 Max. :1.00000 Max. :1.00000
## fabricanteMitsubishi fabricanteNissan fabricanteOldsmobile fabricantePlymouth
## Min. :0.00000 Min. :0.00000 Min. :0.00000 Min. :0.00000
## 1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.:0.00000
## Median :0.00000 Median :0.00000 Median :0.00000 Median :0.00000
## Mean :0.02151 Mean :0.04301 Mean :0.04301 Mean :0.01075
## 3rd Qu.:0.00000 3rd Qu.:0.00000 3rd Qu.:0.00000 3rd Qu.:0.00000
## Max. :1.00000 Max. :1.00000 Max. :1.00000 Max. :1.00000
## fabricantePontiac fabricanteSaab fabricanteSaturn fabricanteSubaru
## Min. :0.00000 Min. :0.00000 Min. :0.00000 Min. :0.00000
## 1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.:0.00000
## Median :0.00000 Median :0.00000 Median :0.00000 Median :0.00000
## Mean :0.05376 Mean :0.01075 Mean :0.01075 Mean :0.03226
## 3rd Qu.:0.00000 3rd Qu.:0.00000 3rd Qu.:0.00000 3rd Qu.:0.00000
## Max. :1.00000 Max. :1.00000 Max. :1.00000 Max. :1.00000
## fabricanteSuzuki fabricanteToyota fabricanteVolkswagen fabricanteVolvo
## Min. :0.00000 Min. :0.00000 Min. :0.00000 Min. :0.00000
## 1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.:0.00000
## Median :0.00000 Median :0.00000 Median :0.00000 Median :0.00000
## Mean :0.01075 Mean :0.04301 Mean :0.04301 Mean :0.02151
## 3rd Qu.:0.00000 3rd Qu.:0.00000 3rd Qu.:0.00000 3rd Qu.:0.00000
## Max. :1.00000 Max. :1.00000 Max. :1.00000 Max. :1.00000
carrosfin2<-within(carrosfin,rm(fabricanteLexus,tipoSporty,tracciónTrasera,transmisión_manualSi,
`numero_de_airbagsNo tiene`,
`hecho_o_no_en_USAHecho fuera de USA`))
## Warning in rm(fabricanteLexus, tipoSporty, tracciónTrasera,
## transmisión_manualSi, : objeto 'tracciónTrasera' no encontrado
## Warning in rm(fabricanteLexus, tipoSporty, tracciónTrasera,
## transmisión_manualSi, : objeto 'transmisión_manualSi' no encontrado
#veamos la dimension final de la base de datos
dim(carrosfin2)
## [1] 93 60
#retiro la variable a predecir
predictores<-cbind(as.matrix(carrosfin2[,1:27]),as.matrix(carrosfin2[,29:59]))
La multicolinealidad y la baja relación datos a variables hacen de este problema un caso complicado para las regresiones basadas en mínimos cuadrados. Obtengamos un modelo básico y observémoslo.
##entrenamiento y validación 80-20
set.seed(49584)
sample <- sample.int(nrow(carrosfin2), floor(.8*nrow(carrosfin2)))
carros.train <- carrosfin2[sample, ]
carros.test <- carrosfin2[-sample, ]
#haciendo el modelo
modeloaug<-lm(precio_promedio~.,data=carros.train)
summary(modeloaug)
##
## Call:
## lm(formula = precio_promedio ~ ., data = carros.train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.5080 -0.9991 0.0000 0.8484 2.5280
##
## Coefficients: (6 not defined because of singularities)
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 64.4684147 29.9028457 2.156 0.04345
## tipoCompact -3.6024856 2.3101839 -1.559 0.13459
## tipoLarge 1.8130657 3.7583324 0.482 0.63475
## tipoMidsize 1.5303352 3.4302043 0.446 0.66029
## tipoSmall -4.0013225 1.9422007 -2.060 0.05263
## tipoVan 1.7399073 5.3501413 0.325 0.74840
## millas_por_galon_ciudad 0.2849058 0.3699011 0.770 0.45017
## millas_por_galon_carretera -0.2207619 0.3759656 -0.587 0.56365
## numero_de_airbagsConductor 1.9295984 1.5417841 1.252 0.22518
## `numero_de_airbagsConductor y copiloto` 0.7019062 2.2798388 0.308 0.76136
## `traccionDoble tracci\\xf3n` -2.1582913 3.3076944 -0.653 0.52150
## traccionDelantera -0.5800834 2.1363680 -0.272 0.78877
## traccionTrasera NA NA NA NA
## cilindros 0.9117545 1.0905011 0.836 0.41298
## litros_motor -0.9284601 2.1046087 -0.441 0.66383
## caballos_fuerza 0.0664939 0.0465879 1.427 0.16893
## revoluciones_por_minuto -0.0002577 0.0017712 -0.145 0.88579
## rev_motor_por_milla -0.0005368 0.0019264 -0.279 0.78336
## transmision_manualNo -0.6866302 2.7079451 -0.254 0.80242
## transmision_manualSi NA NA NA NA
## capacidad_tanque 0.8201028 0.4766811 1.720 0.10079
## capacidad_pasajeros -0.9457592 1.3677932 -0.691 0.49723
## longitud 0.1364055 0.1042617 1.308 0.20561
## distancia_entre_ruedas -0.0821904 0.2813804 -0.292 0.77322
## ancho -1.2591775 0.4395051 -2.865 0.00957
## espacio_para_dar_la_u -0.2103207 0.3431502 -0.613 0.54684
## espacio_asiento_trasero 0.2798630 0.3633129 0.770 0.45012
## capacidad_baul -0.3463114 0.3377345 -1.025 0.31742
## peso_en_libras 0.0044807 0.0047712 0.939 0.35888
## `hecho_o_no_en_USAHecho en USA` 2.8044715 5.6124186 0.500 0.62275
## fabricanteAcura 6.1038227 4.6970398 1.300 0.20855
## fabricanteAudi 6.5038205 3.1886295 2.040 0.05481
## fabricanteBMW -3.1784917 4.3305868 -0.734 0.47149
## fabricanteBuick -2.0460083 3.9951405 -0.512 0.61417
## fabricanteCadillac 4.2465123 5.5676597 0.763 0.45454
## fabricanteChevrolet -3.9613108 3.6546030 -1.084 0.29129
## fabricanteChrysler -2.6258746 4.9834493 -0.527 0.60405
## fabricanteDodge -4.2029503 3.9424546 -1.066 0.29909
## fabricanteEagle NA NA NA NA
## fabricanteFord -3.4203894 3.8413579 -0.890 0.38383
## fabricanteGeo -0.2240785 5.0195015 -0.045 0.96484
## fabricanteHonda -0.6300359 4.9657573 -0.127 0.90031
## fabricanteHyundai -5.2258748 3.3954444 -1.539 0.13946
## fabricanteInfiniti NA NA NA NA
## fabricanteLincoln 10.4571342 4.9395415 2.117 0.04699
## fabricanteMazda -0.5360288 3.9797724 -0.135 0.89420
## `fabricanteMercedes-Benz` 31.2713089 4.7415715 6.595 2.01e-06
## fabricanteMercury -7.6594158 4.9978265 -1.533 0.14105
## fabricanteMitsubishi 0.6375606 4.6007784 0.139 0.89117
## fabricanteNissan -2.9461685 3.4434272 -0.856 0.40236
## fabricanteOldsmobile -3.3404959 4.2137616 -0.793 0.43722
## fabricantePlymouth -4.4124918 5.5244878 -0.799 0.43384
## fabricantePontiac -2.6240870 4.0012033 -0.656 0.51941
## fabricanteSaab 8.7781707 4.0615958 2.161 0.04298
## fabricanteSaturn NA NA NA NA
## fabricanteSubaru 0.1219518 4.3031989 0.028 0.97767
## fabricanteSuzuki NA NA NA NA
## fabricanteToyota 0.0071963 3.7434189 0.002 0.99849
## fabricanteVolkswagen -1.7646822 3.6900410 -0.478 0.63767
## fabricanteVolvo 1.6616299 3.4409064 0.483 0.63441
##
## (Intercept) *
## tipoCompact
## tipoLarge
## tipoMidsize
## tipoSmall .
## tipoVan
## millas_por_galon_ciudad
## millas_por_galon_carretera
## numero_de_airbagsConductor
## `numero_de_airbagsConductor y copiloto`
## `traccionDoble tracci\\xf3n`
## traccionDelantera
## traccionTrasera
## cilindros
## litros_motor
## caballos_fuerza
## revoluciones_por_minuto
## rev_motor_por_milla
## transmision_manualNo
## transmision_manualSi
## capacidad_tanque
## capacidad_pasajeros
## longitud
## distancia_entre_ruedas
## ancho **
## espacio_para_dar_la_u
## espacio_asiento_trasero
## capacidad_baul
## peso_en_libras
## `hecho_o_no_en_USAHecho en USA`
## fabricanteAcura
## fabricanteAudi .
## fabricanteBMW
## fabricanteBuick
## fabricanteCadillac
## fabricanteChevrolet
## fabricanteChrysler
## fabricanteDodge
## fabricanteEagle
## fabricanteFord
## fabricanteGeo
## fabricanteHonda
## fabricanteHyundai
## fabricanteInfiniti
## fabricanteLincoln *
## fabricanteMazda
## `fabricanteMercedes-Benz` ***
## fabricanteMercury
## fabricanteMitsubishi
## fabricanteNissan
## fabricanteOldsmobile
## fabricantePlymouth
## fabricantePontiac
## fabricanteSaab *
## fabricanteSaturn
## fabricanteSubaru
## fabricanteSuzuki
## fabricanteToyota
## fabricanteVolkswagen
## fabricanteVolvo
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.377 on 20 degrees of freedom
## Multiple R-squared: 0.9829, Adjusted R-squared: 0.9375
## F-statistic: 21.67 on 53 and 20 DF, p-value: 3.13e-10
modelocarstep<-step(modeloaug,direction="both",trace=0)
summary(modelocarstep)
##
## Call:
## lm(formula = precio_promedio ~ tipoCompact + tipoSmall + millas_por_galon_ciudad +
## millas_por_galon_carretera + numero_de_airbagsConductor +
## `traccionDoble tracci\xf3n` + cilindros + caballos_fuerza +
## capacidad_tanque + capacidad_pasajeros + longitud + ancho +
## espacio_para_dar_la_u + espacio_asiento_trasero + capacidad_baul +
## peso_en_libras + `hecho_o_no_en_USAHecho en USA` + fabricanteAcura +
## fabricanteAudi + fabricanteBMW + fabricanteBuick + fabricanteChevrolet +
## fabricanteChrysler + fabricanteDodge + fabricanteFord + fabricanteHyundai +
## fabricanteLincoln + `fabricanteMercedes-Benz` + fabricanteMercury +
## fabricanteNissan + fabricanteOldsmobile + fabricantePlymouth +
## fabricantePontiac + fabricanteSaab + fabricanteVolkswagen +
## fabricanteVolvo, data = carros.train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.8630 -0.9726 0.0000 0.8940 2.8987
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 62.191108 11.891904 5.230 6.92e-06 ***
## tipoCompact -4.817800 0.875996 -5.500 2.99e-06 ***
## tipoSmall -4.759652 1.060651 -4.487 6.78e-05 ***
## millas_por_galon_ciudad 0.307848 0.211122 1.458 0.153236
## millas_por_galon_carretera -0.309591 0.205181 -1.509 0.139826
## numero_de_airbagsConductor 1.704492 0.622482 2.738 0.009443 **
## `traccionDoble tracci\\xf3n` -1.414351 1.086822 -1.301 0.201179
## cilindros 1.016270 0.498873 2.037 0.048838 *
## caballos_fuerza 0.067745 0.016404 4.130 0.000199 ***
## capacidad_tanque 0.777155 0.242597 3.203 0.002792 **
## capacidad_pasajeros -1.034024 0.606546 -1.705 0.096621 .
## longitud 0.162887 0.047541 3.426 0.001513 **
## ancho -1.397943 0.221756 -6.304 2.44e-07 ***
## espacio_para_dar_la_u -0.265213 0.186707 -1.420 0.163841
## espacio_asiento_trasero 0.367232 0.174660 2.103 0.042368 *
## capacidad_baul -0.433078 0.177858 -2.435 0.019834 *
## peso_en_libras 0.003745 0.002010 1.863 0.070383 .
## `hecho_o_no_en_USAHecho en USA` 4.379153 1.643009 2.665 0.011332 *
## fabricanteAcura 5.159037 2.104144 2.452 0.019054 *
## fabricanteAudi 6.361459 1.772664 3.589 0.000958 ***
## fabricanteBMW -3.210246 2.409852 -1.332 0.190964
## fabricanteBuick -4.073083 1.700358 -2.395 0.021775 *
## fabricanteChevrolet -5.437539 1.716759 -3.167 0.003079 **
## fabricanteChrysler -5.025764 1.753390 -2.866 0.006813 **
## fabricanteDodge -6.096914 1.889380 -3.227 0.002620 **
## fabricanteFord -4.942656 1.751307 -2.822 0.007628 **
## fabricanteHyundai -5.582188 1.246309 -4.479 6.96e-05 ***
## fabricanteLincoln 8.684916 2.435613 3.566 0.001023 **
## `fabricanteMercedes-Benz` 30.785710 2.246037 13.707 4.49e-16 ***
## fabricanteMercury -10.088408 2.372749 -4.252 0.000138 ***
## fabricanteNissan -2.728505 1.383934 -1.972 0.056173 .
## fabricanteOldsmobile -5.528283 1.898789 -2.911 0.006062 **
## fabricantePlymouth -6.659689 2.868743 -2.321 0.025875 *
## fabricantePontiac -3.856323 1.923688 -2.005 0.052359 .
## fabricanteSaab 8.590120 2.186790 3.928 0.000360 ***
## fabricanteVolkswagen -2.409098 1.632979 -1.475 0.148598
## fabricanteVolvo 2.064267 1.584927 1.302 0.200816
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.816 on 37 degrees of freedom
## Multiple R-squared: 0.9815, Adjusted R-squared: 0.9635
## F-statistic: 54.6 on 36 and 37 DF, p-value: < 2.2e-16
El modelo incluyó 25 variables predictoras. Observe que varias de ellas (11 en total) son no significativas. Una mirada, por ejemplo, a los coeficientes de millas por galón en ciudad y en carretera muestran que tienen signos contrarios, lo que no tiene sentido de negocio y es un clásico signo de multicolinealidad.
La cantidad de variables y la multicolinealidad generan un modelo que, a simple vista, se ve extraño.
Parte de la problemática es la restricción de que los estimadores deben ser insesgados, y por tanto la suma de los residuales debe ser cero. Eso puede crear una alta varianza en los estimadores, al punto de ver los resultados que observamos.
Puesto que el error en una predicción es la suma de el sesgo y la varianza de la estimación (más el error residual), permitir cierto sesgo que disminuya en mayor proporción la varianza es un mecanismo que claramente puede permitir mejores predicciones.
Para usar la librería glmnet es necesario crear matrices separadas para los predictores y la variable pendiente. En este notebook ya creamos los predictores: falta la variable dependiente
predic.train<-cbind(as.matrix(carros.train[,1:27]),as.matrix(carros.train[,29:59]))
precio.train<-as.matrix(carros.train[,28])
predic.test<-cbind(as.matrix(carros.test[,1:27]),as.matrix(carros.test[,29:59]))
precio.test<-as.matrix(carros.test[,28])
Ahora vamos a crear modelos de redes elásticas para observar cómo se comportan para diversos valores del parámetro de penalización \(\lambda\).
Es importante anotar que, por defecto, las variables son estandarizadas por el procedimiento.
Con alpha=1 creamos un modelo lasso (penalizado en los valores absolutos de los coeficientes o L1) y con alpha=0 un ridge (penalizado en cuadrados de los coeficientes, o L2). Con 0.5 creamos una red elástica.
El hiperparámetro \(\lambda\) genera cambios importantes en los modelos, y la escogencia de su valor no siempre es fácil. Veamos, por ejemplo, cómo cambian los coeficientes de una regresión regularizada dependiendo de \(\lambda\):
fitlasso<-glmnet(predic.train,precio.train,alpha = 1)
fitridge<-glmnet(predic.train,precio.train,alpha = 0)
#ver la variacion de los coeficientes con el lambda
plot(fitlasso, xvar="lambda")
plot(fitridge, xvar="lambda")
Se puede observar como los valores de \(\lambda\) disminuyen los parámetros desde los de una regresión de mínimos cuadrados (a la izquierda) hasta una penalización alta de coeficientes y, por tanto, un alto sesgo (a la derecha). También puede verse que en el caso de lasso los parámetros se van volviendo cero de manera independiente, mientras en ridge la reducción tiende a ser general (en todos los parámetros)
¿Cómo escoger lambda? Una buena manera es probar el error que \(\lambda\) comete en diferentes bases de “prueba”. La idea detrás de la validación cruzada es generar múltiples bases de entrenamiento y validación, creando múltiples modelos en la base de entrenamiento y evaluándolos múltiples veces en la base de validación.
Vamos a hacerlo para el caso de Ridge inicialmente:
foundridge<-cv.glmnet(predic.train, precio.train,alpha=0,nfolds=5)
#grafico lambda vs mse
plot(foundridge)
#veo los lambda minimos
foundridge$lambda.1se
## [1] 863.6858
foundridge$lambda.min
## [1] 310.3926
Este gráfico muestra los errores promedio de cada \(\lambda\), junto con sus errores estándar. El valor que minimiza esos errores en promedio es 1.77 (0.65 en el gráfico, donde se ve el logaritmo), pero se suele sugerir (Hastie lo hace) que se utilice un valor más alto, a no más de una desviación estándar del valor del error más bajo, para obtener un modelo más parsimonioso con un error similar, y evadir el overfitting.
Miremos los resultados usando ese valor de \(\lambda\) con una desviación estándar más: 34.83
coef(foundridge,s=foundridge$lambda.1se)
## 59 x 1 sparse Matrix of class "dgCMatrix"
## s1
## (Intercept) 286.80209111
## tipoCompact -6.66921938
## tipoLarge 6.01529852
## tipoMidsize 39.69968070
## tipoSmall -79.85256994
## tipoVan 123.40639583
## millas_por_galon_ciudad -6.76740919
## millas_por_galon_carretera -7.40416083
## numero_de_airbagsConductor 20.19647536
## numero_de_airbagsConductor y copiloto 28.94158491
## traccionDoble tracci\xf3n 25.64580757
## traccionDelantera -37.03782964
## traccionTrasera 36.29335909
## cilindros 25.61513067
## litros_motor 34.22956911
## caballos_fuerza 0.80200102
## revoluciones_por_minuto -0.02158018
## rev_motor_por_milla -0.05029534
## transmision_manualNo 35.59339194
## transmision_manualSi -35.66964849
## capacidad_tanque 13.88708924
## capacidad_pasajeros 26.99805815
## longitud 2.49177239
## distancia_entre_ruedas 7.09654418
## ancho 11.03296816
## espacio_para_dar_la_u 9.84051470
## espacio_asiento_trasero 7.45778076
## capacidad_baul 6.83469329
## hecho_o_no_en_USAHecho en USA -25.27336285
## precio_promedio 3.08999739
## fabricanteAcura 49.39309338
## fabricanteAudi 60.47604847
## fabricanteBMW 146.27140652
## fabricanteBuick -14.24037138
## fabricanteCadillac -15.28896753
## fabricanteChevrolet -11.54974619
## fabricanteChrysler 14.28131147
## fabricanteDodge 0.14129654
## fabricanteEagle .
## fabricanteFord -30.30680726
## fabricanteGeo -48.73054617
## fabricanteHonda 18.17905283
## fabricanteHyundai -35.50037766
## fabricanteInfiniti .
## fabricanteLincoln 28.00637825
## fabricanteMazda -25.98576783
## fabricanteMercedes-Benz -22.19009350
## fabricanteMercury 13.15440521
## fabricanteMitsubishi -84.38673247
## fabricanteNissan 87.88031345
## fabricanteOldsmobile -11.63149211
## fabricantePlymouth -39.89675283
## fabricantePontiac -31.46518043
## fabricanteSaab -67.85958485
## fabricanteSaturn -47.23847810
## fabricanteSubaru -8.42056817
## fabricanteSuzuki .
## fabricanteToyota 13.86343879
## fabricanteVolkswagen 29.42976859
Aquí los coeficientes se interpretan en el sentido de sus mayores o menores valores relativos y su signo. Por ejemplo, entre los tamaños, Midsize y small son los más importantes, el primero aumentando el precio, y el último disminuyéndolo. Entre los fabricantes, las marcas de lujo aumentan el precio (Mercedes benz, Saab, Cadillac, Audi, Infinity) mientras que marcas más populares como Hyundai o Mercury lo disminuyen. Coeficientes más cercanos a cero marcan una baja importancia de la variable.
Mucho más interpretable suele ser un Lasso, porque puede llevar a cero muchos coeficientes:
foundlasso<-cv.glmnet(predic.train, precio.train,alpha=0,nfolds=5)
#grafico lambda vs mse
plot(foundlasso)
#veo los lambda minimos
foundlasso$lambda.1se
## [1] 863.6858
coef(fitlasso,s=foundlasso$lambda.min)
## 59 x 1 sparse Matrix of class "dgCMatrix"
## s1
## (Intercept) 16.383434
## tipoCompact .
## tipoLarge .
## tipoMidsize .
## tipoSmall .
## tipoVan .
## millas_por_galon_ciudad -3.770468
## millas_por_galon_carretera .
## numero_de_airbagsConductor .
## numero_de_airbagsConductor y copiloto .
## traccionDoble tracci\xf3n .
## traccionDelantera .
## traccionTrasera .
## cilindros .
## litros_motor 33.968351
## caballos_fuerza .
## revoluciones_por_minuto .
## rev_motor_por_milla .
## transmision_manualNo .
## transmision_manualSi .
## capacidad_tanque 27.544324
## capacidad_pasajeros .
## longitud .
## distancia_entre_ruedas 21.787931
## ancho 4.297684
## espacio_para_dar_la_u .
## espacio_asiento_trasero .
## capacidad_baul .
## hecho_o_no_en_USAHecho en USA .
## precio_promedio .
## fabricanteAcura .
## fabricanteAudi .
## fabricanteBMW .
## fabricanteBuick .
## fabricanteCadillac .
## fabricanteChevrolet .
## fabricanteChrysler .
## fabricanteDodge .
## fabricanteEagle .
## fabricanteFord .
## fabricanteGeo .
## fabricanteHonda .
## fabricanteHyundai .
## fabricanteInfiniti .
## fabricanteLincoln .
## fabricanteMazda .
## fabricanteMercedes-Benz .
## fabricanteMercury .
## fabricanteMitsubishi .
## fabricanteNissan .
## fabricanteOldsmobile .
## fabricantePlymouth .
## fabricantePontiac .
## fabricanteSaab .
## fabricanteSaturn .
## fabricanteSubaru .
## fabricanteSuzuki .
## fabricanteToyota .
## fabricanteVolkswagen .
El modelo sesgado es más simple: un aumento de precio por la relación con los caballos de fuerza y efectos por algunas marcas específicas de lujo o económicas (no todas); pequeños efectos del espacio asiento trasero, el peso, y efectos del tipo de vehiculo. Si se usa el coeficiente de una desviación estándar por encima del mínimo se tiene un modelo sin predictores.
Ahora vamos a modelar una red elástica. Vamos a probar valores de alfa dese 0.1 hasta 0.9 para observar cuál puede ser el mejor:
# aqui hago redes elasticas de 0.1 a 0.9
for (i in 1:10){
assign(paste("found", i, sep=""), cv.glmnet(predic.train, precio.train, nfolds=5,
alpha=i/10,))}
min(foundridge$cvm)
## [1] 23297.92
min(found1$cvm)
## [1] 19683.52
min(found2$cvm)
## [1] 21030.14
min(found3$cvm)
## [1] 25786.55
min(found4$cvm)
## [1] 20676.29
min(found5$cvm)
## [1] 21837.01
min(found6$cvm)
## [1] 21467.52
min(found7$cvm)
## [1] 20947.27
min(found8$cvm)
## [1] 24669.92
min(found9$cvm)
## [1] 23544.19
min(foundlasso$cvm)
## [1] 24560.53
# Extraer los valores mínimos de cvm para cada modelo
min_cvm_values <- sapply(1:10, function(i) min(get(paste("found", i, sep=""))$cvm))
# Crear una tabla con los resultados
results_table <- data.frame(
Model = paste("found", 1:10, sep=""),
Alpha = seq(0.1, 1.0, by=0.1),
Min_CVM = min_cvm_values
)
# Mostrar la tabla
print(results_table)
## Model Alpha Min_CVM
## 1 found1 0.1 19683.52
## 2 found2 0.2 21030.14
## 3 found3 0.3 25786.55
## 4 found4 0.4 20676.29
## 5 found5 0.5 21837.01
## 6 found6 0.6 21467.52
## 7 found7 0.7 20947.27
## 8 found8 0.8 24669.92
## 9 found9 0.9 23544.19
## 10 found10 1.0 22612.86
“Al parecer un modelo ridge y una red elástica con alpha=0.8 pueden ser buenos candidatos. Usaremos Lasso para comparar, dada su simplicidad. Creemos el modelo que nos falta:”
elastic8<-glmnet(predic.train,precio.train,alpha = 0.8)
coef(elastic8,s=found8$lambda.1se)
## 59 x 1 sparse Matrix of class "dgCMatrix"
## s1
## (Intercept) -1364.7294961
## tipoCompact .
## tipoLarge .
## tipoMidsize .
## tipoSmall -6.6030425
## tipoVan .
## millas_por_galon_ciudad -2.7760325
## millas_por_galon_carretera -16.1215481
## numero_de_airbagsConductor .
## numero_de_airbagsConductor y copiloto .
## traccionDoble tracci\xf3n .
## traccionDelantera .
## traccionTrasera .
## cilindros .
## litros_motor 73.6025264
## caballos_fuerza 0.7812161
## revoluciones_por_minuto .
## rev_motor_por_milla .
## transmision_manualNo .
## transmision_manualSi .
## capacidad_tanque 28.3888733
## capacidad_pasajeros .
## longitud 0.6173831
## distancia_entre_ruedas 28.7429447
## ancho 15.5802367
## espacio_para_dar_la_u .
## espacio_asiento_trasero .
## capacidad_baul .
## hecho_o_no_en_USAHecho en USA .
## precio_promedio .
## fabricanteAcura .
## fabricanteAudi .
## fabricanteBMW .
## fabricanteBuick .
## fabricanteCadillac .
## fabricanteChevrolet .
## fabricanteChrysler .
## fabricanteDodge .
## fabricanteEagle .
## fabricanteFord .
## fabricanteGeo .
## fabricanteHonda .
## fabricanteHyundai .
## fabricanteInfiniti .
## fabricanteLincoln .
## fabricanteMazda .
## fabricanteMercedes-Benz .
## fabricanteMercury .
## fabricanteMitsubishi .
## fabricanteNissan .
## fabricanteOldsmobile .
## fabricantePlymouth .
## fabricantePontiac .
## fabricanteSaab .
## fabricanteSaturn .
## fabricanteSubaru .
## fabricanteSuzuki .
## fabricanteToyota .
## fabricanteVolkswagen .
#red elastica
predicciones1<-predict.glmnet(elastic8, predic.test, s=elastic8$lambda.min)
#ridge
predicciones2<-predict.glmnet(fitridge, predic.test, s=foundridge$lambda.min)
#lasso
predicciones3<-predict.glmnet(fitlasso, predic.test, s=foundlasso$lambda.min)
#stepwise
predicciones4<-predict(modelocarstep,carros.test)
#calcular el MSE
erroreselastic=sqrt(mean((predicciones1-precio.test[,1])^2))
erroresridge=sqrt(mean((predicciones2-precio.test[,1])^2))
erroreslasso=sqrt(mean((predicciones3-precio.test[,1])^2))
erroresstep=sqrt(mean((predicciones4-precio.test[,1])^2))
erroreselastic
## [1] 240.1505
erroresridge
## [1] 176.9999
erroreslasso
## [1] 359.7593
erroresstep
## [1] 3286.911
El modelo ridge resulta el mejor predictor en la base de datos de validación. Si bien no se logra una mayor parsimonia (ni el modelo step ni los modelos que llevaron coeficientes a 0 obtuvieron mejores resultados), si parece lograrse una mejor predicción. Dado que los datos están en miles de dólares, la diferencia promedio en precisión entre los dos mejores modelos esta en el orden de los US$148 por predicción (algo cercano al 6%), lo cual, dependiendo de la aplicación, puede o no resultar valioso. El modelo lasso es quizás demasiado simple y comete errores mayores, así como la red elástica, con errores entre los cientos y los miles de dólares en promedio, lo que los descarta como candidatos viables.
En el modelo step es difícil saber o entender el efecto específico de cada variable independiente, en parte por la falta de estandarización y en parte por los problemas mencionados de multicolinealidad y parte por la baja relación casos/variables. En el modelo ridge, como se explicó, el tamaño relativo y signo de los coeficientes da idea de la importancia relativa de las variables.
Los modelos regularizados pueden ser una alternativa a los modelos insesgados para mejorar la predictibilidad, particularmente en entornos de baja razón casos/variables o con multicolinealidad. La interpretación de los resultados tiene cambios importantes que deben tenerse en cuenta. La idea de la regularización puede aplicarse a múltiples tipos de modelos que estén buscando minimizar una función de error, lo que la hace altamente aplicable en machine learning.