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.)

Author: MichaelChirico, 2010-07-03

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  
 12
Author: Jyotirmoy Bhattacharya,
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.

 14
Author: Iterator,
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)
 6
Author: marbel,
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:

 5
Author: Steve Lianoglou,
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