我已经在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)
我开始更改格式并更新了每个用户的代码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)
答案 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'))