如何在Python中实现FPGrowth算法?

时间:2018-07-25 22:56:36

标签: python apache-spark machine-learning pyspark

我已经在Python中成功使用了apriori算法,如下所示:

import pandas as pd
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules

df = pd.read_csv('C:\\Users\\marka\\Downloads\\Assig5.csv')
df = apriori(df, min_support=0.79, use_colnames=True)
rules = association_rules(df, metric="lift", min_threshold=1)
rules[ (rules['lift'] >= 1) &
       (rules['confidence'] >= 1) ]

我想使用FPGrowth算法来查看是否得到相同的结果,但是我相信使用错了,因为我没有得到相似的输出。 spark(https://spark.apache.org/docs/1.6.0/mllib-frequent-pattern-mining.html)的文档说:

from pyspark.mllib.fpm import FPGrowth
data = sc.textFile("data/mllib/sample_fpgrowth.txt")
transactions = data.map(lambda line: line.strip().split(' '))
model = FPGrowth.train(transactions, minSupport=0.2, numPartitions=10)
result = model.freqItemsets().collect()
for fi in result:
    print(fi)

所以我的代码又是:

from pyspark.mllib.fpm import FPGrowth
from pyspark import SparkConf
from pyspark.context import SparkContext
sc = SparkContext.getOrCreate(SparkConf().setMaster("local[*]"))
data = sc.textFile("C:\\Users\\marka\\Downloads\\Assig6.txt")
transactions = data.map(lambda line: line.strip().split(' '))
model = FPGrowth.train(transactions, minSupport=0.2, numPartitions=10)
result = model.freqItemsets().collect()
for fi in result:
    print(fi)

但是我得到的不是真实答案,而是我做错了什么?

FreqItemset(items=['1\t1\t1\t1\t1\t1\t1\t0\t0\t0\t0\t1\t1\t0\t0\t1\t1\t1\t1\t1\t0\t0'], freq=24)

要制作Assig6,我只是将原始的csv重新保存为txt enter image description here

我开始更改格式并更新了每个用户的代码10136092,但仍得到不希望的输出。这是我的代码,输出以及新输入的示例图片。

from pyspark.mllib.fpm import FPGrowth
from pyspark import SparkConf
from pyspark.context import SparkContext
sc = SparkContext.getOrCreate(SparkConf().setMaster("local[*]"))
data = sc.textFile("C:\\Users\\marka\\Downloads\\Assig2.txt")
data.map(lambda line: line.strip().split())
transactions = data.map(lambda line: line.strip().split(' '))
model = FPGrowth.train(transactions, minSupport=0.2, numPartitions=10)
result = model.freqItemsets().collect()
for fi in result:
    print(fi)

输出

FreqItemset(items=['Rock_salt\tFlashlights\tWater\tSnow_shovels\tBlankets\tCanned_food'], freq=34)

enter image description here

2 个答案:

答案 0 :(得分:1)

您的数据不是Spark FPGrowth算法的有效输入。

在Spark中,每个购物篮都应表示为唯一标签列表,例如:

baskets = sc.parallelize([("Rock Salt", "Blankets"), ("Blankets", "Dry Fruits", Canned Food")])

不是二进制矩阵,就像您使用的其他库一样。请先将您的数据转换为上述格式。

此外,数据之间的制表符之间没有空格,因此即使输入正确,您也应像

那样进行拆分
 data.map(lambda line: line.strip().split())

答案 1 :(得分:0)

我认为文件是制表符分隔的,因此您应使用'\t'而不是' '

transactions = data.map(lambda line: line.strip().split('\t'))