You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python mlxtend的Apriori算法做关联分析仅返回列名无结果

问题原因
  • 参数传入错误:你通过TransactionEncoder完成独热编码得到了data_tr_encoded,但调用apriori()方法时依旧传入了未编码的原始宽表data_tr,mlxtend的apriori要求输入值为0/1或者True/False的布尔型/数值型独热矩阵,否则无法正确识别频繁项。
  • 数据格式问题:你处理得到的data_tr里的值是实际计数(比如消费次数、金额),不是0/1的布尔标记,apriori默认会把非1的值判定为未购买,就算你不做TransactionEncoder,也需要先把大于0的值统一转成1,否则会过滤掉大部分有效交易。
  • apriori参数缺失:mlxtend的apriori默认不会返回项集对应的名称,需要指定use_colnames=True参数,才会把列名替换为项集内容,否则只会返回项集的索引编号,看起来就像只有列名没有内容。
解决步骤
  1. 修正数据处理逻辑,不需要重复使用TransactionEncoder,你已经通过unstack把service_type转成列了,直接把大于0的数值转成1即可:
data = pd.read_csv(_link of the csv location_)
# 原宽表处理逻辑不变
data_tr = data.groupby(['transaction_id', 'service_type']).sum().unstack().reset_index().fillna(0).set_index('transaction_id').droplevel(0,1)
# 新增:把大于0的数值统一转成1,符合apriori的输入要求
data_tr = data_tr.applymap(lambda x: 1 if x >0 else 0)
  1. 修正apriori的调用参数,传入处理好的独热矩阵,添加use_colnames=True:
# 之前的TransactionEncoder相关代码可以删除,你已经完成了宽表转换
frequent_tr = apriori(data_tr, min_support=0.05, use_colnames=True)
print(frequent_tr)
  1. 如果调整后还是没有结果,可逐步调小min_support的阈值,比如先设为0.001,确认有结果后再根据业务需求上调阈值即可。

内容的提问来源于stack exchange,提问作者Azul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 22:09:04