【问题标题】:large-scale regression in R with a sparse feature matrixR中具有稀疏特征矩阵的大规模回归
【发布时间】:2011-03-11 07:23:20
【问题描述】:

我想在 R 中使用许多(例如 10 万个)特征进行大规模回归(线性/逻辑),其中每个示例在特征空间中相对稀疏——例如,每个样本约 1k 个非零特征例子。

似乎SparseMslm 应该这样做,但我在从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 对象?或者也许有更好/更简单的方法来做到这一点?

(我想我可以使用 Xy 显式编写线性回归的解决方案,但如果有 slm 工作会很好。)

【问题讨论】:

标签: r sparse-matrix regression


【解决方案1】:

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)

【讨论】:

【解决方案2】:

不知道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  

【讨论】:

  • 奇怪的是看到使用未导出的函数作为接受的答案
  • 即使是带有帮助页面的未导出函数也很奇怪!
【解决方案3】:

您还可以通过查看这里获得一些里程:

【讨论】:

【解决方案4】:

迟来的答案:glmnet 还将支持稀疏矩阵和所请求的两个回归模型。这可以使用Matrix 包生成的稀疏矩阵。我建议通过这个包研究正则化模型。由于稀疏数据通常涉及对某些变量的非常稀疏的支持,因此 L1 正则化可用于将这些从模型中剔除。这通常比对支持度非常低的变量进行一些非常虚假的参数估计更安全。

【讨论】:

    猜你喜欢
    • 2015-11-28
    • 2013-09-25
    • 2015-08-24
    • 1970-01-01
    • 2015-01-30
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多