具有大量类的多类分类,但对于每个用户,目标类的集合是已知的

数据挖掘 机器学习 分类 数据集 多类分类
2022-03-11 07:59:39

嗨数据科学堆栈交换!我是新来的,但我熟悉一些机器学习理论(在学校上过一些课程),我的问题更多是关于如何在实际环境中应用机器学习。

我有这个项目,我正在尝试设计一个系统来预测用户将从哪个“商店”购买给定物品。但是,每个用户都知道用户可能购买的商店集合(因为此促销活动仅适用于他们注册的有限商店)。平均而言,普通用户可以购买的商店集合约为 3,但所有用户的不同商店数量约为 10000。

理论上,对于单个用户来说,这似乎是一个简单的分类问题。我们有历史信息,例如用户从商店 X 购买商品 Y 的时间/日期/月份,以及其他特征,例如用户居住的位置(邮政编码)以及与他们购买的商品类型相关的特征(成本、重量, 品牌)。

然而,问题是目前大约有 6000 个用户,所以采用这种方法似乎我需要为每个用户一个单独的模型,但这对我来说似乎不是一个有效的解决方案,或者至少不是我通常看到的 ML使用的算法。不幸的是,我没有看到任何其他方式可以考虑到用户已经可以购买的商店集合对于每个用户来说都是已知的这一事实。我想我可以将每个可购买商店的分类变量作为一个特征,但这相当于添加 10000 个特征,我不确定这是否会随着不同商店数量的增加而扩展。

如果有人对如何将机器学习技术应用于此类问题有任何见解,那将非常有帮助,因为这是我第一次处理“真实”问题。谢谢!

3个回答

所以听起来你有历史交易数据。如果这样做,您可能希望使用商店标签作为因变量以及所有其他自变量来训练模型。

set.seed(100)
items <- c("milk", "cheese", "steak", "apple", "eggs")    
df <- data.frame(trans_id = 1:100, 
                       cust_id = sample(1:10, 100, replace = TRUE),
                       item = sample(items, 100, replace = TRUE)
                       )

df$store <- as.factor(sapply(df$cust_id, function(x) {
    sample(letters[cust_id:(cust_id+2)],1)
  }))

head(df)
##  trans_id cust_id   item store
##1        1       4 cheese     e
##2        2       3 cheese     f
##3        3       6   milk     f
##4        4       1 cheese     f
##5        5       5  steak     d
##6        6       5  apple     f

#train General linear model
glm(formula = store ~., family = binomial(link = "logit"), 
     data = df)

##all:  glm(formula = store ~ ., family = binomial(link = "logit"), data = df)
##
##Coefficients:
##(Intercept)     trans_id      cust_id   itemcheese  
##   1.320095    -0.007399    -0.066363     0.024632  
##   itemeggs     itemmilk    itemsteak  
##   0.084018     0.047022     1.069399  

library("e1071")
#train naive bayes
naiveBayes(formula = store ~., data = df)

根据业务限制,您可能希望或可能不希望将客户 ID 作为预测变量包含在内(如果您只为有限的已知客户群预测商店;如果您的模型需要跨客户泛化,则不包括在内)。同样,如果这是一个真实的数据集,您可能不会将事务 id 作为预测变量,因为它不会推广到新案例(事务 id 是唯一的)

添加到@Brandon 所说的内容:您可以添加另一组变量,例如客户 ID* 其他预测变量(一个热门客户 ID 与其他预测变量的乘积)。这些额外的预测变量将隐含地捕捉到不同客户有不同的候选商店集这一事实。如果您有足够的数据,更简洁的方法是构建客户级别的模型注意:您将拥有 #customers*#predictors 附加变量,并且需要使用 L1 惩罚进行正则化

另一种方法是添加一项功能,以捕获客户有资格在哪些商店享受折扣。给定足够大的数据集的分类模型可能会找出这种联系:)