--- title: "Boston House Prices" author: "Eric A. Suess" format: html: embed-resources: true --- ## Predicting house prices: A regression example ```{r} library(keras) boston <- dataset_boston_housing() c(c(train_data, train_targets), c(test_data, test_targets)) %<-% boston ``` Normalize the data. ```{r} mean <- apply(train_data, 2, mean) sd <- apply(train_data, 2, sd) train_data <- scale(train_data, center = mean, scale = sd) test_data <- scale(test_data, center = mean, scale = sd) ``` Build the network. ```{r} build_model <- function() { model <- keras_model_sequential() %>% layer_dense(64, activation = "relu") %>% layer_dense(64, activation = "relu") %>% layer_dense(1) model %>% compile(optimizer = "rmsprop", loss = "mse", metrics = "mae") model } ``` ```{r} k <- 4 fold_id <- sample(rep(1:k, length.out = nrow(train_data))) num_epochs <- 100 all_scores <- numeric() for (i in 1:k) { cat("Processing fold #", i, "\n") val_indices <- which(fold_id == i) val_data <- train_data[val_indices, ] val_targets <- train_targets[val_indices] partial_train_data <- train_data[-val_indices, ] partial_train_targets <- train_targets[-val_indices] model <- build_model() model %>% fit( partial_train_data, partial_train_targets, epochs = num_epochs, batch_size = 16, validation_split = 0.2, verbose = 1 ) results <- model %>% evaluate(val_data, val_targets, verbose = 0) all_scores[[i]] <- results[['mae']] } ``` ```{r} all_scores mean(all_scores) ``` ```{r} num_epochs <- 500 all_mae_histories <- list() for (i in 1:k) { cat("Processing fold #", i, "\n") val_indices <- which(fold_id == i) val_data <- train_data[val_indices, ] val_targets <- train_targets[val_indices] partial_train_data <- train_data[-val_indices, ] partial_train_targets <- train_targets[-val_indices] model <- build_model() history <- model %>% fit( partial_train_data, partial_train_targets, validation_data = list(val_data, val_targets), epochs = num_epochs, batch_size = 16, verbose = 0 ) mae_history <- history$metrics$val_mae all_mae_histories[[i]] <- mae_history } all_mae_histories <- do.call(cbind, all_mae_histories) ``` ```{r} average_mae_history <- rowMeans(all_mae_histories) plot(average_mae_history, xlab = "epoch", type = 'l') truncated_mae_history <- average_mae_history[-(1:10)] plot(average_mae_history, xlab = "epoch", type = 'l', ylim = range(truncated_mae_history)) ``` ```{r} average_mae_history <- rowMeans(all_mae_histories) plot(average_mae_history, xlab = "epoch", type = 'l') ``` ```{r} predictions <- model %>% predict(test_data) predictions[1, ] ```