Как эффективно сделать перекрестную проверку с big.matrix в R?

У меня есть функция, которая заключается в следующем, который принимает матрицу дизайна X с типом класса big.matrix в качестве входных данных и предсказывает ответы.

ПРИМЕЧАНИЕ: размер матрицы X более 10 ГБ. Поэтому я не могу загрузить его в память. я использовал read.big.matrix() генерировать файлы поддержки X.bin а также X.desc,

myfun <- function(X) {
## do something with X. class(X) == 'big.matrix'
}

Мой вопрос заключается в том, как я могу эффективно выполнять перекрестную проверку с помощью этого огромного big.matrix?

Моя попытка: (Это работает, но занимает много времени.)

  • Шаг 1: для каждого фолда получите индексы для тренировки idx.train и проверить idx.test;
  • Шаг 2: разделить X в X.train а также X.test, поскольку X.train а также X.test также очень большие, я должен хранить их как big.matrixи создайте связанные файлы поддержки (.bin, .desc) для тренировочных и тестовых наборов для каждого сгиба.
  • Шаг 3: накормить X.train построить модель и предсказать ответы для X.test,

Часть времени, требующая много времени, - это Шаг 2, где мне приходится создавать файлы поддержки для обучения и тестирования (почти как копирование / вставка исходной большой матрицы) много раз. Например, предположим, что я делаю 10-кратную перекрестную проверку. Шаг 2 занял бы более 30 минут для создания файлов поддержки для всех 10 сгибов!

Чтобы решить эту проблему на шаге 2, я думаю, что я могу разделить исходную матрицу на 10 подматриц (типа класса big.matrix) только раз. Затем для каждого сгиба я использую одну порцию для тестирования и объединяю оставшиеся 9 порций в одну большую матрицу для тренировки. Но новая проблема в том, что нет возможности объединить маленькие big.matrix в большую эффективно без копирования / вставки.

Конечно, я могу сделать распределенные вычисления для этой процедуры перекрестной проверки. Но мне просто интересно, есть ли лучший способ ускорить процедуру, если использовать только одно ядро.

Есть идеи? Заранее спасибо.

ОБНОВИТЬ:

Оказывается, что ответ @cdeterman не работает, когда X очень большой Причина в том, что mpermute() Функция переставляет строки, по сути, делая копирование / вставку. mpermute() звонки ReorderRNumericMatrix() в C++, который затем вызывает reorder_matrix() функция. Эта функция переупорядочивает матрицу путем циклического перебора всех столбцов и строк и выполнения копирования / вставки. Смотрите исходный код здесь.

Есть ли лучшие идеи для решения моей проблемы? Благодарю.

КОНЕЦ ОБНОВЛЕНИЯ

1 ответ

Вы хотите использовать sub.big.matrix функция. Это позволяет избежать дальнейших копий и указывает на те же исходные данные. Тем не менее, он может в настоящее время только подмножество смежных строк. Таким образом, вы захотите сначала переставить свои ряды.

# Step 1 - generate random indices
idx <- sample(nrow(X), nrow(X))
mpermute(X, idx)

# Step 2 - create your folds
max <- nrow(bm)/10 # assuming 10 folds
idx_list <- split(seq(nrow(bm)), ceiling(seq(nrow(bm))/max))

# Step 3 - list of sub.big.matrix objects
sm_list <- lapply(idx_list, function(x) sub.big.matrix(bm, firstRow = x[1], lastRow = x[length(x)]))

Теперь у вас есть оригинал big.matrix разбить на 10 разных матриц, которые вы можете использовать по своему усмотрению.

Другие вопросы по тегам