Как эффективно сделать перекрестную проверку с 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 разных матриц, которые вы можете использовать по своему усмотрению.