library(tree)
datos = read.table('coches.txt',header=T)
datos = na.omit(datos)
datos$origen = factor(datos$origen, labels = c("USA","Europa","Japon"))
Dividimos los datos en dos partes, una para entrenar el modelo y otra para calcular el error de predicción con datos diferentes de los utilizados para entrenar:
set.seed(321)
ndat = nrow(datos)
train = sample(1:ndat,ndat/2) # la mitad de los datos para entranamiento
datos_train = datos[train,] # trainning set
datos_test = datos[-train,] # test set
\[ \hat f_{bag} = \frac{1}{B}\sum_{b=1}^B \hat f_b(x) \]
library(randomForest)
## randomForest 4.6-14
## Type rfNews() to see new features/changes/bug fixes.
nreg = ncol(datos)-1
bag1 = randomForest(consumo ~ ., data = datos_train, mtry=nreg, ntree = 500)
Error del modelo:
yp_train_bag1 <- predict(bag1, newdata = datos_train)
y_train = datos_train$consumo
( MSE_train_bag1 = mean((y_train - yp_train_bag1)^2) ) # error cuadratico medio en los datos de training
## [1] 0.3459388
Error de predicción:
# prediccion del consumo con los datos de validacion
yp_test_bag1 = predict(bag1, newdata = datos_test)
# error del validation set
y_test = datos_test$consumo
(MSE_test_bag1 = mean((y_test - yp_test_bag1)^2))
## [1] 1.910328
Comparar los errores con los obtenidos utilizando un solo arbol.
bag2 = randomForest(consumo ~ ., data = datos_train, mtry=nreg, ntree = 500, importance = T)
importance(bag2)
## %IncMSE IncNodePurity
## cc 26.811707 1309.98756
## cv 19.413353 508.97169
## peso 21.371510 756.04237
## acel 7.411803 39.37955
## ano 48.580515 275.50205
## origen 2.538933 10.99244
## cilindros 5.815053 91.86055
%IncMSE: descenso de la calidad de las predicciones realizadas en los datos out of bag cuando una variable es excluida del modelo (variables importantes en la predicción).
IncNodePurity: suma del descenso acumulado del RSS al partir por dicha variable en los diferentes árboles del bagging (variables importantes en el RSS del modelo).
varImpPlot(bag2)