Что может быть причиной различий в результатах MAE от глубокого изучения R между этими наборами данных? - PullRequest
2 голосов
/ 22 сентября 2019

Я пытаюсь воспроизвести приведенный ниже пример глубокого обучения с тем же набором данных жилья в Бостоне из другого источника.

https://jjallaire.github.io/deep--with-r-notebooks/notebooks/3.6-predicting-house-prices.nb.html

Первоначально источником данных является:

library(keras) dataset <- dataset_boston_housing()

В качестве альтернативы я пытаюсь использовать:

library(mlbench)
data(BostonHousing)

Разница между наборами данных:

  1. набор данных из mlbench содержит имена столбцов.
  2. набор данных из keras уже разделен между test и train.
  3. набор из keras организован со списками, содержащими матрицы, в то время как набор данных из mlbench является фреймом данных
  4. четвертый столбец содержит категориальную переменную "chas"который не может быть предварительно обработан из набора данных mlbench, в то время как он может быть предварительно обработан из набора данных keras.Для сравнения яблок с яблоками я удалил этот столбец из обоих наборов данных.

Чтобы сравнить оба набора данных, я объединил поезд и набор тестов из керас в 1 набор данных.После этого я сравнил объединенный набор данных из keras с mlbench с summary (), и они идентичны для каждой функции (мин, макс, медиана, среднее).

Поскольку набор данных из keras уже разделен между тестом и обучением (80-20), я могу использовать только один тренировочный набор для процесса глубокого обучения.Этот обучающий набор дает validation_mae около 2,5.Смотрите этот график:

enter image description here

Если я разделю данные из mlbench на 0,8, чтобы создать обучающий набор аналогичного размера, запустите код глубокого обучения и выполнитеэто несколько раз, я никогда не достигаю validation_mae около 2,5.Диапазон составляет от 4 до 6. Примером выходных данных является следующий график:

enter image description here

Кто-нибудь знает, что может быть причиной этой разницы?

Код с набором данных из keras:


library(keras)
dataset <- dataset_boston_housing()

c(c(train_data, train_targets), c(test_data, test_targets)) %<-% dataset

train_data <- train_data[,-4]
test_data <- test_data[,-4]

mean <- apply(train_data, 2, mean)
std <- apply(train_data, 2, sd)
train_data <- scale(train_data, center = mean, scale = std)
test_data <- scale(test_data, center = mean, scale = std)

# After this line the code is the same for both  code examples.
# ========================================= 

# Because we will need to instantiate the same model multiple times,
# we use a function to construct it.
build_model <- function() {
  model <- keras_model_sequential() %>% 
    layer_dense(units = 64, activation = "relu", 
                input_shape = dim(train_data)[[2]]) %>% 
    layer_dense(units = 64, activation = "relu") %>% 
    layer_dense(units = 1) 

  model %>% compile(
    optimizer = "rmsprop", 
    loss = "mse", 
    metrics = c("mae")
  )
}

  k <- 4
indices <- sample(1:nrow(train_data))
folds <- cut(1:length(indices), breaks = k, labels = FALSE) 
num_epochs <- 100
all_scores <- c()
for (i in 1:k) {
  cat("processing fold #", i, "\n")
  # Prepare the validation data: data from partition # k
  val_indices <- which(folds == i, arr.ind = TRUE) 
  val_data <- train_data[val_indices,]
  val_targets <- train_targets[val_indices]

  # Prepare the training data: data from all other partitions
  partial_train_data <- train_data[-val_indices,]
  partial_train_targets <- train_targets[-val_indices]

  # Build the Keras model (already compiled)
  model <- build_model()

  # Train the model (in silent mode, verbose=0)
  model %>% fit(partial_train_data, partial_train_targets,
                epochs = num_epochs, batch_size = 1, verbose = 0)

  # Evaluate the model on the validation data
  results <- model %>% evaluate(val_data, val_targets, verbose = 0)
  all_scores <- c(all_scores, results$mean_absolute_error)
}  
all_scores
mean(all_scores)

  # Some memory clean-up
  k_clear_session()
num_epochs <- 500
all_mae_histories <- NULL
for (i in 1:k) {
  cat("processing fold #", i, "\n")

  # Prepare the validation data: data from partition # k
  val_indices <- which(folds == i, arr.ind = TRUE)
  val_data <- train_data[val_indices,]
  val_targets <- train_targets[val_indices]

  # Prepare the training data: data from all other partitions
  partial_train_data <- train_data[-val_indices,]
  partial_train_targets <- train_targets[-val_indices]

  # Build the Keras model (already compiled)
  model <- build_model()

  # Train the model (in silent mode, verbose=0)
  history <- model %>% fit(
    partial_train_data, partial_train_targets,
    validation_data = list(val_data, val_targets),
    epochs = num_epochs, batch_size = 1, verbose = 1
  )
  mae_history <- history$metrics$val_mean_absolute_error
  all_mae_histories <- rbind(all_mae_histories, mae_history)
}


  average_mae_history <- data.frame(
    epoch = seq(1:ncol(all_mae_histories)),
    validation_mae = apply(all_mae_histories, 2, mean)
  )


  library(ggplot2)
ggplot(average_mae_history, aes(x = epoch, y = validation_mae)) + geom_line()

Код с набором данных из mlbench (после строки с "=====" код такой же, как в коде выше:


library(dplyr)
library(mlbench)
library(groupdata2)

data(BostonHousing)

parts <- partition(BostonHousing, p = 0.2)
test_data <- parts[[1]]
train_data <- parts[[2]]


train_targets <- train_data$medv
test_targets <- test_data$medv

train_data$medv <- NULL
test_data$medv <- NULL


train_data$chas <- NULL
test_data$chas <- NULL

mean <- apply(train_data, 2, mean)
std <- apply(train_data, 2, sd)
train_data <- scale(train_data, center = mean, scale = std)
test_data <- scale(test_data, center = mean, scale = std)

library(keras)

# After this line the code is the same for both  code examples.
# ========================================= 

build_model <- function() {
  model <- keras_model_sequential() %>% 
    layer_dense(units = 64, activation = "relu", 
                input_shape = dim(train_data)[[2]]) %>% 
    layer_dense(units = 64, activation = "relu") %>% 
    layer_dense(units = 1) 

  model %>% compile(
    optimizer = "rmsprop", 
    loss = "mse", 
    metrics = c("mae")
  )
}

  k <- 4
indices <- sample(1:nrow(train_data))
folds <- cut(1:length(indices), breaks = k, labels = FALSE) 
num_epochs <- 100
all_scores <- c()
for (i in 1:k) {
  cat("processing fold #", i, "\n")
  # Prepare the validation data: data from partition # k
  val_indices <- which(folds == i, arr.ind = TRUE) 
  val_data <- train_data[val_indices,]
  val_targets <- train_targets[val_indices]

  # Prepare the training data: data from all other partitions
  partial_train_data <- train_data[-val_indices,]
  partial_train_targets <- train_targets[-val_indices]

  # Build the Keras model (already compiled)
  model <- build_model()

  # Train the model (in silent mode, verbose=0)
  model %>% fit(partial_train_data, partial_train_targets,
                epochs = num_epochs, batch_size = 1, verbose = 0)

  # Evaluate the model on the validation data
  results <- model %>% evaluate(val_data, val_targets, verbose = 0)
  all_scores <- c(all_scores, results$mean_absolute_error)
}  
all_scores
mean(all_scores)

  # Some memory clean-up
  k_clear_session()
num_epochs <- 500
all_mae_histories <- NULL
for (i in 1:k) {
  cat("processing fold #", i, "\n")

  # Prepare the validation data: data from partition # k
  val_indices <- which(folds == i, arr.ind = TRUE)
  val_data <- train_data[val_indices,]
  val_targets <- train_targets[val_indices]

  # Prepare the training data: data from all other partitions
  partial_train_data <- train_data[-val_indices,]
  partial_train_targets <- train_targets[-val_indices]

  # Build the Keras model (already compiled)
  model <- build_model()

  # Train the model (in silent mode, verbose=0)
  history <- model %>% fit(
    partial_train_data, partial_train_targets,
    validation_data = list(val_data, val_targets),
    epochs = num_epochs, batch_size = 1, verbose = 1
  )
  mae_history <- history$metrics$val_mean_absolute_error
  all_mae_histories <- rbind(all_mae_histories, mae_history)
}


  average_mae_history <- data.frame(
    epoch = seq(1:ncol(all_mae_histories)),
    validation_mae = apply(all_mae_histories, 2, mean)
  )


  library(ggplot2)
ggplot(average_mae_history, aes(x = epoch, y = validation_mae)) + geom_line()

Спасибо!

1 Ответ

0 голосов
/ 23 сентября 2019

пишу здесь, потому что я не могу комментировать ... Я проверил набор данных mlbench здесь , и он сказал, что он содержит 14 столбцов исходного набора данных Бостона и 5 дополнительных столбцов.Не уверен, что у вас может быть ошибочный набор данных, потому что вы утверждаете, что нет никаких различий в количестве столбцов наборов данных.

Еще одно предположение может состоять в том, что второй примерный график взят из модели, которая застряла влокальные минимумы.Чтобы получить более сопоставимые модели, вы можете работать с одними и теми же семенами, чтобы убедиться, что инициализация весов и т. Д. Одинаковы, чтобы получить одинаковые результаты.

Надеюсь, что это поможет, и не стесняйтесь спрашивать.

...