如何仅针对规则中的特定列获取 LHS 和 RHS 的项目?

How to get items for both LHS and RHS for only specific columns in arules?

在先验函数中,我希望结果只包含 LHS HouseOwnerFlag=0HouseOwnerFlag=1 中的这两个变量。 RHS 应仅包含列 Product 中的属性。例如:

#   lhs                   rhs                                          support confidence     lift
# 1 {HouseOwnerFlag=0}    => {Product=SV 16xDVD M360 Black}            0.2500000  0.2500000 1.000000
# 2 {HouseOwnerFlag=1}    => {Product=Adventure Works 26" 720p}        0.2500000  0.2500000 1.000000
# 3 {HouseOwnerFlag=0}    => {Product=Litware Wall Lamp E3015 Silver}  0.1666667  0.3333333 1.333333
# 4 {HouseOwnerFlag=1}    => {Product=Contoso Coffee Maker 5C E0900}   0.1666667  0.3333333 1.333333

部分答案在本题中解决: R arules, mine only rules from specific column

所以现在我使用以下内容:
rules <- apriori(sales, parameter=list(support =0.01, confidence =0.8, minlen=2), appearance = list(lhs=c("HouseOwnerFlag=0", "HouseOwnerFlag=1")))

然后我使用另一个 SO 问题中的这个来确保只有 Product 列在 RHS 上:
inspect( subset( rules, subset = rhs %pin% "Product=" ) )

结果是这样的:

#   lhs                                                                  rhs                                          support confidence     lift
# 1 {ProductKey=153, IncomeGroup=Moderate, BrandName=Adventure Works }    => {Product=SV 16xDVD M360 Black}            0.2500000  0.2500000 1.000000
# 2 {ProductKey=176, MaritalStatus=M, ProductCategoryName=TV and Video }  => {Product=Adventure Works 26" 720p}        0.2500000  0.2500000 1.000000
# 3 {BrandName=Southridge Video, NumberChildrenAtHome=0 }                 => {Product=Litware Wall Lamp E3015 Silver}  0.1666667  0.3333333 1.333333
# 4 {HouseOwnerFlag=1, BrandName=Southridge Video, ProductKey=170 }       => {Product=Contoso Coffee Maker 5C E0900}   0.1666667  0.3333333 1.333333

显然 LHS 能够包含所有可能的列,而不仅仅是我指定的 HouseOwnerFlag。从其他 Whosebug 问题中,我看到我可以将 default="rhs" 放入先验函数中,如下所示:
rules <- apriori(sales, parameter=list(support =0.001, confidence =0.5, minlen=2), appearance = list(lhs=c("HouseOwnerFlag=0", "HouseOwnerFlag=1"), default="rhs"))

然后在检查时(没有子集部分,只有 inspect(rules),规则 (7) 比以前少得多,但它确实只包含 HouseOwnerFlag 在 LHS:

#   lhs                   rhs                           support     confidence lift
# 1 {HouseOwnerFlag=0}    => {MaritalStatus=S}          0.2500000  0.2500000   1.000000
# 2 {HouseOwnerFlag=1}    => {Gender=M}                 0.2500000  0.2500000   1.000000
# 3 {HouseOwnerFlag=0}    => {NumberChildrenAtHome=0}   0.1666667  0.3333333   1.333333
# 4 {HouseOwnerFlag=1}    => {Gender=M}   0.1666667     0.3333333  1.333333

但是在 RHS 上,RHS 中的 Product 列中没有任何内容。所以它没有用 inspect 它与 subset 当然它会 return null。我用不同的支持号测试了几次,看看 Product 是否会出现,但 7 个相同的规则保持不变。

所以我的问题是,如何指定 LHS (HouseOwnerFlag) 和 RHS (Product)?我做错了什么?

编辑:您可以通过从 https://www.dropbox.com/s/tax5xalac5xgxtf/testdf.txt?dl=0 下载此测试数据集来重现此问题 请注意,我只从一个巨大的数据集中提取了前 20 行,因此不幸的是,此处的输出不会与我上面显示的示例具有相同的产品名称。但问题仍然存在。我希望能够在左轴上仅获得 HouseOwnerFlag=0and/or HouseOwnerFlag=1,在右轴上获得列 Product

我参加派对已经很晚了...但由于我现在也在玩这个包,让我谈谈我的想法,以防对某人有帮助。

输出中包含的规则是符合支持度和置信度参数的规则。因此,如果您对您期望的格式没有任何规则,请尝试放宽这些限制:较低的支持度、较低的置信度。 据我所知,lhs 只能包含一个术语,因此您可以将这部分限制为您想要出现的术语(产品),以加快规则生成。 我没有尝试过您的特定数据集,但我认为这是适用于所有情况的一般建议。

似乎不​​能同时约束 lhs 和 rhs(我在玩你的数据之前也没有)。但是你可以使用子集。 编辑:我错了,您也可以同时约束 lhs 和 rhs,请参阅下面的另一个解决方案。我保留解决方案 1,因为在某些情况下计算更大的集合可能会有用,并且然后从左边分开。

解决方案一:

rules_sales <- apriori(sales, 
                   parameter=list(support =0.001, confidence =0.5, minlen=2, maxlen=2), 
                   appearance = list(lhs=c("HouseOwnerFlag=0", "HouseOwnerFlag=1"), 
                                     default="rhs"))

rules_subset <- subset(rules_sales, (rhs %in% paste0("Product=", unique(sales$Product))))
inspect(rules_subset)

给出:

  lhs                   rhs                                                support confidence lift
1 {HouseOwnerFlag=0} => {Product=SV DVD Movies E100 Yellow}                   0.05        0.5   10
2 {HouseOwnerFlag=0} => {Product=Fabrikam Refrigerator 4.6CuFt E2800 Grey}    0.05        0.5    5
3 {HouseOwnerFlag=1} => {Product=Contoso SLR Camera M144 Gold}                0.10        0.5    5

但是你要小心你的低支持率:

Warning in apriori(sales, parameter = list(support = 0.001, confidence = 0.5,  :
  You chose a very low absolute support count of 0. You might run out of memory! Increase minimum support.

方案二:

我被参数default的定义骗了。一次使用 lhs 和 rhs 告诉每个分配给其中之一的项目,它只能用于 lhs/rhs。参数 "default" 自动设置为 "both" 并且 lhs/rhs 中未使用的所有其他项目都可以用于两者(在 R 包中实现的外观参数的解释:http://www.inside-r.org/node/86290, I realised that it must be possible when reading the manual of the original C implementation: http://www.borgelt.net/doc/apriori/apriori.html#appearin).您必须设置 default="none" 然后您可以在以后不使用子集的情况下约束 lhs 和 rhs。

rules_sales <- apriori(sales, 
                       parameter=list(support =0.001, confidence =0.5, minlen=2, maxlen=2), 
                       appearance = list(lhs=c("HouseOwnerFlag=0", "HouseOwnerFlag=1"), 
                       rhs=paste0("Product=", unique(sales$Product)), default="none"))

请尝试以下解决方案:

rules_subset <- subset(rules, (lhs %oin% c("HouseOwnerFlag=0", "HouseOwnerFlag=1")  & rhs %pin% c("Product=") ))