如何仅获取 arules 中特定列的 LHS 和 RHS 项目?
Posted
技术标签:
【中文标题】如何仅获取 arules 中特定列的 LHS 和 RHS 项目?【英文标题】:How to get items for both LHS and RHS for only specific columns in arules? 【发布时间】:2015-01-13 15:54:25 【问题描述】:在 apriori 函数中,我希望结果仅包含 LHS HouseOwnerFlag=0
和 HouseOwnerFlag=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
。从其他 *** 问题中,我看到我可以将 default="rhs"
放在 apriori 函数中,如下所示: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)比以前少得多,但它确实只包含 LHS 中的HouseOwnerFlag
:
# 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
没有用处,因为它当然会返回null。我用不同的支持号码对其进行了多次测试,以试验产品是否会出现,但 7 条相同的规则保持不变。
所以我的问题是,如何同时指定 LHS(HouseOwnerFlag)和 RHS(产品)?我做错了什么?
编辑:您可以通过从https://www.dropbox.com/s/tax5xalac5xgxtf/testdf.txt?dl=0 下载此测试数据集来重现此问题
请注意,我只从一个巨大的数据集中提取了前 20 行,因此很遗憾,这里的输出不会与我上面显示的示例具有相同的产品名称。但问题仍然是一样的。我希望能够在 LHS 上仅获得 HouseOwnerFlag=0
和/或 HouseOwnerFlag=1
,在 RHS 上获得 Product
列。
【问题讨论】:
添加reproducible example 总是更容易提供帮助 @MrFlick,好的,谢谢你的建议。如果人们想重现这个问题,我只是做了一个小测试集。 我添加了一个不同的解决方案,我才意识到我对默认参数的错误:) 【参考方案1】:似乎不能同时约束 lhs 和 rhs(在使用您的数据之前我也没有)。但是你可以使用子集。 编辑:我错了,您也可以同时约束 lhs 和 rhs,另一种解决方案见下文。我保留解决方案 1,因为在某些情况下,计算更大的集合然后拆分可能有用左边。
解决方案 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.
解决方案 2:
我被参数默认值的定义欺骗了。同时使用 lhs 和 rhs 会告诉分配给其中一个的每个项目,它只能用于 lhs/rhs。参数“default”自动设置为“both”,lhs/rhs中没有用到的所有其他项都可以同时使用(R包中实现的appearence参数解释:http://www.inside-r.org/node/86290,我意识到一定是阅读原始 C 实现手册时可能: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"))
【讨论】:
感谢您的全面回答!我遇到这个问题已经有一段时间了,我还没有重新创建,但它看起来确实合乎逻辑。【参考方案2】:我参加聚会很晚了......但由于我现在也在玩这个包,让我包括我的想法,以防对某人有帮助。
输出中包含的规则是符合支持和置信度参数的规则。因此,如果您对期望的格式没有任何规则,请尝试放松这些限制:较低的支持,较低的信心。 据我所知,lhs 只能包含一个术语,因此您可以将此部分限制为您想要出现的术语(产品)以加快规则生成。 我没有尝试过您的特定数据集,但我认为这是一般建议,应该适用于所有情况。
【讨论】:
【参考方案3】:请尝试以下解决方案:
rules_subset <- subset(rules, (lhs %oin% c("HouseOwnerFlag=0", "HouseOwnerFlag=1") & rhs %pin% c("Product=") ))
【讨论】:
以上是关于如何仅获取 arules 中特定列的 LHS 和 RHS 项目?的主要内容,如果未能解决你的问题,请参考以下文章
Python:如何快速创建仅包含大型 Excel 工作表中特定列的 pandas 数据框?