我应该为稀疏布尔特征使用哪个分类器?

数据挖掘 机器学习 分类 数据挖掘 数据清理 监督学习
2022-02-13 16:38:11

我有分类为 2 类的训练数据:XNot X

每条训练或实验数据都具有可变数量的布尔特征。每条数据可能有约 100 个特征,但可能的布尔特征的总数可能在数万或数十万。

我想训练一个分类器,以便给定一个观察值(具有一组布尔特征),它将输出它是X的概率。

您能否推荐哪些 ML 算法可用于大量稀疏布尔特征?

后续问题:

我还有大量的训练数据,最好将其描述为Maybe X(我还没有验证是X,但很有可能是X)。我可以将这些Maybe X进一步细分Likely XMaybe X可能不是 X有没有办法可以使用Maybe X或其子分类进行训练?最后,我仍然只关心观察为X的概率。

1个回答

将您的输入映射到稀疏矩阵并使用逻辑回归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))

在这种情况下,分类器与底层算法处理稀疏矩阵的能力无关紧要。

还值得注意的是,您可以通过将稀疏布尔特征映射到任意数字索引并通过基于树的算法(例如,随机森林或梯度提升)运行它们来处理稀疏布尔特征。在实践中,这似乎运作良好。