文章目录
1 前言
1.1 FP-growth
FP-growth(Frequent Pattern Growth
)是一种用于在数据库中高效地发现频繁项集的算法。它采用了一种叫做FP树(Frequent Pattern Tree
)的树结构来压缩数据集,这棵树只记录了项集的频繁模式。然后,算法使用一种分而治之的策略,将大数据库分解为条件数据库(每个都是一棵FP树),并在这些较小的数据库上递归地发现频繁项集。这种方法大大减少了需要考虑的组合数量,并避免了Apriori
算法中的重复数据扫描,因此在处理大规模数据集时更加高效。
FP-growth
(频繁模式增长)算法是一种用于挖掘数据集中频繁项集的有效方法。
优点
- 效率高:相比于Apriori算法,FP-growth算法大大减少了数据库扫描的次数,因为它只需要对数据库进行两次扫描:一次用于创建项目表,一次用于构建FP树。
- 不产生候选集:FP-growth算法在挖掘过程中不生成候选项集,这与Apriori算法形成对比,后者在每一步都需要生成大量候选项集并对数据库进行扫描以计算它们的支持度。
- 压缩数据:FP树结构是对原始数据的压缩表示,保存了项集之间的关联信息,同时减少了内存的使用。
- 可扩展性:FP-growth算法可以扩展到非常大的数据集上,尤其是在处理稠密数据集时表现良好。
缺点
- 内存使用:虽然FP树是一种压缩数据的表示,但在处理非常大的数据集或高维度数据时,FP树可能会占用大量内存,尤其是当数据集非常稠密时。
- 构建FP树的成本:FP树的构建需要一定的时间和空间成本,尤其是在初始阶段,当数据集很大时,构建FP树的过程可能会比较耗时。
- 复杂性:FP-growth算法的实现比Apriori算法复杂,特别是FP树的构建和递归挖掘过程,这可能会增加算法实现的难度。
- 灵活性有限:虽然FP-growth算法在挖掘频繁项集方面非常高效,但对于某些特定类型的分析,如关联规则的生成,可能需要额外的步骤和处理。
1.2 FP-growth的应用
FP-growth算法在实际应用中有广泛的用途,主要用于挖掘频繁项集,以便于进一步分析数据中的模式和关联规则。以下是一些FP-growth算法的典型应用场景:
-
购物篮分析:在零售业中,可以使用FP-growth算法来分析顾客的购物篮,找出经常一起购买的商品。这有助于商家进行产品布局优化、销售策略制定、以及促销活动的设计。
-
推荐系统:在电商平台、在线视频服务或社交网络服务中,FP-growth算法可用于分析用户的行为模式,从而推荐用户可能感兴趣的商品、视频或内容,提升用户体验和满意度。
-
欺诈检测:在银行和金融行业,FP-growth算法可以用于分析交易模式,识别出异常交易行为,帮助检测和预防欺诈活动。
-
生物信息学:在基因数据分析中,FP-growth算法可用于识别常见的基因序列模式或疾病模式,有助于疾病预测和药物研发。
-
网络安全:通过分析网络流量和用户行为,FP-growth算法可以帮助识别出网络攻击的模式,如DDoS攻击或恶意软件的传播行为,从而提升网络安全防护能力。
-
制造业:在制造业中,FP-growth算法可以用于分析产品的故障模式和原因,帮助优化生产流程,提高产品质量和生产效率。
-
文本挖掘和自然语言处理:FP-growth算法可以应用于大规模文本数据,挖掘频繁出现的词汇组合或主题模式,用于文档分类、情感分析等场景。
3 实战演示
3.1 安装库
pip install pandas
pip install numpy
pip install plotly
pip install mlxtend
3.2 下载数据
数据下载链接:https://www.kaggle.com/datasets/devchauhan1/market-basket-optimisationcsv?resource=download
3.3 查看数据
import pandas as pd
dataset = pd.read_csv("Market_Basket_Optimisation.csv")
print(dataset.shape)
dataset.head()
数据集的每一行代表一次交易,每一列对应该交易中的一个商品。如果某个商品在交易中被购买,它会在该行对应的位置上显示商品名称;如果没有被购买,则该位置留空或有占位符。
3.4 数据预处理
# 转换Numpy数组类型
import numpy as np
transaction = []
for i in range(0, dataset.shape[0]):
for j in range(0, dataset.shape[1]):
transaction.append(dataset.values[i,j])
transaction = np.array(transaction)
print(transaction)
# 统计并可视化商品购买频次
import pandas as pd
df = pd.DataFrame(transaction, columns=["items"])
df["incident_count"] = 1
indexNames = df[df['items'] == "nan" ].index
df.drop(indexNames , inplace=True)
# 对商品名称进行分组,计算每种商品的购买总次数,取前5序号
df_table = df.groupby("items").sum().sort_values("incident_count", ascending=False).reset_index()
df_table.head(5).style.background_gradient(cmap='Greens')
# 可视化前50个
import plotly.express as px
df_table["all"] = "Top 50 items"
fig = px.treemap(df_table.head(50), path=['all', "items"], values='incident_count',
color=df_table["incident_count"].head(50), hover_data=['items'],
color_continuous_scale='Greens',
)
fig.show()
3.5 转换矩阵
# 将每笔交易转换为单独的列表,并将它们收集到Numpy数组中
transaction = []
for i in range(dataset.shape[0]):
transaction.append([str(dataset.values[i,j]) for j in range(dataset.shape[1])])
transaction = np.array(transaction)
from mlxtend.preprocessing import TransactionEncoder
# 初始化TransactionEncoder并将数据转换为布尔值
te = TransactionEncoder()
te_ary = te.fit(transaction).transform(transaction)
dataset = pd.DataFrame(te_ary, columns=te.columns_)
dataset.head()
3.6 挑前30个商品计算
first30 = df_table["items"].head(30).values
dataset = dataset.loc[:,first30]
print(dataset.shape)
# 运行FP-growth算法
from mlxtend.frequent_patterns import fpgrowth
res = fpgrowth(dataset, min_support=0.05, use_colnames=True)
res.head(10)
from mlxtend.frequent_patterns import association_rules
res = association_rules(res, metric="lift", min_threshold=1)
# 根据置信度对值进行排序
res.sort_values("confidence", ascending=False)
这是分析的一个关联规则结果,按照置信度排序(测试数据,仅作参考),当购买了“意大利面(spaghetti
)”时,顾客也有很大概率购买“矿泉水(mineral water
)”。
具体来说,这个规则的置信度是34.3032%,意味着大约三分之一购买意大利面的顾客也会购买矿泉水。提升度为1.439698,表示购买意大利面的顾客购买矿泉水的概率是没有购买意大利面的顾客的1.44倍。
4 讨论
这就是FP-growth
,玩的就是关联规则(有点像预测上下游调控PPI网络),这是一种用于高效挖掘大型数据库中频繁项集的算法。通过压缩数据集,减少了扫描次数,不生成候选项集,提高了计算效率。
此外还有传统的Apriori
,以及优秀同类ECLAT
,下期预告~
这个系列拖更好久了,夯实基础,往期的笔记: