使用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参数,才会把列名替换为项集内容,否则只会返回项集的索引编号,看起来就像只有列名没有内容。
解决步骤
- 修正数据处理逻辑,不需要重复使用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)
- 修正apriori的调用参数,传入处理好的独热矩阵,添加
use_colnames=True:
# 之前的TransactionEncoder相关代码可以删除,你已经完成了宽表转换 frequent_tr = apriori(data_tr, min_support=0.05, use_colnames=True) print(frequent_tr)
- 如果调整后还是没有结果,可逐步调小min_support的阈值,比如先设为0.001,确认有结果后再根据业务需求上调阈值即可。
内容的提问来源于stack exchange,提问作者Azul
相关产品推荐
相关产品推荐

