as.h2o создает дополнительные строки без четко определенной причины - PullRequest
0 голосов
/ 04 февраля 2020

У меня эта проблема уже несколько месяцев. Я совершенно не могу создать воспроизводимый пример и не могу поделиться данными, которые я использую (это конфиденциальные данные, принадлежащие моему клиенту).

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

Вот проблема:

data <- readRDS("problematic_data.rds")
data <- data[1:19457, ]
h2odata <- as.h2o(data)
nrow(h2odata)
# [1] 19459

Это не останавливается на достигнутом. Вот почему я не могу построить воспроизводимый пример.

Давайте выполним бинарный поиск и найдем проблемную строку c. Это невозможно, потому что:

data <- readRDS("problematic_data.rds")
data <- data[1:19456, ]
h2odata <- as.h2o(data)
nrow(h2odata)
# [1] 19456

Это заставляет нас думать, что проблема связана со строкой 19457. Это не так:

data <- readRDS("problematic_data.rds")
data <- data[2:19457, ]
h2odata <- as.h2o(data)
nrow(h2odata)
# [1] 19456

Похоже, что проблема возникает только при наличии минимального количества строк в наборе данных. Это число не совпадает во многих примерах, с которыми я сталкивался.

Это не останавливается на достигнутом.

data <- readRDS("problematic_data.rds")
data <- data[1:19457, ]
data$test <- 1
h2odata <- as.h2o(data)
nrow(h2odata)
# [1] 19457

Очевидно, добавление бесполезного столбца решает ошибку. Удаление столбца также помогает большую часть времени (не указанный c столбец, ни один столбец).

Теперь вы понимаете, почему я не смог создать воспроизводимый пример. Я не понимаю эту ошибку вообще. Я попытался записать данные во временный файл и затем импортировать его с h2o.importFile. Иногда это работает, иногда нет. Иногда функция as.h2o работает, а не мой обходной путь.

В конце концов, я создал новую функцию as_h2o, которая выглядит следующим образом:

as_h2o <- function(data) {
    filename <- tempfile()
    data.table::fwrite(data, filename)
    h2odata <- h2o.importFile(filename)
    file.remove(filename)
    if (nrow(data) != nrow(h2odata)) {
        h2odata <- as.h2o(data)
    }
    if (nrow(data) != nrow(h2odata)) {
        data$tmp <- 1
        h2odata <- as.h2o(data)
        h2odata$tmp <- NULL
    }
    if (nrow(data) != nrow(h2odata)) {
        stop("Issue with converting data.frame to h2oFrame")
    }
    h2odata
}

Но, ну ... Это не идеально. Кроме того, проверка того, что число строк равно, не гарантирует, что данные не будут повреждены каким-либо другим способом.

Смежный вопрос: as.h2o создает дополнительную строку, когда имена столбцов содержат специальные символы .

Однако имена моих столбцов содержат только буквы и подчеркивания. Обратите внимание, что изменение имен достаточно столбцов также устраняет ошибку. Я пишу достаточно столбцов , потому что это не какие-то определенные c столбцы. Такое ощущение, что мне просто нужно каким-то образом изменить набор данных, чтобы решить эту проблему.

...