fpmax: 使用 FP-Max 算法获取最大项集
实现 FP-Max 算法以提取用于关联规则挖掘的最大项集的函数
from mlxtend.frequent_patterns import fpmax
概述
Apriori 算法是首批也是最流行的频繁项集生成算法之一(频繁项集随后用于关联规则挖掘)。然而,Apriori 的运行时可能相当大,特别是对于具有大量唯一项的数据集,因为运行时随唯一项的数量呈指数增长。
与 Apriori 相反,FP-Growth 是一种频繁模式生成算法,它将项插入到模式搜索树中,这使得其运行时随唯一项或条目的数量呈线性增长。
FP-Max 是 FP-Growth 的一个变体,它专注于获取最大项集。一个项集 X 被称为是最大的,如果 X 是频繁的且不存在包含 X 的频繁超模式。 换句话说,一个频繁模式 X 不能是更大的频繁模式的子模式才能符合 最大项集 的定义。
参考文献
- [1] Grahne, G., & Zhu, J. (2003, November). 高效使用前缀树挖掘频繁项集。见 FIMI (Vol. 90)。
相关
示例 1 -- 最大项集
fpmax
函数需要一热编码的 pandas DataFrame 数据。假设我们有以下交易数据
dataset = [['Milk', 'Onion', 'Nutmeg', 'Kidney Beans', 'Eggs', 'Yogurt'],
['Dill', 'Onion', 'Nutmeg', 'Kidney Beans', 'Eggs', 'Yogurt'],
['Milk', 'Apple', 'Kidney Beans', 'Eggs'],
['Milk', 'Unicorn', 'Corn', 'Kidney Beans', 'Yogurt'],
['Corn', 'Onion', 'Onion', 'Kidney Beans', 'Ice cream', 'Eggs']]
我们可以通过 TransactionEncoder
将其转换为正确的格式,如下所示
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
te = TransactionEncoder()
te_ary = te.fit(dataset).transform(dataset)
df = pd.DataFrame(te_ary, columns=te.columns_)
df
苹果 | 玉米 | 莳萝 | 鸡蛋 | 冰淇淋 | 芸豆 | 牛奶 | 肉豆蔻 | 洋葱 | 独角兽 | 酸奶 | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | False | False | False | True | False | True | True | True | True | False | True |
1 | False | False | True | True | False | True | False | True | True | False | True |
2 | True | False | False | True | False | True | True | False | False | False | False |
3 | False | True | False | False | False | True | True | False | False | True | True |
4 | False | True | False | True | True | True | False | False | True | False | False |
现在,让我们返回支持度至少为 60% 的项和项集
from mlxtend.frequent_patterns import fpmax
fpmax(df, min_support=0.6)
支持度 | 项集 | |
---|---|---|
0 | 0.6 | (5, 6) |
1 | 0.6 | (8, 3, 5) |
2 | 0.6 | (10, 5) |
默认情况下,fpmax
返回项的列索引,这在关联规则挖掘等下游操作中可能很有用。为了更好的可读性,我们可以设置 use_colnames=True
将这些整数值转换为相应的项名称
fpmax(df, min_support=0.6, use_colnames=True)
支持度 | 项集 | |
---|---|---|
0 | 0.6 | (芸豆, 牛奶) |
1 | 0.6 | (洋葱, 鸡蛋, 芸豆) |
2 | 0.6 | (芸豆, 酸奶) |
更多示例
请注意,由于 fpmax
函数可以替代 fpgrowth
和 apriori
,它具有相同的函数参数集和返回参数集。因此,更多示例请参阅 apriori
文档。
API
fpmax(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0)
从一热编码 DataFrame 获取最大频繁项集
参数
-
df
: pandas DataFrame已编码格式的 pandas DataFrame。也支持稀疏数据 DataFrame;更多信息请参见 (https://pandas.ac.cn/pandas-docs/stable/ user_guide/sparse.html#sparse-data-structures)
请注意,旧的 pandas SparseDataFrame 格式在 mlxtend >= 0.17.2 中不再支持。
允许的值是 0/1 或 True/False。例如,
Apple Bananas Beer Chicken Milk Rice
0 True False True True False True
1 True False True False False True
2 True False True False False False
3 True True False False False False
4 False False True True True True
5 False False True False True True
6 False False True False True False
7 True True False False False False
-
min_support
: float (默认: 0.5)一个介于 0 和 1 之间的浮点数,表示返回项集的最小支持度。支持度计算方法是 item(s)_出现_的交易数 / 总交易数。
-
use_colnames
: bool (默认: False)如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名而不是列索引。
-
max_len
: int (默认: None)给定所有最大项集的集合,返回长度小于
max_len
的项集。如果为None
(默认),则评估所有可能的项集长度。 -
verbose
: int (默认: 0)显示条件树生成的阶段。
返回值
一个 pandas DataFrame,包含 ['support', 'itemsets'] 列,其中是所有支持度 >= min_support
且长度 < max_len
(如果 max_len
不为 None) 的最大项集。'itemsets' 列中的每个项集类型为 frozenset
,这是一种 Python 内建类型,与集合类似,但它是不可变的(更多信息请参见 https://docs.pythonlang.cn/3.6/library/stdtypes.html#frozenset)。
示例
有关使用示例,请参见 https://mlxtend.cn/mlxtend/user_guide/frequent_patterns/fpmax/