jho*_*man 11 regression r sparse-matrix
我想在R中进行大规模回归(线性/逻辑),具有许多(例如100k)特征,其中每个示例在特征空间中相对稀疏---例如,每个示例约1k非零特征.
似乎SparseM包slm
应该这样做,但我很难从sparseMatrix
格式转换为slm
友好格式.
我有一个标签的数字向量y
和{0,1}中的一个sparseMatrix
特征X
\.当我尝试
model <- slm(y ~ X)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Error in model.frame.default(formula = y ~ X) :
invalid type (S4) for variable 'X'
Run Code Online (Sandbox Code Playgroud)
大概是因为slm
想要一个SparseM
物体而不是一个物体sparseMatrix
.
是否有一种简单的方法来a)SparseM
直接填充对象或b)将a转换sparseMatrix
为SparseM
对象?或许有更好/更简单的方法来做到这一点?
(我想我可以使用X
和显式编码线性回归的解决方案y
,但是slm
工作会很好.)
Ite*_*tor 14
迟来的答案:glmnet
还将支持稀疏矩阵和所请求的两种回归模型.这可以使用Matrix
包生成的稀疏矩阵.我建议通过这个包查看正规化模型.由于稀疏数据通常涉及对某些变量的非常稀疏的支持,因此L1正则化对于将这些变量从模型中敲除是有用的.它通常比对支持非常低的变量进行一些非常虚假的参数估计更安全.
Jyo*_*rya 13
不知道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
Run Code Online (Sandbox Code Playgroud)
运行回归:
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
Run Code Online (Sandbox Code Playgroud)
为了比较:
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
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式获得一些里程:
归档时间: |
|
查看次数: |
10154 次 |
最近记录: |