Крупномасштабная регрессия в R с разреженной матрицей признаков
Я хотел бы сделать крупномасштабную регрессию (линейную/логистическую) в R со многими (например, 100k) функциями, где каждый пример относительно разрежен в пространстве возможностей --- например, ~ 1k ненулевые функции за пример.
Кажется, что SparseM пакет slm
должен сделать это, но у меня есть сложность преобразования из формата sparseMatrix
в slm
-дружественный формат.
У меня есть числовой вектор меток y
и sparseMatrix
функций X
\in {0,1}. Когда я пытаюсь
model <- slm(y ~ X)
Я получаю следующую ошибку:
Error in model.frame.default(formula = y ~ X) :
invalid type (S4) for variable 'X'
предположительно, потому что slm
хочет объект SparseM
вместо sparseMatrix
.
Есть ли простой способ либо a) заполнить объект SparseM
напрямую, либо b) преобразовать объект sparseMatrix
в объект SparseM
? Или, может быть, есть лучший/более простой способ сделать это?
(я полагаю, что я мог бы явно кодировать решения для линейной регрессии с помощью X
и y
, но было бы неплохо работать с slm
.)
Ответы
Ответ 1
Не знаю о SparseM
, но пакет MatrixModels
имеет невыполненную lm.fit.sparse
функцию, которую вы можете использовать. См. ?MatrixModels:::lm.fit.sparse
. Вот пример:
Создайте данные:
y <- rnorm(30)
x <- factor(sample(letters, 30, replace=TRUE))
X <- as(x, "sparseMatrix")
class(X)
# [1] "dgCMatrix"
# attr(,"package")
# [1] "Matrix"
dim(X)
# [1] 18 30
Запустите регрессию:
MatrixModels:::lm.fit.sparse(t(X), y)
# [1] -0.17499968 -0.89293312 -0.43585172 0.17233007 -0.11899582 0.56610302
# [7] 1.19654666 -1.66783581 -0.28511569 -0.11859264 -0.04037503 0.04826549
# [13] -0.06039113 -0.46127034 -1.22106064 -0.48729092 -0.28524498 1.81681527
Для сравнения:
lm(y~x-1)
# Call:
# lm(formula = y ~ x - 1)
#
# Coefficients:
# xa xb xd xe xf xg xh xj
# -0.17500 -0.89293 -0.43585 0.17233 -0.11900 0.56610 1.19655 -1.66784
# xm xq xr xt xu xv xw xx
# -0.28512 -0.11859 -0.04038 0.04827 -0.06039 -0.46127 -1.22106 -0.48729
# xy xz
# -0.28524 1.81682
Ответ 2
Запоздалый ответ: glmnet
также будет поддерживать разреженные матрицы и обе запрашиваемые модели регрессии. Это может использовать разреженные матрицы, созданные пакетом Matrix
. Я советую смотреть в регуляризованные модели через этот пакет. Поскольку редкие данные часто включают в себя очень редкую поддержку некоторых переменных, L1-регуляризация полезна для их выключения из модели. Это часто безопаснее, чем получение некоторых очень ложных оценок параметров для переменных с очень низкой поддержкой.
Ответ 3
glmnet
- хороший выбор. Поддерживает L1, L2-регуляризацию для линейной, логистической и мультиномиальной регрессии, среди других опций.
Единственная деталь: у нее нет интерфейса формулы, поэтому вам нужно создать свою модельную матрицу. Но здесь есть преимущество.
Вот псевдо-пример:
library(glmnet)
library(doMC)
registerDoMC(cores=4)
y_train <- class
x_train <- sparse.model.matrix(~ . -1, data=x_train)
# For example for logistic regression using L1 norm (lasso)
cv.fit <- cv.glmnet(x=x_train, y=y_train, family='binomial', alpha=1,
type.logistic="modified.Newton", type.measure = "auc",
nfolds=5, parallel=TRUE)
plot(cv.fit)
Ответ 4
Вы также можете получить пробег, посмотрев здесь: