将您的输入映射到稀疏矩阵并使用逻辑回归ℓ1惩罚应该运作良好。在 R 中,使用 glmnet 和矩阵库非常简单。
此外,如果您有低频的布尔特征,您可以通过获取至少具有一定数量观察值的子集来过滤其中的一些特征。
这是 R 中具有稀疏特征的套索逻辑回归的快速模拟。
library(glmnet)
library(Matrix)
n <- 1e5
set.seed(420)
# These are all converted to boolean variables since they're arbitrary categories
ls <- data.frame(cat1=sample(letters, n, replace=TRUE),
cat2=sample(letters, n, replace=TRUE),
cat3=sample(letters, n, replace=TRUE))
ls$cat1cat2 <- factor(paste(ls$cat1, ls$cat2, sep="-"))
xs <- sparse.model.matrix(~.-1,data=ls)
betas<- rnorm(dim(xs)[2])
error <- runif(n)
ytrue <- xs %*%betas
ylogit <- 1/(1 + exp(- (ytrue + error))
ylabel <- ifelse(ylogit>0.5,1,0)
trainfilter <- runif(n)<=0.3
sparsemodel <- cv.glmnet(x=xs[trainfilter,],
y=ylabel[trainfilter],
alpha=1,
nfolds=3,
family='binomial')
preds <- predict(sparsemodel, xs, s='lambda.min', type='class')
print(table(ylabel, preds))
在这种情况下,分类器与底层算法处理稀疏矩阵的能力无关紧要。
还值得注意的是,您可以通过将稀疏布尔特征映射到任意数字索引并通过基于树的算法(例如,随机森林或梯度提升)运行它们来处理稀疏布尔特征。在实践中,这似乎运作良好。