スパース機能マトリックスを備えたRの大規模な回帰
-
02-10-2019 - |
質問
多くの(100K)機能を備えたRで大規模な回帰(線形/ロジスティック)を実行したいと思います。各例は、特徴空間で比較的まばらです。
のようです スパルスム パッケージ slm
これを行う必要がありますが、私はから変換するのが困難です sparseMatrix
aへの形式 slm
- フレンドリーな形式。
ラベルの数値ベクトルがあります y
そしてa 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
aの代わりにオブジェクト sparseMatrix
.
どちらかの簡単な方法はありますかa) SparseM
直接またはb)aを変換します sparseMatrix
に SparseM
物体?それとも、これを行うには、より良い/単純な方法がありますか?
(私は線形回帰のソリューションを明示的にコーディングできると思います X
と y
, 、しかし、持っているといいでしょう slm
働く。)
解決
知らない 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
他のヒント
遅ればせながらの答え: glmnet
また、スパースマトリックスと要求された回帰モデルの両方をサポートします。これは、によって生成されるスパースマトリックスを使用できます Matrix
パッケージ。このパッケージを介して正規化されたモデルを調べることをお勧めします。スパースデータには多くの場合、いくつかの変数に対する非常にまばらなサポートが含まれるため、L1正規化はこれらをモデルからノックアウトするのに役立ちます。サポートが非常に低い変数の非常に偽のパラメーターの推定値を取得するよりも、多くの場合安全です。
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)
また、ここを見ることで走行距離を得るかもしれません:
- Biglm パッケージ。
- 高性能および並列コンピューティングRタスクビュー.
- 紙 一般化された線形モデルのスパースモデルマトリックス (PDF)、2010年のMartin MachlerとDouglas Batesによる。