regresja wielkoskalowa w R z rzadką macierzą funkcji
Chciałbym zrobić regresję na dużą skalę (liniową/logistyczną) w R z wieloma (np. 100k) cechami, gdzie każdy przykład jest stosunkowo rzadki w przestrzeni cech---np. ~1K niezerowych cech na przykład.
Wydaje się, że pakiet SparseM slm
powinien to zrobić, ale mam problem z konwersją z formatu sparseMatrix
na format przyjazny dla slm
.
Mam wektor liczbowy etykiet y
I sparseMatrix
CECH X
\in {0,1}. Kiedy Ja try
model <- slm(y ~ X)
Dostaję następujący błąd:
Error in model.frame.default(formula = y ~ X) :
invalid type (S4) for variable 'X'
Prawdopodobnie dlatego, że slm
chce SparseM
obiektu zamiast sparseMatrix
.
Czy istnieje łatwy sposób, aby a) wypełnić obiekt SparseM
bezpośrednio lub b) przekonwertować obiekt sparseMatrix
na obiekt SparseM
? A może jest na to lepszy/prostszy sposób?
(przypuszczam, że mógłbym jawnie kodować rozwiązania regresji liniowej za pomocą X
i y
, ale byłoby miło, gdyby slm
działało.)
4 answers
Nie wiem o SparseM
, ale pakiet MatrixModels
mA niewyeksportowaną funkcję lm.fit.sparse
, której możesz użyć. Zobacz ?MatrixModels:::lm.fit.sparse
. Oto przykład:
Utwórz DANE:
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
Uruchom regresję:
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
Dla porównania:
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-31 02:20:50
Spóźniona odpowiedź: glmnet
będzie również wspierać rzadkie macierze i oba wymagane modele regresji. W ten sposób można wykorzystać nieliczne macierze produkowane przez pakiet Matrix
. Radzę przyjrzeć się regularnym modelom za pośrednictwem tego pakietu. Ponieważ rzadkie dane często wiążą się z bardzo rzadką obsługą niektórych zmiennych, regularyzacja L1 jest przydatna do wyeliminowania ich z modelu. Jest to często bezpieczniejsze niż uzyskanie bardzo fałszywych szacunków parametrów dla zmiennych o bardzo niskim wsparciu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-01 21:14:07
glmnet
to dobry wybór. Obsługuje między innymi regularyzację L1, L2 dla regresji liniowej, logistycznej i wielomianowej.
Jedynym szczegółem jest to, że nie ma interfejsu formuły, więc musisz stworzyć swoją matrycę modelu. Ale tutaj jest zysk.
Oto pseudo-przykład:
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)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-31 02:22:01
Możesz też uzyskać jakiś przebieg patrząc tutaj:
- Pakiet biglm .
- The High Performance and Parallel Computing r task view .
- a paper about Sparse Model Matrices for Generalized Linear Models (PDF), by Martin Machler and Douglas Bates from UseR 2010.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-12 10:12:07